Udostępnij za pośrednictwem


Różnice między cieniowaniem 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ą stosowane, gdy klasa pochodna dziedziczy po klasie bazowej, i oba te przypadki polegają na redefinicji jednego zadeklarowanego elementu za pomocą innego. Ale istnieją znaczące różnice między nimi.

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

Punkt porównania Przesłanianie Nadpisywanie
Przeznaczenie Chroni przed modyfikacją klasy bazowej, która wprowadza członka już zdefiniowanego 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 Operator) lub 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 do ponownego definiowania elementu Dowolny poziom dostępu Nie można zmienić poziomu dostępu przesłoniętego elementu
Czytelność i łatwość zapisu ponownego definiowania elementu Dowolna kombinacja Nie można zmienić możliwości odczytu ani 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 Shadows ani Overrides 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; element przesłonięty pozostaje przesłonięty

1Sekwencja 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 mieć pewność, że kompilator wymusza użycie identycznego typu elementu oraz właściwej sekwencji 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 także