And*_*hin 46 .net c# constructor abstract-class
可能重复:
为什么我不能在抽象C#类上创建抽象构造函数?
为什么我不能像这样声明抽象类的构造函数:
public abstract class MyClass {
public abstract MyClass(int param);
}
Run Code Online (Sandbox Code Playgroud)
tva*_*son 72
构造函数仅适用于定义它们的类,即它们不是继承的.使用基类构造函数(您必须调用其中一个,即使只是自动调用默认值),但不会通过派生类重写.您可以在抽象基类上定义构造函数 - 它不能直接使用,但可以通过派生类来调用.你不能做的是强制派生类来实现特定的构造函数签名.
为定义所有派生类的一些通用设置代码,定义一个通常为受保护的构造函数是完全合理的.或许,当抽象类提供依赖于此设置的其他默认行为时,尤其如此.例如:
public abstract class Foo
{
public string Name { get; private set; }
protected Foo( string name )
{
this.Name = name;
}
}
public class Bar : Foo
{
public Bar() : base("bar")
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
Zac*_*son 12
你不能声明它abstract
,但你可以在你的抽象类上有一个构造函数; 只需删除单词abstract
并为其提供正文.
构造函数更接近静态方法而不是"常规"方法.与静态方法一样,它们可以重载,但不能覆盖.也就是说,它们不是继承的,但可以重新定义.
public BaseClass
{
public BaseClass( String s ) { ... }
public static void doIt ( String s ) { ... }
}
public SubClass extends BaseClass
{
public SubClass( String s ) { ... }
public static void doIt ( String s ) { ... }
}
public SubClass2 extends BaseClass
{
}
new SubClass( "hello" );
SubClass.doIt( "hello" );
new SubClass2( "hello" ); // NOK
SubClass2.doIt( "hello" ); // NOK
Run Code Online (Sandbox Code Playgroud)
从不动态地(虚拟地)调度构造函数和静态方法- 您总是知道实例化的具体类型或静态方法的具体类.这就是为什么抽象构造函数和抽象静态方法没有意义.这就是为什么你也不能在接口中指定构造函数和静态方法.
您甚至可以将构造函数视为静态工厂方法(并查看相应的模式):
MyClass obj = new MyClass(); // the way it is
MyClass obj = MyClass.new(); // think of it like this
Run Code Online (Sandbox Code Playgroud)
我看到定义抽象构造函数或抽象静态方法的唯一情况是使用反射.在这种情况下,您可以确保所有子类都重新定义相应的静态方法或构造函数.但反思是另一个话题......
注意:在诸如Smalltalk之类的语言中,类是常规对象,您可以覆盖静态方法并具有抽象构造函数.但它不适用于Java,因为类不是"常规"对象,即使你可以用反射来获取它们.
摘要暗示虚拟.永远不能以多态方式调用非默认构造函数,因此构造函数不允许使用virtual和abstract.
如果在未来版本的C#中,泛型被增强以允许通过泛型类型参数调用非默认构造函数,则可以对构造函数进行多态调用,并且还可以添加虚拟和抽象构造函数.