Подтвердить что ты не робот

Могу ли я наследовать конструкторы?

Я знаю, что невозможно наследовать конструкторы в С#, но, вероятно, есть способ сделать то, что я хочу сделать.

У меня есть базовый класс, который наследуется многими другими классами и имеет метод Init, который выполняет некоторую инициализацию, беря 1 параметр. Все остальные наследующие классы также нуждаются в этой инициализации, но мне нужно будет создать отдельные конструкторы для всех из них, которые хотели бы это сделать:

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

Это полностью нарушает принципы СУХОЙ! Как я могу инициализировать все необходимые вещи без создания десятков конструкторов?

4b9b3361

Ответ 1

Вам не нужно создавать множество конструкторов, все с одним и тем же кодом; вы создаете только один, но производные классы вызывают базовый конструктор:

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

    }
}

Ответ 2

Измените функцию init на конструктор базового класса, а затем вызовите его из унаследованных объектов следующим образом:

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

Базовый конструктор будет вызван до того, как будет запущен любой код в самом конструкторе.

Ответ 3

Единственный способ не повторять вызов 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.
   }
}

Ответ 4

Вы не можете наследовать конструкторы, но можете вызывать их из своих дочерних конструкторов. Если вы создадите собственный конструктор по умолчанию для базовых классов, он заставит вас выбирать базовый конструктор каждый раз при создании производного класса.

class A
{
    protected A(int x)
    {

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

    }
}

Ответ 5

Что-то вроде этого?

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 }