Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 , NotOverridable lub Overridable |
Użycie słowa kluczowego |
Shadows zalecane 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.