Как наследовать конструкторов?

181
задан Machavity 2 November 2018 в 02:16
поделиться

10 ответов

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

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

Обновление

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

122
ответ дан Jeff Yates 23 November 2019 в 06:09
поделиться

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

0
ответ дан tvanfosson 23 November 2019 в 06:09
поделиться

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

1
ответ дан Greg D 23 November 2019 в 06:09
поделиться

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

Да, любые конструкторы Вы изменяетесь в Foo, от которого Вот еще зависит Панель или, потребует, чтобы Вы изменили Панель и Вот еще соответственно.

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

2
ответ дан C. Dragon 76 23 November 2019 в 06:09
поделиться

Не забывайте, что можно также перенаправить конструкторов другим конструкторам на том же уровне наследования:

public Bar(int i, int j) : this(i) { ... }
                            ^^^^^
27
ответ дан jcai 23 November 2019 в 06:09
поделиться

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

3
ответ дан Chris Marasti-Georg 23 November 2019 в 06:09
поделиться

Да, необходимо скопировать все 387 конструкторов. Можно сделать некоторое повторное использование путем перенаправления их:

  public Bar(int i): base(i) {}
  public Bar(int i, int j) : base(i, j) {}

, но это является лучшим, можно сделать.

42
ответ дан James Curran 23 November 2019 в 06:09
поделиться

387 конструкторов?? Это - Ваша основная проблема. Как насчет этого вместо этого?

public Foo(params int[] list) {...}
70
ответ дан Kon 23 November 2019 в 06:09
поделиться

Как 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() {...}
   ...
}

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

7
ответ дан Keith 23 November 2019 в 06:09
поделиться

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

Subclass(): base() {}
Subclass(int x): base(x) {}
Subclass(int x,y): base(x,y) {}

Мне нужно сделать только 3 конструкторы в 12 подклассах, так что нет ничего сложного, но я не слишком люблю повторять это на каждом подклассе, после того как привык не писать его так долго. Я уверен, что для этого есть веская причина, но я не думаю, что когда-либо сталкивался с проблемой, требующей такого рода ограничений.

34
ответ дан 23 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: