Почему конструкторы не наследуются? - PullRequest
34 голосов
/ 09 января 2009

Я предполагаю, что в наследовании C # есть что-то действительно простое, чего я не понимаю. Кто-нибудь, пожалуйста, просветите меня?

Ответы [ 5 ]

31 голосов
/ 09 января 2009

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

Позвольте привести пример. Если бы классы наследовали свои конструкторы суперкласса, все классы имели бы конструктор без параметров из Object. Очевидно, это не правильно.

29 голосов
/ 09 января 2009

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

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

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

Есть также более философский аргумент. Наследование связано с типом обязанностей (это то, чем я занимаюсь). Конструкторы о сотрудничестве типов (это то, что мне нужно). Таким образом, наследующие конструкторы будут смешивать ответственность типов с совместной работой над типами, тогда как эти две концепции действительно должны оставаться отдельными.

11 голосов
/ 09 января 2009

Конструкторы в суперклассах вызываются независимо от того, вызываете вы их явно или нет. Они цепочки от родительского класса вниз. Если ваш конструктор не вызывает явно конструктор в своем суперклассе, тогда конструктор по умолчанию в этом классе вызывается неявно перед кодом вашего конструктора.

2 голосов
/ 09 января 2009

Полагаю, вы имеете в виду:

class Foo
{
   public Foo(int someVar) {}
}

class Bar : Foo
{
    // Why does Bar not automatically have compiler generated version of 
    Bar(int someVar): Foo(someVar) {}
}

Я считаю, что это унаследовано от C ++ (и Java).
Но при условии, что у вас это есть, а у Бар есть другие переменные-члены. Не приведет ли это к возможности создания сгенерированного компилятором конструктора, который случайно используется и не инициализирует элементы BAr.

0 голосов
/ 09 января 2009

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

class Bar : Foo { }

Когда создается экземпляр Bar, он по умолчанию вызывает конструктор Foo ().

class Foo {
    public Foo(int someVar) {}
}

class Bar : Foo {
    public Bar() : base(42) {}
}

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

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