参数化抽象类构造函数

4
我有一个如下的类:
public abstract class ABC
{
    int _a;
    public ABC(int a)
    {
        _a = a;
    }
    public abstract void computeA();
};

派生类必须提供基类/抽象类构造函数的参数吗?有没有方法可以在不提供参数的情况下初始化派生类?
提前感谢。
4个回答

21

是的,你必须向基类构造函数提供参数。

当然,派生类可以有一个无参数的构造函数 - 它可以以任何想要的方式调用基类构造函数。例如:

public class Foo : ABC
{
    // Always pass 123 to the base class constructor
    public Foo() : base(123)
    {
    }
}

因此,您不一定需要向派生类构造函数传递任何信息,但是如果基类构造函数只公开带参数的构造函数,则派生类构造函数必须向其传递信息。

(请注意,在实际代码中,Foo还必须覆盖computeA(),但这与问题的构造函数部分无关,因此我将其从示例中省略。)


3
该怎么翻译呢?"Damn... Beat me too it... And 123 does seem to be a popular default value. :-)"该死...你比我先发了...而且123似乎是一个受欢迎的默认值。 :-) - Colin Mackay

4

您可以在派生类中创建一个默认构造函数,该函数不需要参数,而派生类将提供默认值,但您无法完全删除此要求。拥有某种值是基类的强制条件。

public MyDerivedClass : ABC
{
  public MyDerivedClass()
    : base(123) // hard wired default value for the base class
  {
    // Other things the constructor needs to do.
  }

  public override void computeA()
  {
    // Concrete definition for this method. 
  }
}

1
+1 包括覆盖 - 这是其他人省略的 ;) - Marijn
@Marijn:我只是基于它与构造函数调用无关的理由而省略了它,仅此而已 :) - Jon Skeet
@Marijn:我会编辑我的答案并添加解释,而不是代码。 - Jon Skeet
@Jon Skeet:我绝对不会要求您更改您的(伪代码):-) - Marijn
@Marijn:我希望你会这样做,如果它是错误的——这比人们想象的更经常发生 :) - Jon Skeet
显示剩余2条评论

1
在基类中添加默认构造函数,并调用另一个构造函数为其参数提供初始值:
public abstract class ABC
{
    int _a;  
    public ABC(int a)  
    {    
         _a = a;   
    }

    public ABC() : this(0) {}    
}

这不应该是 public ABC() : this(0) {} 吗? - LukeH
是的,这是不正确的。如果你想要链接构造函数,那么你需要使用 public ABC() : this(0) {} 语法;你不能从另一个构造函数的主体内部链接到构造函数。 - LukeH

0

这与基类是抽象的事实没有太大关系。

因为您声明了一个具有1个参数的公共构造函数,编译器会删除基本的空构造函数。

因此,如果要创建该类的实例,则必须传递参数。

当您从这样的类派生时,必须向基类传递参数以进行构造。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接