Por que os construtores não são herdados?

Eu estou supondo que há algo realmente básico sobre a inheritance C # que eu não entendo. Alguém por favor me esclareceria?

Às vezes, quando a subclass, você deseja restringir as condições necessárias para criar uma instância da class.

Deixe-me lhe dar um exemplo. Se as classs herdassem seus construtores de superclass, todas as classs teriam o construtor sem parâmetros de Object . Obviamente isso não está correto.

Se você pensar sobre o que aconteceria se os construtores fossem herdados, você deveria começar a ver o problema.

Como praticamente todo tipo de .NET herda de Object (que tem um construtor sem parâmetros), isso significa que quase todos os tipos que você cria seriam forçados a ter um construtor sem parâmetros. Mas existem muitos tipos em que um construtor sem parâmetros não faz sentido.

Também haveria um problema com o version control. Se uma nova versão do seu tipo base aparecer com um novo construtor, você obterá automaticamente um novo construtor no seu tipo derivado. Isso seria algo ruim e uma instância específica do frágil problema da class base .

Há também um argumento mais filosófico. Herança é sobre responsabilidades de tipo (isto é o que eu faço). Os construtores são sobre colaboração de tipos (é disso que eu preciso). Assim, os construtores herdados estariam misturando a responsabilidade do tipo com o tipo colaboração, ao passo que esses dois conceitos devem permanecer realmente separados.

Construtores em superclasss são chamados, quer você os chame explicitamente ou não. Eles encadeiam da class pai para baixo. Se seu construtor não chamar explicitamente um construtor em sua superclass, o construtor padrão nessa class será chamado implicitamente antes do código de seu construtor.

Eu suponho que você quer dizer:

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

Eu acredito que isso é herdado do C ++ (e Java).
Mas supondo que você tenha isso e Bar tenha outras variables ​​de membro. Isso não introduziria a posibilidade do construtor gerado pelo compilador sendo usado de forma acostumada e não inicializando os membros do BAr.

O construtor padrão será sempre chamado.

 class Bar : Foo { } 

Quando Bar é instanciado, ele chamará o construtor Foo () por padrão.

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

Se não houver um construtor sem parâmetros, você deverá definir qual deles usar e passar os parâmetros.