Freigeben über


Unterschiede zwischen Shadowing und Überschreiben

Aktualisiert: November 2007

Wenn Sie eine Klasse definieren, die von einer Basisklasse erbt, möchten Sie u. U. eines oder mehrere der Basisklassenelemente in der abgeleiteten Klasse neu definieren. Zu diesem Zweck sind die Techniken Shadowing und Überschreiben verfügbar.

Vergleich

Shadowing kann leicht mit dem Überschreiben verwechselt werden. Beide Methoden werden verwendet, wenn eine abgeleitete Klasse von einer Basisklasse erbt und beide ein deklariertes Element durch ein anderes neu definieren. Es gibt jedoch klare Unterschiede zwischen den beiden Verfahren.

In der folgenden Tabelle werden das Shadowing und das Überschreiben miteinander verglichen.

Vergleichsaspekte

Shadowing

Überschreiben

Zweck

Schützt vor späteren Änderungen der Basisklasse, durch die ein Member eingeführt wird, der bereits in der abgeleiteten Klasse definiert wurde

Gewährleistet Polymorphismus durch die Definition einer anderen Implementierung einer Prozedur oder Eigenschaft mit derselben Aufrufabfolge1

Neu definiertes Element

Jeder deklarierte Elementtyp

Nur Prozeduren (Function, Sub oder Operator) oder Eigenschaften

Neu definierendes Element

Jeder deklarierte Elementtyp

Nur Prozeduren oder Eigenschaften mit einer identischen Aufrufabfolge1

Zugriffsebene für die Neudefinition von Elementen

Beliebige Zugriffsebene

Kann die Zugriffsebene von überschriebenen Elementen nicht ändern

Lese- und Schreibzugriff des neu definierenden Elements

Beliebige Kombination

Kann die Lesbarkeit oder Schreibbarkeit der überschriebenen Eigenschaft nicht ändern

Kontrolle über die Neudefinition

Basisklassenelement kann das Shadowing nicht durchsetzen oder verbieten

Basisklassenelement kann MustOverride, NotOverridable oder Overridable angeben

Verwendung von Schlüsselwörtern

Die Verwendung von Shadows wird in der abgeleiteten Klasse empfohlen. Wenn weder Shadows noch Overrides angegeben wurde, wird Shadows angenommen2.

Overridable oder MustOverride ist in der Basisklasse erforderlich; Overrides ist in der abgeleiteten Klasse erforderlich.

Vererbung des neu definierenden Elements durch Klassen, die von der abgeleiteten Klasse abgeleitet werden

Das Element, welches das Shadowing durchführt, wird von nachfolgenden abgeleiteten Klassen geerbt; das Element, für welches das Shadowing durchgeführt wurde, bleibt verdeckt3.

Das überschreibende Element wird von weiter abgeleiteten Klassen geerbt; das überschriebene Element bleibt überschrieben

1 Die Aufrufabfolge besteht aus dem Elementtyp (Function, Sub, Operator oder Property), dem Namen, der Argumentliste und dem Rückgabetyp. Es ist nicht möglich, eine Prozedur mit einer Eigenschaft zu überschreiben oder umgekehrt. Sie können keinerlei Prozedur (Function, Sub oder Operator) mit einer anderen Art von Prozedur überschreiben.

2 Wenn Sie weder Shadows noch Overrides angeben, gibt der Compiler eine Warnung aus, damit Sie nochmals überprüfen und bestätigen können, welche Art von Neudefinition verwendet werden soll. Wenn Sie die Warnung ignorieren, wird der Shadowing-Mechanismus verwendet.

3 Wenn in einer nachfolgend abgeleiteten Klasse nicht auf das Element, welches das Shadowing durchführt, zugegriffen werden kann, wird der Shadowing-Effekt nicht vererbt. Wenn Sie beispielsweise das Element, welches das Shadowing durchführt, als Private deklarieren, erbt eine von der abgeleiteten Klasse abgeleitete Klasse das Originalelement anstelle des Elements, welches das Shadowing durchführt.

Richtlinien

Das Überschreiben wird normalerweise in den folgenden Fällen angewendet:

  • Sie definieren polymorphe abgeleitete Klassen.

  • Sie möchten sicherstellen, dass der Compiler den gleichen Elementtyp und die gleiche Aufrufabfolge erzwingt.

Sie führen ein Shadowing normalerweise in den folgenden Fällen durch:

  • Sie erwarten, dass Ihre Basisklasse modifiziert wird, und definieren ein Element mit dem Namen eines Basisklassenelements.

  • Sie möchten in der Lage sein, den Elementtyp oder die Aufruffolge zu ändern.

Siehe auch

Aufgaben

Gewusst wie: Unterscheiden zwischen zwei Elementen mit dem gleichen Namen

Gewusst wie: Ausblenden einer Variablen mit dem gleichen Namen wie die aktuelle Variable

Gewusst wie: Ausblenden einer geerbten Variablen

Gewusst wie: Zugreifen auf eine Variable, die von einer abgeleiteten Klasse ausgeblendet wird

Konzepte

Auflösen eines Verweises bei mehreren Variablen mit gleichem Namen

Shadowing in Visual Basic

Referenz

Shadows

Overrides

Weitere Ressourcen

Verweise auf deklarierte Elemente