C#中的抽象构造函数

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)

  • 你没有错,但我澄清了一件事:构造函数不是继承的,而是*被孩子们调用.你唯一的选择是*哪个*构造函数链接到你的. (6认同)
  • 我已更新并澄清。 (2认同)

Zac*_*son 12

你不能声明它abstract,但你可以在你的抽象类上有一个构造函数; 只需删除单词abstract并为其提供正文.

  • ......并为它提供一个身体. (16认同)
  • 将抽象类中的构造函数声明为**protected**也是一种很好的做法.它强制执行无法直接实例化类的事实. (4认同)

ewe*_*nli 7

构造函数更接近静态方法而不是"常规"方法.与静态方法一样,它们可以重载,但不能覆盖.也就是说,它们不是继承的,但可以重新定义.

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,因为类不是"常规"对象,即使你可以用反射来获取它们.


Ben*_*igt 6

摘要暗示虚拟.永远不能以多态方式调用非默认构造函数,因此构造函数不允许使用virtual和abstract.

如果在未来版本的C#中,泛型被增强以允许通过泛型类型参数调用非默认构造函数,则可以对构造函数进行多态调用,并且还可以添加虚拟和抽象构造函数.

  • 在泛型方法中调用非默认构造函数仍然不是多态调用,因为该类型是事先已知的.永远不能将构造函数称为多态,句点. (2认同)