Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie eine Klasse definieren, die von einer Basisklasse erbt, möchten Sie manchmal ein oder mehrere der Basisklassenelemente in der abgeleiteten Klasse neu definieren. Für diesen Zweck stehen sowohl Shadowing als auch Überschreiben zur Verfügung.
Vergleich
Shadowing und Überschreiben werden beide verwendet, wenn eine abgeleitete Klasse von einer Basisklasse erbt, und beide definieren ein deklariertes Element mit einem anderen neu. Aber es gibt erhebliche Unterschiede zwischen den beiden.
In der folgenden Tabelle wird Shadowing mit Überschreiben verglichen.
| Vergleichspunkt | Beschattung | Überschreiben |
|---|---|---|
| Zweck | Schützt vor einer nachfolgenden Änderung der Basisklasse, die ein Element einführt, das Sie bereits in Ihrer abgeleiteten Klasse definiert haben. | Erreicht Polymorphismus durch Definieren einer anderen Implementierung einer Prozedur oder Eigenschaft mit derselben Aufrufsequenz1 |
| Neu definiertes Element | Jeder deklarierte Elementtyp | Nur eine Prozedur (Function, Suboder Operator) oder Eigenschaft |
| Neudefinition eines Elements | Jeder deklarierte Elementtyp | Nur eine Prozedur oder Eigenschaft mit identischer Aufrufsequenz1 |
| Zugriffsebene des neu definierten Elements | Jede Zugriffsebene | Zugriffsebene des außerkraftsetzungselements kann nicht geändert werden |
| Lesbarkeit und Schreibbarkeit des neu definierten Elements | Beliebige Kombination | Kann die Lesbarkeit oder Schreibbarkeit der überschriebenen Eigenschaft nicht ändern |
| Kontrolle über die Neudefinition | Das Basisklassenelement kann Shadowing nicht erzwingen oder untersagen | Basisklassenelement kann MustOverride, NotOverridable oder Overridable angeben. |
| Schlüsselwortverwendung |
Shadows empfohlen in abgeleiteter Klasse; Shadows angenommen, wenn weder Shadows noch Overrides angegeben ist2 |
Overridable oder MustOverride erforderlich in der Basisklasse; Overrides erforderlich in abgeleiteter Klasse |
| Vererbung des neu definierten Elements durch Klassen, die von Ihrer abgeleiteten Klasse abstammen | Überschattendes Element, das von weiteren abgeleiteten Klassen geerbt wird; überschattetes Element weiterhin verborgen3 | Überschreibendes Element, das von weiteren abgeleiteten Klassen geerbt wird; überschriebenes Element bleibt überschrieben. |
1 Die aufrufende Sequenz besteht aus dem Elementtyp (Function, Sub, , Operatoroder Property), dem Namen, der Parameterliste und dem Rückgabetyp. Sie können eine Prozedur nicht mit einer Eigenschaft oder umgekehrt überschreiben. Sie können eine Art von Prozedur (Function, Suboder Operator) nicht mit einer anderen Art überschreiben.
2 Wenn Sie weder Shadows noch Overrides angeben, gibt der Compiler eine Warnmeldung aus, die Ihnen hilft, zu entscheiden, welche Art von Neudefinition Sie verwenden möchten. Wenn Sie die Warnung ignorieren, wird der Schattenmechanismus verwendet.
3 Wenn auf das Schattenelement in einer weiteren abgeleiteten Klasse nicht zugegriffen werden kann, wird die Schattenung nicht geerbt. Wenn Sie z. B. das Schattenelement als Privatedeklarieren, erbt eine von der abgeleiteten Klasse abgeleitete Klasse das ursprüngliche Element anstelle des Schattenelements.
Leitlinien
In der Regel verwenden Sie Überschreiben in den folgenden Fällen:
Sie definieren polymorphe abgeleitete Klassen.
Sie möchten die Sicherheit haben, dass der Compiler den identischen Elementtyp und die Aufrufreihenfolge erzwingt.
Normalerweise verwenden Sie Schatten in den folgenden Fällen:
Sie gehen davon aus, dass Ihre Basisklasse möglicherweise geändert und ein Element mit demselben Namen wie Ihre definiert wird.
Sie möchten die Freiheit, den Elementtyp oder die Aufrufsequenz zu ändern.
Siehe auch
- Verweise auf deklarierte Elemente
- Schatten in Visual Basic
- Vorgehensweise: Ausblenden einer Variable mit demselben Namen wie Ihre Variable
- Vorgehensweise: Ausblenden einer geerbten Variablen
- Vorgehensweise: Zugreifen auf eine Variable, die von einer abgeleiteten Klasse ausgeblendet wird
- Schatten
- Außerkraftsetzungen