C # - заставить все производные классы вызывать конструктор базового класса - PullRequest
43 голосов
/ 28 ноября 2010

У меня есть базовый класс Character, который имеет несколько классов, производных от него. Базовый класс имеет различные поля и методы.

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

Ошибка: класс "дочерний класс" не содержит конструктор, который принимает это количество аргументов

Я не хочу переопределять конструктор в каждом производном классе, потому что, если конструктор изменяется, я должен изменить его в каждом отдельном классе, что, извините за недопонимание, противоречит идее только один раз написать код?

Ответы [ 4 ]

70 голосов
/ 28 ноября 2010

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

public DerivedClass() : base() {
    // Do additional work here otherwise you can leave it empty
}

Сначала будет вызван базовый конструктор, затем он выполнит любые дополнительные операторы, если таковые имеются, в этом производном конструкторе.

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

public DerivedClass(int parameter1, string parameter2) 
    : base(parameter1, parameter2) {
    // DerivedClass parameter types have to match base class types
    // Do additional work here otherwise you can leave it empty
}

Вы можете найти больше информации о конструкторах на следующей странице:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

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

44 голосов
/ 28 ноября 2010

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

В частности, вы бы не хотели бы , чтобы все конструкторы автоматически наследовались - в конце концовбудет означать, что каждый класс будет иметь конструктор без параметров, как это делает сам object.

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

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

4 голосов
/ 02 октября 2014

У меня была та же проблема, и я решил ее, заменив конструктор методом фабрики, например:

A - родительский класс.

public static T getChild<T>(int number) where T:A, new()
{
    T child = new T();
    T._number = number;
    return child;

}

Вы можете создать дочернийкласс с

Child b = A.getChild<Child>(2);

1 голос
/ 28 ноября 2010

В качестве альтернативы можно использовать контейнер Inpendency Injection для инициализации ваших объектов, чтобы эта ссылка на базовый класс (это мог быть вызов базового конструктора или другого метода инициализатора) «внешне» передКонтейнер DI.

Я не знаю, имеет ли это смысл для вашего случая или нет

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