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

时间:2010-11-28 13:09:22

标签: c# inheritance constructor

我有一个基类Character,它有几个派生自它的类。基类有各种领域和方法。

我的所有派生类都使用相同的基类构造函数,但如果我不在我的派生类中重新定义构造函数,则会收到错误:

错误:类“子类”不包含使用此数量参数的构造函数

我不想在每个派生类中重新定义构造函数,因为如果构造函数发生更改,我必须在每个类中更改它,原谅任何误解,违背只编写代码一次的想法?

4 个答案:

答案 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
}

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

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

  

在派生类中,如果未使用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容器。

我不知道你的案件是否合理