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