Sdílet prostřednictvím


Rozdíly mezi stínováním a přepisová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í

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í.

Viz také