Rozdíly mezi stínováním a přepsáním (Visual Basic)
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í
Stínování a přepsání se používají, když odvozená třída dědí ze základní třídy a oba předefinují jeden deklarovaný prvek s jiným. Mezi těmito dvěma ale existují významné rozdíly.
Následující tabulka porovnává stínování s přepsáním.
Bod porovnání | Stínování | Přepsá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. |
Redefined – element | Libovolný deklarovaný typ elementu | Pouze procedura (Function , Sub nebo ) nebo Operator vlastnost |
Redefining – element | Libovolný deklarovaný typ elementu | Pouze procedura nebo vlastnost s identickou volající sekvencí1 |
Úroveň přístupu prvku redefining | Libovolná úroveň přístupu | Úroveň přístupu přepsaného elementu nejde změnit. |
Čitelnost a zapisovatelnost prvku redefining | Libovolná kombinace | Nelze změnit čitelnost nebo zapisovatelnost přepisované vlastnosti. |
Řízení 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 , NotOverridable nebo Overridable |
Použití klíčových slov | Shadows doporučená v odvozené třídě; Shadows předpokládá se, že není-li Shadows zadánaani Overrides 2 |
Overridable nebo MustOverride povinné v základní třídě; Overrides povinné v odvozené třídě |
Dědičnost prvku redefining podle tříd odvozených z vaší odvozené třídy | Shadowing element zděděný dalšími odvozenými třídami; stínovaný prvek stále skrytý3 | Přepsání elementu zděděného dalšími odvozenými třídami; přepsaný element stále přepsaný |
1 Volají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
, Sub
nebo Operator
) jiným druhem.
2 Pokud neurčíte ani Shadows
Overrides
, 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:
Předpokládáte, že se základní třída může upravit a definovat prvek se stejným názvem jako vy.
Chcete svobodu změnit typ prvku nebo posloupnost volání.