![](/img/trans.png)
[英]C# null base-class constructor for XML Serialisation … that derived classes cannot call?
[英]C# - Making all derived classes call the base class constructor
我有一个基类 Character,它有几个派生自它的类。 基类具有各种字段和方法。
我的所有派生类都使用相同的基类构造函数,但是如果我不在派生类中重新定义构造函数,则会出现错误:
错误:类“子类”不包含采用此数量参数的构造函数
我不想在每个派生类中重新定义构造函数,因为如果构造函数发生变化,我必须在每个类中更改它,请原谅任何误解,这与只编写一次代码的想法背道而驰?
您可以使用以下语法从派生自它的类调用基类构造函数:
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
关键字显式调用基类构造函数,则默认构造函数(如果有)将被隐式调用。
你必须重新声明构造函数,因为他们不能有效继承。 如果您认为构造函数在某些方面有点像静态方法,这是有道理的。
特别是,您不希望所有构造函数都被自动继承——毕竟,这意味着每个类都会有一个无参数的构造函数,就像object
本身一样。
但是,如果您只想调用基类构造函数,则不需要在构造函数的主体中编写任何代码 - 只需按照 Waleed 的帖子将参数传递给基类即可。
如果您的基类开始需要更多信息,那么您很自然地应该更改所有派生类——实际上是任何调用这些类的构造函数的东西——因为它们必须提供信息。 我知道这看起来很痛苦,但这只是构造函数所做的自然结果。
我遇到了同样的问题,我通过用这样的工厂方法替换我的构造函数来解决它:
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);
一种替代方法可能是依赖依赖注入容器来初始化您的对象,这样对基类的引用(可能是对基构造函数或其他初始化方法的调用)将“外部化”到 DI 容器。
我不知道这对你的情况是否有意义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.