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

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)

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

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

在派生类中,如果未使用base关键字显式调用基类构造函数,则会隐式调用默认构造函数(如果有).

  • 让@ macio.Jun的注释更加明确:如果非静态构造函数重载(在`class`中)既不包含`:base(...)`也不包含`:this(...)`,那么调用暗示了零参数基类构造函数.因此,如果没有明确提到链接,那就像编写`:base()`一样.另外,如果没有为非静态`class`编写非静态构造函数,编译器将生成一个空的零参数构造函数,它链接`:base()`. (4认同)
  • public DerivedClass():base(){},冗余基础构造函数调用 (2认同)

Jon*_*eet 45

必须重新声明构造函数,因为他们不能有效继承.如果你认为构造函数在某些方面有点像静态方法,那么这是有道理的.

特别是,您不希望所有构造函数都被自动继承 - 毕竟,这意味着每个类都有一个无参数构造函数,就像object它本身一样.

如果你只想调用基类构造函数,则不需要在构造函数体中编写任何代码 - 只需按照Waleed的帖子将参数传递给基类.

如果您的基类开始需要更多信息,那么您自然应该更改所有派生类 - 实际上是调用这些类的构造函数 - 因为它们必须提供信息.我知道它看起来像是一种痛苦,但它只是构造函数的自然结果.


jas*_*fer 5

我遇到了同样的问题,我通过用如下的工厂方法替换构造函数来解决了这个问题:

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);