我有一个类似下面的课程
public abstract class ABC
{
int _a;
public ABC(int a)
{
_a = a;
}
public abstract void computeA();
};
派生类是否必须为base / abstract类构造函数提供参数?有没有办法在不提供参数的情况下初始化派生类?
提前致谢,
约翰
答案 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个参数的公共构造函数,所以编译器会删除基本的空构造函数。
因此,如果要创建该类的实例,则必须传递参数。
当您从这样的类派生时,必须将参数传递给它的构造的基类。