参数化抽象类构造函数

时间:2011-05-25 11:51:50

标签: c# constructor abstract-class

我有一个类似下面的课程

public abstract class ABC
{

int _a;

  public ABC(int a)
  {
    _a = a;

   }

public abstract void computeA();

};

派生类是否必须为base / abstract类构造函数提供参数?有没有办法在不提供参数的情况下初始化派生类?

提前致谢,

约翰

4 个答案:

答案 0 :(得分:13)

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

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

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

因此,您不一定需要将任何信息传递给派生类构造函数,但派生类构造函数必须将信息传递给基类构造函数,如果它只公开参数化构造函数。< / p>

(请注意,实际代码Foo也必须覆盖computeA(),但这与问题的构造函数部分无关,所以我将其从示例中删除。)

答案 1 :(得分:3)

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

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. 
  }
}

答案 2 :(得分:1)

向基类添加默认构造函数,并调用另一个构造函数,为其参数提供初始值:

public abstract class ABC
{
    int _a;  
    public ABC(int a)  
    {    
         _a = a;   
    }

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

答案 3 :(得分:0)

它与基类是抽象的事实没什么关系。

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

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

当您从这样的类派生时,必须将参数传递给它的构造的基类。