我可以继承构造函数吗?

Ale*_*lex 48 c# dry

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

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

public Constructor(Parameter p) {
    base.Init(p);
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ine 84

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望C#有类似C++的继承构造函数,调用所有基础构造函数仍然很烦人 (13认同)
  • 构造函数的持续双重处理非常烦人......所以我去谷歌搜索原因。阅读这里的讨论后,我对此感到不那么沮丧。他们没有这样做有一些很好的理由。https://social.msdn.microsoft.com/forums/en-US/6c860066-9dd5-4689-acc9-b8d0b4c98e00/why-c-constructors-cannot-be-inherited (4认同)

AHM*_*AHM 11

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

public InheritedObject(Parameter p) : base(p)
{
}
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*iec 7

不重复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.
   }
}
Run Code Online (Sandbox Code Playgroud)


rer*_*run 5

您不能继承构造函数,但可以从派生子级的构造函数中调用它们。如果将基类默认构造函数设置为私有,它将强制您在每次创建派生类时选择基构造函数。

class A
{
    protected A(int x)
    {

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

    }
}
Run Code Online (Sandbox Code Playgroud)