14 Stimmen

Konstrukteure und Vererbung

Nehmen wir ein Beispiel in C#

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

public class Bar : Foo
{

}

Nun sind alle öffentlichen Mitglieder von Foo in Bar zugänglich, außer dem Konstruktor. Ich kann nicht etwas tun wie

Bar bb = new Bar(1);

Warum sind die Konstruktoren nicht vererbbar?

UPDATE

Ich verstehe, dass wir Konstruktoren verketten können, aber ich würde gerne wissen, warum das obige Konstrukt nicht gültig ist. Ich bin sicher, dass es dafür einen triftigen Grund gibt.

1voto

Noldorin Punkte 138548

Konstrukteure sind aus Designgründen nicht vererbbar. (Beachten Sie, dass dies in jeder mir bekannten objektorientierten Sprache der Fall ist). Die einfache Antwort ist, dass man in vielen Fällen nicht möchte, dass die gleichen Konstruktoren wie in der Basisklasse verfügbar sind. Siehe dieses SO-Thema für einige ausführlichere Erklärungen.

1voto

dirkgently Punkte 104289

Einige Diskussionen

Der Grundgedanke ist, dem Ersteller so viel Kontrolle wie möglich zu geben. Und Sie können private Basen haben. Wie haben Sie das Objekt dann erstellt?

0voto

Ian P Punkte 12536

Ich denke, Sie können Folgendes tun:

public class Bar : Foo
{
  public Bar (int i)
    : base (i)
  {
  }
}

Vielleicht liege ich ein wenig daneben, aber das ist die allgemeine Idee.

0voto

TofuBeer Punkte 59410

Die einfache Antwort ist, dass die Sprache nicht auf diese Weise funktioniert.

Die eigentliche Frage, die Sie stellen, ist jedoch, warum es so nicht funktioniert :-) Nun, es ist eine willkürliche Entscheidung, und sie folgt auf C++ und Java (und sehr wahrscheinlich viele andere Sprachen, die C# beeinflusst haben).

Der wahrscheinliche Grund dafür ist, dass der Compiler nur einen Konstruktor generiert, der keine Argumente annimmt und einfach den übergeordneten Konstruktor aufruft, wenn Sie mehr wollen als das, was der Compiler Ihnen vorgibt. Dies ist die beste Wahl, da die Wahrscheinlichkeit groß ist, dass Sie mehr tun als nur den übergeordneten Konstruktor aufzurufen.

0voto

John Ellinwood Punkte 13961

In Wirklichkeit liegt es daran, dass der übergeordnete Konstruktor das untergeordnete Objekt nicht vollständig initialisieren würde. Ein Konstruktor ist in dieser Hinsicht eine Art persönliche Sache. Deshalb vererben die meisten Sprachen auch keine Konstruktoren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X