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

C#-使所有派生类调用基类构造函数,c#,inheritance,constructor,C#,Inheritance,Constructor,我有一个基类字符,它有几个派生自它的类。基类具有各种字段和方法 我的所有派生类都使用相同的基类构造函数,但如果我不在派生类中重新定义构造函数,则会出现错误: 错误:类“子类”不包含接受此数量参数的构造函数 我不想在每个派生类中重新定义构造函数,因为如果构造函数发生更改,我必须在每个单独的类中更改它,请原谅任何误解,这与只编写一次代码的想法背道而驰?您可以使用以下语法从派生的类调用基类构造函数: public DerivedClass() : base() { // Do addition

我有一个基类字符,它有几个派生自它的类。基类具有各种字段和方法

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

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


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

您可以使用以下语法从派生的类调用基类构造函数:

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
关键字显式调用基类构造函数,则默认构造函数(如果有)将被隐式调用

您必须重新声明构造函数,因为它们实际上不是继承的。如果您认为构造函数在某些方面有点像静态方法,那么它是有意义的

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

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


如果您的基类开始需要更多的信息,那么很自然,您必须更改所有派生类,以及调用这些类的构造函数的任何内容,因为它们必须提供信息。我知道这看起来很痛苦,但这只是构造函数所做工作的自然结果。

一种替代方法可以是依赖依赖依赖项注入容器来初始化对象,这样对基类的引用(可能是对基类构造函数或另一个初始值设定方法的调用)将“外部化”到DI容器


我不知道这对您的案例是否有意义

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

A是父类

public static T getChild<T>(int number) where T:A, new()
{
    T child = new T();
    T._number = number;
    return child;

}
public static T getChild(int number),其中T:A,new()
{
T child=新的T();
T.(u编号=编号;
返回儿童;
}
可以使用创建子类

Child b=A.getChild(2)


您在构造函数中做什么类型的工作?一般来说,在构造函数中除了实例化成员外,不应该做任何工作。是的,只是实例化成员。基类包含所有派生类都使用的5个字段,所以我只是将它们作为构造函数参数传递并设置基类字段。有点相关,但不是重复:@user491704很高兴成为servicepublic DerivedClass():base(){},冗余基类构造函数调用使@macio.Jun的评论更加明确:如果非静态构造函数重载(在
类中)既不包含
:base(…)
也不包含
:this(…)
,则暗示调用零参数基类构造函数。因此,如果没有明确提到链接,这与编写
:base()
相同。此外,如果没有为非静态
类编写非静态构造函数,编译器将生成一个空的零参数构造函数,该构造函数链接
:base()
。为什么这不是这个问题的答案?它在每个子类中替换一个空构造函数
public Child(int number):base(number){}
。我恭敬地收回我的第一句话。啊,好吧,你说得对。听起来确实如此。谢谢你的评论。@HashemQolami:你必须仔细阅读“我有同样的问题”的答案,看看它们是否也提供了解决方案。