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

Почему конструкторы не наследуются?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Я предполагаю, что вы имеете в виду:

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

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

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

Ответ 5

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

class Bar : Foo { }

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

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

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

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