我可以inheritance构造函数吗?

我知道在C#中inheritance构造函数是不可能的,但是可能有办法做我想做的事情。

我有一个由许多其他类inheritance的基类,它有一个Init方法,它使用1个参数进行一些初始化。 所有其他inheritance类也需要这个初始化,但我需要为所有这些创建单独的构造函数,如下所示:

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

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

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

 public class Base { public Base(Parameter p) { Init(p) } Init(Parameter p) { // common initialisation code } } public class Derived : Base { public Derived(Parameter p) : base(p) { } } 

将init函数更改为它是基类的构造函数,然后从inheritance的对象中调用它,如下所示:

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

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

不重复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. } } 

您不能inheritance构造函数,但可以从派生子代的构造函数中调用它们。 如果使基类默认构造函数为private,则每次创建派生类时都会强制您选择基本构造函数。

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

像这样的东西?

 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 }