Как наследовать конструкторы? - PullRequest
181 голосов
/ 21 октября 2008

Представьте себе базовый класс с множеством конструкторов и виртуальным методом

public class Foo
{
   ...
   public Foo() {...}
   public Foo(int i) {...}
   ...
   public virtual void SomethingElse() {...}
   ...
}

и теперь я хочу создать класс-потомок, который переопределяет виртуальный метод:

public class Bar : Foo 
{
   public override void SomethingElse() {...}
}

И еще один потомок, который делает еще кое-что:

public class Bah : Bar
{
   public void DoMoreStuff() {...}
}

Действительно ли мне нужно копировать все конструкторы из Foo в Bar и Bah? И потом, если я изменю сигнатуру конструктора в Foo, нужно ли мне обновлять ее в Bar и Bah?

Нет ли способа наследовать конструкторы? Нет ли способа поощрить повторное использование кода?

Ответы [ 14 ]

3 голосов
/ 21 октября 2008

Проблема не в том, что Бар и Бах должны копировать 387 конструкторов, а в том, что у Foo 387 конструкторов. Foo явно делает слишком много вещей - рефакторинг быстро! Кроме того, если у вас нет действительно веской причины для установки значений в конструкторе (что, если вы предоставляете конструктор без параметров, вы, вероятно, этого не сделаете), я бы рекомендовал использовать свойство get / setting.

2 голосов
/ 21 октября 2008

Нет, вам не нужно копировать все 387 конструкторов в Bar и Bah. Bar и Bah могут иметь столько конструкторов, сколько вам нужно, независимо от того, сколько вы определяете в Foo. Например, вы можете выбрать только один конструктор Bar, который создает Foo с помощью 212-го конструктора Foo.

Да, любые конструкторы, которых вы изменяете в Foo, от которых зависят Bar или Bah, потребуют от вас соответственно изменить Bar и Bah.

Нет, в .NET нет способа наследовать конструкторы. Но вы можете добиться повторного использования кода, вызвав конструктор базового класса внутри конструктора подкласса или вызвав определенный вами виртуальный метод (например, Initialize ()).

1 голос
/ 21 октября 2008

Возможно, вы сможете адаптировать версию виртуального конструктора C ++ идиома . Насколько я знаю, C # не поддерживает ковариантные типы возврата. Я считаю, что это в списках пожеланий многих людей.

0 голосов
/ 21 октября 2008

Слишком много конструкторов - признак сломанного дизайна. Лучше класс с несколькими конструкторами и возможностью устанавливать свойства. Если вам действительно нужен контроль над свойствами, рассмотрите фабрику в том же пространстве имен и сделайте установщики свойств внутренними. Пусть фабрика решит, как создать экземпляр класса и установить его свойства. У фабрики могут быть методы, которые принимают столько параметров, сколько необходимо для правильной настройки объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...