Warum sind Konstruktoren nicht vererbt?
Ich vermute, es ist etwas wirklich grundlegendes über C# Vererbung, dass ich nicht verstehe. Würde bitte jemand mich aufklären?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, es ist etwas wirklich grundlegendes über C# Vererbung, dass ich nicht verstehe. Würde bitte jemand mich aufklären?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Manchmal, wenn Unterklassen, die Sie einschränken möchten, die erforderlichen Bedingungen zu schaffen, die eine Instanz der Klasse.
Lassen Sie mich Ihnen ein Beispiel geben. Wenn Klassen Erben haben Ihre Oberklasse-Konstruktoren, alle Klassen hätte der parameterlose Konstruktor von
Object
. Offensichtlich nicht richtig.virtual
...Object
wird nicht vererbt, aber dennoch implizit aufgerufen.Wenn Sie darüber nachdenken, was passieren würde, wenn Konstruktoren wurden geerbt, sollten Sie beginnen zu sehen, die problem.
Als fast jede geben .NETTO erbt von Object (die einen parameterlosen Konstruktor), das bedeutet, dass fast jede Art, die Sie erstellen, gezwungen wäre, einen parameterlosen Konstruktor. Aber es gibt viele Typen, wobei einer parameterlosen Konstruktor macht keinen Sinn.
Gäbe es auch ein problem mit der Versionierung. Wenn eine neue version des Basis-Typ wird mit einen new-Konstruktor, würden Sie bekommen automatisch einen neuen Konstruktor in der abgeleiteten Typ. Dies wäre eine schlechte Sache, und eine bestimmte Instanz des fragile base class problem.
Gibt es auch noch ein philosophisches argument. Vererbung ist über Art Verantwortung (dies ist, was ich Tue). Konstruktoren sind über die Art der Zusammenarbeit (dies ist, was ich brauche). So vererben von Konstruktoren würde Misch-Typ, Verantwortung, Art der Zusammenarbeit, in der Erwägung, dass diese beiden Konzepte sollten wirklich getrennt bleiben.
Konstruktoren in Oberklassen aufgerufen werden, ob Sie explizit nennen oder nicht. Diese Kette aus der übergeordneten Klasse runter. Wenn Ihr Konstruktor nicht explizit aufrufen eines Konstruktors in es ist Superklasse, dann der default-Konstruktor dieser Klasse aufgerufen wird, implizit, bevor der code an den Konstruktor.
Ich nehme an, du meinst:
Ich glaube, das ist geerbt von C++ (und Java).
Aber vorausgesetzt, Sie haben diese und die Bar hatte einige andere member-Variablen. Wäre das nicht vorstellen das posability der compiler generierten Konstruktor accdently genutzt wird und nicht die Initialisierung der Mitglieder der BAr.
Den default-Konstruktor wird immer aufgerufen werden .
Wenn Bar instanziiert wird, erfolgt ein Aufruf der Foo () - Konstruktor standardmäßig.
Wenn es keinen parameterlosen Konstruktor, müssen Sie definieren, welche Sie verwenden möchten, und übergeben Sie die Parameter.