我有一个基类Character,它有几个派生自它的类。基类有各种领域和方法。
我的所有派生类都使用相同的基类构造函数,但如果我不在我的派生类中重新定义构造函数,则会收到错误:
错误:类“子类”不包含使用此数量参数的构造函数
我不想在每个派生类中重新定义构造函数,因为如果构造函数发生更改,我必须在每个类中更改它,原谅任何误解,违背只编写代码一次的想法?
答案 0 :(得分:69)
您可以使用以下语法从派生自它的类中调用基类构造函数:
public DerivedClass() : base() {
// Do additional work here otherwise you can leave it empty
}
这将首先调用基础构造函数,然后它将在此派生构造函数中执行任何其他语句(如果有)。
请注意,如果基础构造函数接受参数,则可以执行以下操作:
public DerivedClass(int parameter1, string parameter2)
: base(parameter1, parameter2) {
// DerivedClass parameter types have to match base class types
// Do additional work here otherwise you can leave it empty
}
您可以在以下页面中找到有关构造函数的更多信息:
在派生类中,如果未使用
base
关键字显式调用基类构造函数,则会隐式调用默认构造函数(如果有)。
答案 1 :(得分:44)
你做必须重新声明构造函数,因为它们实际上没有被继承。如果你认为构造函数在某些方面有点像静态方法,那就有意义了。
特别是,你不会想要所有构造函数都被自动继承 - 毕竟,这意味着每个类都有一个无参数构造函数,如{{ 1}}本身就是。
如果你只是想调用基类构造函数,你不需要在构造函数体中编写任何代码 - 只需按照Waleed的帖子将参数传递给基类。
如果您的基类开始需要更多信息,那么您自然应该更改所有派生类 - 实际上是调用这些类的构造函数的任何内容 - 因为它们必须提供信息。我知道它看起来像是一种痛苦,但它只是构造函数的自然结果。
答案 2 :(得分:4)
我遇到了同样的问题,我通过用这样的工厂方法替换我的构造函数来解决它:
A是父类。
public static T getChild<T>(int number) where T:A, new()
{
T child = new T();
T._number = number;
return child;
}
您可以使用
创建一个Child类
Child b = A.getChild<Child>(2);
答案 3 :(得分:1)
一种替代方法可能是依赖于依赖注入容器来初始化对象,这样对基类的引用(可能是对基本构造函数或其他初始化方法的调用)将“外化”到DI容器。
我不知道你的案件是否合理