Да, необходимо будет реализовать конструкторов, которые имеют смысл для каждой деривации и затем используют base
ключевое слово, чтобы предписать что конструктор к соответствующему базовому классу или this
ключевое слово для направления конструктора к другому конструктору в том же классе.
, Если бы компилятор сделал предположения о наследовавшихся конструкторах, мы не были бы в состоянии правильно определить, как инстанцировали наши объекты. В большей части необходимо рассмотреть, почему Вы имеете столько конструкторов и рассматриваете сокращение их к только одному или два в базовом классе. Производные классы могут тогда кашировать некоторых из них использующий постоянные величины как null
и только представить необходимые через их конструкторов.
В C#4 Вы могли определить значения параметров по умолчанию и использовать названные параметры, чтобы заставить единственного конструктора поддерживать несколько конфигураций аргумента вместо того, чтобы иметь одного конструктора на конфигурацию.
Слишком много конструкторов являются знаком поврежденного дизайна. Лучше класс с немногими конструкторами и способностью установить свойства. Если Вы действительно нуждаетесь в управлении свойствами, рассматриваете фабрику в том же пространстве имен и делаете методы set свойства внутренними. Позвольте фабрике решить, как инстанцировать класса и установить его свойства. Фабрика может иметь методы, которые берут столько же параметров по мере необходимости для конфигурирования объекта правильно.
Можно быть в состоянии адаптировать версию C++ виртуальная идиома конструктора . Насколько я знаю, C# не поддерживает ковариантные типы возврата. Я полагаю, что это находится в списках пожеланий многих народов.
Нет, Вы не должны копировать все 387 конструкторов в Панель и Вот еще. Панель и Вот еще может иметь столько или так мало конструкторов Вы хотите независимый от того, сколько Вы определяете на Foo. Например, Вы могли принять решение иметь всего одного конструктора Bar, который создает Foo с 212-м конструктором Foo.
Да, любые конструкторы Вы изменяетесь в Foo, от которого Вот еще зависит Панель или, потребует, чтобы Вы изменили Панель и Вот еще соответственно.
нет, нет никакого пути в.NET для наследования конструкторов. Но можно достигнуть повторного использования кода путем вызова конструктора базового класса в конструкторе подкласса или путем вызова виртуального метода, который Вы определяете (как, Инициализируют ()).
Не забывайте, что можно также перенаправить конструкторов другим конструкторам на том же уровне наследования:
public Bar(int i, int j) : this(i) { ... }
^^^^^
Проблема не состоит в том, что Панель и Вот еще должна скопировать 387 конструкторов, проблема состоит в том, что у Foo есть 387 конструкторов. Foo ясно делает слишком много вещей - осуществляют рефакторинг быстрый! Кроме того, если у Вас нет действительно серьезного основания иметь набор значений в конструкторе (который при обеспечении конструктора без параметров Вы, вероятно, не делаете), я рекомендовал бы использовать свойство, getting/setting.
Да, необходимо скопировать все 387 конструкторов. Можно сделать некоторое повторное использование путем перенаправления их:
public Bar(int i): base(i) {}
public Bar(int i, int j) : base(i, j) {}
, но это является лучшим, можно сделать.
387 конструкторов?? Это - Ваша основная проблема. Как насчет этого вместо этого?
public Foo(params int[] list) {...}
Как Foo
класс, разве Вы не можете создать виртуальный перегруженный Initialise()
методы? Тогда они были бы доступны подклассам и все еще расширяемы?
public class Foo
{
...
public Foo() {...}
public virtual void Initialise(int i) {...}
public virtual void Initialise(int i, int i) {...}
public virtual void Initialise(int i, int i, int i) {...}
...
public virtual void Initialise(int i, int i, ..., int i) {...}
...
public virtual void SomethingElse() {...}
...
}
Этому нельзя стоить более высокой производительности, если у Вас нет большого количества значений свойств по умолчанию, и Вы поражаете ее много.
Жаль, что мы вынуждены сказать компилятору очевидное:
Subclass(): base() {}
Subclass(int x): base(x) {}
Subclass(int x,y): base(x,y) {}
Мне нужно сделать только 3 конструкторы в 12 подклассах, так что нет ничего сложного, но я не слишком люблю повторять это на каждом подклассе, после того как привык не писать его так долго. Я уверен, что для этого есть веская причина, но я не думаю, что когда-либо сталкивался с проблемой, требующей такого рода ограничений.