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 Operator wł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 , NotOverridable lub Overridable |
Użycie słowa kluczowego | Shadows zalecane w klasie pochodnej; Shadows zakładane, jeśli ani Overrides Shadows 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.