Tom*_*Tom 46 c# inheritance constructor
我有一个基类字符,它有几个派生自它的类.基类有各种字段和方法.
我的所有派生类都使用相同的基类构造函数,但如果我不在我的派生类中重新定义构造函数,我会得到错误:
错误:类"子类"不包含使用此数量的参数的构造函数
我不想在每个派生类中重新定义构造函数,因为如果构造函数更改,我必须在每个类中更改它,原谅任何误解,违背只编写一次代码的想法?
Wal*_*shi 73
您可以使用以下语法从派生自它的类中调用基类构造函数:
public DerivedClass() : base() {
// Do additional work here otherwise you can leave it empty
}
Run Code Online (Sandbox Code Playgroud)
这将首先调用基础构造函数,然后它将在此派生构造函数中执行任何其他语句(如果有).
请注意,如果基础构造函数接受参数,则可以执行以下操作:
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
}
Run Code Online (Sandbox Code Playgroud)
您可以在以下页面中找到有关构造函数的更多信息:
在派生类中,如果未使用
base关键字显式调用基类构造函数,则会隐式调用默认构造函数(如果有).
Jon*_*eet 45
你也必须重新声明构造函数,因为他们不能有效继承.如果你认为构造函数在某些方面有点像静态方法,那么这是有道理的.
特别是,您不希望所有构造函数都被自动继承 - 毕竟,这意味着每个类都有一个无参数构造函数,就像object它本身一样.
如果你只想调用基类构造函数,则不需要在构造函数体中编写任何代码 - 只需按照Waleed的帖子将参数传递给基类.
如果您的基类开始需要更多信息,那么您自然应该更改所有派生类 - 实际上是调用这些类的构造函数 - 因为它们必须提供信息.我知道它看起来像是一种痛苦,但它只是构造函数的自然结果.
我遇到了同样的问题,我通过用如下的工厂方法替换构造函数来解决了这个问题:
A是父类。
public static T getChild<T>(int number) where T:A, new()
{
T child = new T();
T._number = number;
return child;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用创建一个子类
Child b = A.getChild<Child>(2);