繁体   English   中英

C# - 让所有派生类都调用基类构造函数

[英]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
}

您可以在以下页面中找到有关构造函数的更多信息:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

在派生类中,如果没有使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM