Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když definujete třídu, která dědí ze základní třídy, někdy chcete předefinovat jeden nebo více elementů základní třídy v odvozené třídě. Stínování a přepsání jsou k dispozici pro tento účel.
Porovnání
Zastínění a přepsání se používají, když odvozená třída dědí ze základní třídy, a oba tím redefinují jeden deklarovaný prvek jiným. Mezi těmito dvěma ale existují významné rozdíly.
Následující tabulka porovnává shadowing s overridingem.
| Bod porovnání | Stínování | Předefinování |
|---|---|---|
| Účel | Chrání před následnou úpravou základní třídy, která zavádí člena, který jste již definovali ve své odvozené třídě. | Dosahuje polymorfismu definováním jiné implementace procedury nebo vlastnosti se stejnou volající sekvencí1. |
| Přepracovaný prvek | Libovolný deklarovaný typ elementu | Pouze procedura (Function, Sub, nebo Operator) nebo vlastnost |
| Předefinování – element | Libovolný deklarovaný typ elementu | Pouze procedura nebo vlastnost s identickou volající sekvencí1 |
| Úroveň přístupu redefinujícího prvku | Libovolná úroveň přístupu | Úroveň přístupu přepsaného elementu nejde změnit. |
| Čitelnost a zapisovatelnost redefinujícího prvku | Libovolná kombinace | Nelze změnit čitelnost nebo zapisovatelnost přepsané vlastnosti. |
| Kontrola nad předefinováním | Element základní třídy nemůže vynutit ani zakázat stínování | Element základní třídy může určit MustOverride, NotOverridablenebo Overridable |
| Použití klíčových slov |
Shadowsdoporučeno v odvozené třídě; Shadows se předpokládá, pokud není Shadows ani Overrides upřesněno2 |
Overridable nebo MustOverride povinné v základní třídě; Overrides povinné v odvozené třídě |
| Dědičnost přepracovaného prvku třídami, které vycházejí z vaší odvozené třídy | Stínovací prvek zděděný dalšími odvozenými třídami; stínovaný prvek zůstává skrytý3 | Přepsání zděděného prvku dalšími odvozenými třídami; přepsaný prvek zůstává přepsaný |
1Volající sekvence se skládá z typu prvku (Function, Sub, Operator, nebo Property), name, seznam parametrů a návratový typ. Proceduru nelze přepsat vlastností ani naopak. Nelze přepsat jeden druh procedury (Function, Subnebo Operator) jiným druhem.
2 Pokud neurčíte ani ShadowsOverrides, kompilátor vydá zprávu upozornění, která vám pomůže zjistit, jaký druh redefinition chcete použít. Pokud upozornění ignorujete, použije se mechanismus stínování.
3 Pokud je prvek stínování nepřístupný v další odvozené třídě, stínování není zděděno. Pokud například deklarujete stínovací prvek jako Private, třída odvozená z odvozené třídy dědí původní prvek místo stínování elementu.
Pokyny
Přepsání obvykle používáte v následujících případech:
Definujete polymorfní odvozené třídy.
Chcete zajistit, aby kompilátor vynucoval identický typ elementu a posloupnost volání.
Stínování obvykle používáte v následujících případech:
Očekáváte, že vaše základní třída může být upravena a že definujete prvek se stejným názvem jako ten váš.
Chcete svobodu změnit typ prvku nebo posloupnost volání.