C# 类System.Dynamic.DynamicObject。。为什么不抽象?
浏览该类时,我发现它是一个具体的(不是抽象的)类,但通过使其默认构造函数受保护来阻止直接创建它的实例 那么,不使用C# 类System.Dynamic.DynamicObject。。为什么不抽象?,c#,.net,C#,.net,浏览该类时,我发现它是一个具体的(不是抽象的)类,但通过使其默认构造函数受保护来阻止直接创建它的实例 那么,不使用public构造函数将其抽象化有什么意义呢 澄清: class Base1 { protected Base1() // protected constructor, concrete class { } } class Derived1 : Base1 { public Derived1() : base() { } } abstr
public
构造函数将其抽象化有什么意义呢
澄清:
class Base1
{
protected Base1() // protected constructor, concrete class
{
}
}
class Derived1 : Base1
{
public Derived1() : base()
{
}
}
abstract class Base2
{
public Base2() // public constructor, abstract class
{
}
}
class Derived2 : Base2
{
public Derived2() : base()
{
}
}
有一条评论解释了这一点
/// <summary>
/// Enables derived types to initialize a new instance of the <see cref="T:System.Dynamic.DynamicObject"/> type.
/// </summary>
[__DynamicallyInvokable]
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
protected DynamicObject()
{
}
//
///使派生类型能够初始化该类型的新实例。
///
[[uuuu动态调用可禁用]
[TargetedPatchingOptOut(“性能对于跨NGen映像边界内联这种类型的方法至关重要”)]
受保护的DynamicObject()
{
}
它用于在某处创建具有受保护构造函数的类型为
System.Dynamic.DynamicObject
的对象这是可能的:
public class MyClass
{
protected MyClass() { }
public static MyClass GetInstance()
{
return new MyClass();
}
}
public class MyDerivedClass : MyClass
{
}
public static void Main()
{
var myInstance = MyClass.GetInstance();
var myDerivedInstance = new MyDerivedClass();
var constructor = typeof(MyClass).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,
null,
Type.EmptyTypes,
null);
var instanceFromReflection = (MyClass) constructor.Invoke();
}
抽象的
MyClass
既不能通过MyClass.GetInstance()
(编译器错误在返回新的MyClass();
)实例化,也不能通过反射类型实例化(运行时错误System.MemberAccessException:无法创建MyClass的实例,因为它是一个抽象类。
)这是一个好问题。我希望有人能尽快回答这个问题,因为我自己也很想知道!首先,我想告诉你,可能是因为只有孩子才有权访问具体的对象,但是抽象类应该执行trickWell,它没有任何抽象方法。只需使用abstract
关键字即可启用抽象方法,因此,也许他们只是简单地在带有抽象方法的抽象类上使用abstract
?C完全允许您声明abstract
类,而不使用任何abstract
memberkeywordabstract
来限制对构造函数的访问,我想这是重点。类不是抽象的,但作者决定限制访问起初我认为“这太愚蠢了,显然你可以这么做”,但这实际上可能就是原因——如果你需要在某个地方传递一个DynamicObject
,但实际上不需要任何实现(例如,某种null-DynamicObject
)。省去了创建一个不必要的类NullDynamicObject:DynamicObject{}
@Luaan的麻烦。我认为如果你的评论是一个答案,那么它应该是好的@丹尼尔:你的回答只是问题本身,没有添加任何有价值的信息。@或者我不同意。有一个问题是关于阻止直接创建,而不是从派生类创建,如果你把类抽象化,你就不能再这样做了。我不明白?如果我有一个带有public
构造函数的abstract类
(或者即使没有声明构造函数,也只是让它使用默认构造函数),我也可以这样做。(也就是说,我不能直接创建)没有什么新内容,它是在评论中与@sailator讨论的。当然,但评论中的讨论没有答案,尤其是如果评论被折叠。。。