Skillnader mellan skuggning och åsidosättande (Visual Basic)
När du definierar en klass som ärver från en basklass vill du ibland omdefiniera ett eller flera av grundklasselementen i den härledda klassen. Både skuggning och åsidosättande är tillgängliga för det här ändamålet.
Jämförelse
Både skuggning och åsidosättande används när en härledd klass ärver från en basklass och båda omdefinierar ett deklarerat element med ett annat. Men det finns betydande skillnader mellan de två.
I följande tabell jämförs skuggning med åsidosättande.
Jämförelsepunkt | Skuggning | Åsidosätta |
---|---|---|
Syfte | Skyddar mot en efterföljande ändring av basklassen som introducerar en medlem som du redan har definierat i din härledda klass | Uppnår polymorfism genom att definiera en annan implementering av en procedur eller egenskap med samma anropssekvens1 |
Omdefinierat element | Alla deklarerade elementtyper | Endast en procedur (Function , Sub , eller Operator ) eller egenskap |
Omdefiniera element | Alla deklarerade elementtyper | Endast en procedur eller egenskap med identisk anropssekvens1 |
Åtkomstnivå för omdefinieringselement | Alla åtkomstnivåer | Det går inte att ändra åtkomstnivån för det åsidosatta elementet |
Läsbarhet och skrivbarhet för omdefinieringselement | Valfri kombination | Det går inte att ändra läsbarheten eller skrivbarheten för den åsidosatta egenskapen |
Kontroll över omdefiniering | Grundklasselementet kan inte framtvinga eller förbjuda skuggning | Basklasselement kan ange MustOverride , NotOverridable eller Overridable |
Nyckelordsanvändning | Shadows rekommenderas i härledd klass. Shadows antas om varken Shadows eller Overrides angiven2 |
Overridable eller MustOverride krävs i basklass; Overrides krävs i härledd klass |
Arv av omdefinieringselement efter klasser som härleds från din härledda klass | Skuggningselement som ärvs av ytterligare härledda klasser; skuggat element fortfarande dolt3 | Åsidosättande element som ärvs av ytterligare härledda klasser. åsidosättat element som fortfarande åsidosättas |
1 Anropssekvensenbestår av elementtypen (Function
, , Sub
Operator
eller Property
), namn, parameterlista och returtyp. Du kan inte åsidosätta en procedur med en egenskap eller tvärtom. Du kan inte åsidosätta en typ av procedur (Function
, Sub
eller Operator
) med en annan typ.
2 Om du inte anger antingen Shadows
eller Overrides
utfärdar kompilatorn ett varningsmeddelande som hjälper dig att vara säker på vilken typ av omdefiniering du vill använda. Om du ignorerar varningen används skuggningsmekanismen.
3 Om skuggelementet inte är tillgängligt i en ytterligare härledd klass ärvs inte skuggning. Om du till exempel deklarerar skuggelementet som Private
ärver en klass som härleds från din härledda klass det ursprungliga elementet i stället för skuggelementet.
Riktlinjer
Du använder normalt åsidosättande i följande fall:
Du definierar polymorfa härledda klasser.
Du vill vara säker på att kompilatorn framtvingar den identiska elementtypen och anropssekvensen.
Du använder normalt skuggning i följande fall:
Du förväntar dig att basklassen kan ändras och definiera ett element med samma namn som ditt.
Du vill ha friheten att ändra elementtypen eller anropa sekvensen.