Udostępnij za pośrednictwem


Różnice pomiędzy przesłanianiem i zastępowaniem (Visual Basic)

Podczas definiowania klasy dziedziczącej z klasy bazowej czasami należy ponownie zdefiniować jeden lub więcej elementów klasy bazowej w klasie pochodnej. Cieniowanie i zastępowanie są dostępne w tym celu.

Porównanie

Cieniowanie i zastępowanie są używane, gdy klasa pochodna dziedziczy z klasy bazowej, a obie definiują jeden zadeklarowany element z innym. Ale istnieją znaczące różnice między nimi.

Poniższa tabela porównuje cieniowanie z zastępowaniem.

Punkt porównania Zasłanianie Zastępowanie
Purpose Chroni przed kolejną modyfikacją klasy bazowej, która wprowadza element członkowski zdefiniowany już w klasie pochodnej Osiąga polimorfizm przez zdefiniowanie innej implementacji procedury lub właściwości z tą samą sekwencjąwywołującą 1
Element ponownie zdefiniowany Dowolny zadeklarowany typ elementu Tylko procedura (Function, Sub, lub ) lub Operatorwłaściwość
Ponowne definiowanie elementu Dowolny zadeklarowany typ elementu Tylko procedura lub właściwość z identyczną sekwencjąwywołującą 1
Poziom dostępu ponownego definiowania elementu Dowolny poziom dostępu Nie można zmienić poziomu dostępu przesłoniętego elementu
Czytelność i czytelność ponownego definiowania elementu Dowolna kombinacja Nie można zmienić czytelności ani możliwości zapisu przesłoniętej właściwości
Kontrola nad ponownym definiowaniem Element klasy bazowej nie może wymuszać ani uniemożliwiać cieniowania Element klasy bazowej może określać MustOverride, NotOverridablelub Overridable
Użycie słowa kluczowego Shadowszalecane w klasie pochodnej; Shadows zakładane, jeśli ani OverridesShadows nie określono2 Overridable lub MustOverride wymagane w klasie bazowej; Overrides wymagane w klasie pochodnej
Dziedziczenie elementu ponownego definiowania według klas pochodnych z klasy pochodnej Element cieniowania dziedziczony przez kolejne klasy pochodne; zacieniony element nadal ukryty3 Zastępowanie elementu dziedziczonego przez dalsze klasy pochodne; przesłonięć element nadal przesłaniany

1 Sekwencja wywoływania składa się z typu elementu (Function, Sub, Operator, lub Property), nazwy, listy parametrów i zwracanego typu. Nie można zastąpić procedury właściwością ani w drugą stronę. Nie można zastąpić jednego rodzaju procedury (Function, Sub, lub Operator) innym rodzajem.

2 Jeśli nie określisz elementu Shadows lub Overrides, kompilator wyświetli komunikat ostrzegawczy, aby upewnić się, jakiego rodzaju ponowne zdefiniowanie ma być używane. Jeśli zignorujesz ostrzeżenie, zostanie użyty mechanizm cieniowania.

3 Jeśli element cieniowania jest niedostępny w dalszej klasie pochodnej, cieniowanie nie jest dziedziczone. Jeśli na przykład zadeklarujesz element cieniowania jako Private, klasa wyprowadzona z klasy pochodnej dziedziczy oryginalny element zamiast elementu cieniowania.

Wytyczne

Zwykle należy użyć zastąpienia w następujących przypadkach:

  • Definiujesz klasy pochodne polimorficzne.

  • Chcesz, aby bezpieczeństwo kompilatora wymuszało identyczny typ elementu i sekwencję wywoływania.

Zwykle używasz cieniowania w następujących przypadkach:

  • Przewidujesz, że klasa bazowa może zostać zmodyfikowana i zdefiniuj element przy użyciu tej samej nazwy co Twoja.

  • Potrzebujesz swobody zmiany typu elementu lub sekwencji wywoływania.

Zobacz też