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

С# - создание всех производных классов вызывает конструктор базового класса

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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
}

Более подробную информацию о конструкторах можно найти на следующей странице:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx

Ответ 3

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

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

Ответ 4

Альтернативой может быть использование контейнера Dependency Injection для инициализации ваших объектов. Таким образом, эта ссылка на базовый класс (может быть вызов базового конструктора или другого метода инициализации) будет "экрнализирована" на DI.

Я не знаю, имеет ли смысл ваш случай или нет