我能继承构造函数吗?

我知道在 C # 中继承构造函数是不可能的,但是可能有一种方法可以做我想做的事情。

我有一个被许多其他类继承的基类,并且它有一个 Init方法,该方法采用1参数进行一些初始化。所有其他继承类也需要进行初始化,但是我需要为所有类创建单独的构造函数,如下所示:

public Constructor(Parameter p) {
base.Init(p);
}

这完全违反了 DRY 原则! 如何在不创建几十个构造函数的情况下初始化所有必需的东西?

98943 次浏览

更改 init 函数,使其成为基类的构造函数,然后从继承的对象调用它,如下所示:

public InheritedObject(Parameter p) : base(p)
{
}

基本构造函数将在构造函数本身运行任何代码之前被调用。

您不需要创建大量的构造函数,所有的构造函数都使用相同的代码; 您只需创建一个构造函数,但让派生类调用基构造函数:

public class Base
{
public Base(Parameter p)
{
Init(p)
}


void Init(Parameter p)
{
// common initialisation code
}
}


public class Derived : Base
{
public Derived(Parameter p) : base(p)
{
 

}
}

像这样吗?

public Constructor(Parameter p) : base(p) {


}

还有基础类:

public Base(Parameter p)
{
Init(p);
}

您甚至可以将 Init方法标记为虚方法,这样,如果需要的话,您可以在其他类中进行一些漂亮的重写!;)

public virtual void Init() { }

还有其他课程:

public override void Init() { base.Init(); //Do other stuff }

不重复 base.Init调用的唯一方法是调用基本构造函数

class Base
{
public Base(Parameter p)
{
this.Init(p)
}


private void Init(Parameter p)
{
...
}
}


class Inherited : Base
{
public Inherited(Parameter p)
: base(p)
{
// other constructor logic, but Init is already called.
}
}

您不能继承构造函数,但可以从派生子构造函数中调用它们。如果将基类设置为缺省构造函数私有,那么每次创建派生类时,它都会强制您选择一个基构造函数。

class A
{
protected A(int x)
{


}
}
class B : A
{
B(int x)
: base(x)
{


}
}

基类中的方法在派生类中自动可用。我们所需要的只是将它们描述为受保护的或公共的。它们的签名不需要在派生类中重复。

如果基类不希望它们可用,它们将被标记为 private。

由于构造函数没有这种选择,这看起来是 C # 语言的一个缺陷。也许语言设计者无法解决。