Överträffar i VB.NET

Detta är en av en miniserie som täcker skillnaderna i överbelastning, skuggor och åsidosättningar i VB.NET. Den här artikeln täcker åsidosättningar. Artiklarna som täcker de andra finns här:

-> Överbelastningar
-> Skuggor

Dessa tekniker kan vara väldigt förvirrande; det finns många kombinationer av dessa sökord och de underliggande arvalternativen. Microsofts egen dokumentation börjar inte göra ämnet rättvisa och det finns mycket dålig information eller föråldrad information på webben. Det bästa rådet för att vara säker på att ditt program är korrekt kodat är "Testa, testa och testa igen." I den här serien tittar vi på dem en åt gången med tonvikt på skillnaderna.

Åsidosätter

Det som alla skuggor, överbelastningar och åsidosättningar har gemensamt är att de återanvänder elementens namn medan de ändrar vad som händer. Skuggor och överbelastningar kan fungera båda inom samma klass eller när a klass ärver en annan klass. Överskridanden kan emellertid endast användas i en härledd klass (ibland kallad en barnklass) som ärver från en

instagram viewer
basklass (kallas ibland föräldraklass). Och åsidosättningar är hammaren; det låter dig helt ersätta en metod (eller en egenskap) från en basklass.

I artikeln om klasser och Shadows-nyckelordet (se: Shadows in VB.NET) lades en funktion till för att visa att det kan hänvisas till ett ärftligt förfarande.

Public Class ProfessionalContact. '... kod visas inte... Offentlig funktion HashTheName ( ByVal nm As String) Som String. Återvänd nm. GetHashCode. Avsluta funktion. Slutklass.

Koden som instanserar en klass härrörande från den här (CodedProfessionalContact i exemplet) kan kalla den här metoden eftersom den ärvs.

I exemplet använde jag VB.NET GetHashCode metod för att hålla koden enkel och detta gav ett ganska värdelöst resultat, värdet -520086483. Anta att jag ville ha ett annat resultat tillbaka istället men,

-> Jag kan inte ändra basklassen. (Kanske allt jag har är en kod från en leverantör.)

... och ...

-> Jag kan inte ändra samtalskoden (kanske finns det tusen exemplar och jag kan inte uppdatera dem.)

Om jag kan uppdatera den härledda klassen kan jag ändra det returnerade resultatet. (Till exempel kan koden vara en del av en uppdaterbar DLL.)

Det finns ett problem. Eftersom det är så omfattande och kraftfullt, måste du ha tillstånd från basklassen att använda Överrides. Men väldesignade kodbibliotek tillhandahåller det. (Din kodbibliotek är alla väl utformade, eller hur?) Till exempel är den tillhandahållna Microsoft-funktionen vi just använde överbrytbar. Här är ett exempel på syntaxen.

Offentlig överbrytbar funktion GetHashCode som heltal

Så det nyckelordet måste också finnas i vårt exempel basklass.

Offentlig överbrytbar funktion HashTheName ( ByVal nm As String) Som String.

Överstyr metoden är nu så enkelt som att tillhandahålla en ny med nyckelordet Överväg. Visual Studio ger dig en igång igen genom att fylla i koden för dig med AutoComplete. När du går in ...


Offentlig åsidosättande funktion HashTheName (

Visual Studio lägger till resten av koden automatiskt så snart du skriver in öppningsparentesen, inklusive retursförklaringen som bara anropar den ursprungliga funktionen från basklassen. (Om du bara lägger till något är det vanligtvis bra att göra när din nya kod ändå körs.)

Offentlig åsidosättande funktion HashTheName ( nm som sträng) som sträng. Returnera MyBase. HashTheName (nm) Avsluta funktion.

I det här fallet kommer jag dock att ersätta metoden med något annat lika värdelöst bara för att illustrera hur det görs: VB.NET-funktionen som kommer att vända strängen.

Offentlig åsidosättande funktion HashTheName ( nm som sträng) som sträng. Returnera Microsoft. Visual Basic. StrReverse (nm) Avsluta funktion.

Nu får samtalskoden ett helt annat resultat. (Jämför med resultatet i artikeln om Shadows.)


KontaktID: 246. Företagsnamn: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Du kan också åsidosätta egenskaperna. Anta att du bestämde dig för att ContactID-värden större än 123 inte skulle tillåtas och bör vara standard till 111. Du kan bara åsidosätta egenskapen och ändra den när egenskapen är sparad:

Privat _ContactID som heltal. Offentligt åsidosätter egendomskontaktID som heltal. Skaffa sig. Returnera _ContactID. Slut Get. Ställ in (ByVal-värde som heltal) Om värde> 123 Sedan. _ContactID = 111. Annan. _ContactID = värde. Sluta om. Slutuppsättning. Slut egendom.

Då får du detta resultat när ett större värde överförs:


KontaktID: 111. Företagsnamn: Damsel Rescuers, LTD. 

Förresten, i exemplet hittills, fördubblas heltal i det nya subrutin (Se artikeln om Shadows), så ett heltal på 123 ändras till 246 och ändras sedan igen till 111.

VB.NET ger dig ännu mer kontroll genom att låta en basklass specifikt kräva eller förneka en härledd klass att åsidosätta med hjälp av MustOverride och NotOverridable nyckelord i basklassen. Men båda dessa används i ganska specifika fall. Först NotOverridable.

Eftersom standard för en offentlig klass är NotOverridable, varför skulle du någonsin behöva ange den? Om du provar det på HashTheName-funktionen i basklassen får du ett syntaxfel, men texten i felmeddelandet ger dig en ledtråd:

'NotOverridable' kan inte specificeras för metoder som inte åsidosätter en annan metod.

Standard för en åsidosatt metod är tvärtom: överbrytbar. Så om du vill åsidosätta för att definitivt stanna där, måste du ange NotOverridable på den metoden. I vårt exempelkod:


Offentligt NotOverridable Åsidosätter Funktion HashTheName (... 

Sedan om klassen CodedProfessionalContact i sin tur ärvs ...


Public Class NotOverridableEx. Inherits CodedProfessionalContact. 

... funktionen HashTheName kan inte åsidosättas i den klassen. Ett element som inte kan åsidosättas kallas ibland ett förseglat element.

En grundläggande del av den.NET Foundation är att kräva att syftet med varje klass uttryckligen definieras för att ta bort all osäkerhet. Ett problem på tidigare OOP-språk har kallats "den bräckliga basklassen." Detta händer när en bas klass lägger till en ny metod med samma namn som metodnamn i en underklass som ärver från en bas klass. Programmeraren som skrev underklassen planerade inte att åsidosätta basklassen, men det är exakt vad som händer ändå. Detta har varit känt för att resultera i gråten från den sårade programmeraren, "Jag ändrade ingenting, men mitt program kraschade ändå. "Om det finns en möjlighet att en klass kommer att uppdateras i framtiden och skapa detta problem, förklara det som NotOverridable.

MustOverride används oftast i det som kallas en abstrakt klass. (I C # använder samma sak nyckelordet Sammanfattning!) Detta är en klass som bara ger en mall och du förväntas fylla den med din egen kod. Microsoft tillhandahåller detta exempel på ett:

Tvättmaskin för offentligt Must-ärftklass. Sub Ny () "Kod för att instansera klassen går här. Avsluta sub. Offentlig MustOverride Sub Wash. Offentlig MustOverride sub-skölj (loadSize som heltal) Offentligt MustOverride-funktionsspinn (hastighet som heltal) så länge. Slutklass.

För att fortsätta Microsofts exempel kommer tvättmaskiner att göra dessa saker (Wash, Rinse and Spin) helt annorlunda, så det finns ingen fördel med att definiera funktionen i basklassen. Men det är en fördel att se till att varje klass som ärver den här gör definiera dem. Lösningen: en abstrakt klass.

Om du behöver ännu mer förklaring om skillnaderna mellan överbelastning och åsidosättningar, utvecklas ett helt annat exempel i ett snabbtips: Överbelastning versus åsidosättningar

VB.NET ger dig ännu mer kontroll genom att låta en basklass specifikt kräva eller förneka en härledd klass att åsidosätta med hjälp av MustOverride och NotOverridable nyckelord i basklassen. Men båda dessa används i ganska specifika fall. Först NotOverridable.

Eftersom standard för en offentlig klass är NotOverridable, varför skulle du någonsin behöva ange den? Om du provar det på HashTheName-funktionen i basklassen får du ett syntaxfel, men texten i felmeddelandet ger dig en ledtråd:

'NotOverridable' kan inte specificeras för metoder som inte åsidosätter en annan metod.

Standard för en åsidosatt metod är tvärtom: överbrytbar. Så om du vill åsidosätta för att definitivt stanna där, måste du ange NotOverridable på den metoden. I vårt exempelkod:


Offentligt NotOverridable Åsidosätter Funktion HashTheName (... 

Sedan om klassen CodedProfessionalContact i sin tur ärvs ...


Public Class NotOverridableEx. Inherits CodedProfessionalContact. 

... funktionen HashTheName kan inte åsidosättas i den klassen. Ett element som inte kan åsidosättas kallas ibland ett förseglat element.

En grundläggande del av .NET Foundation är att kräva att syftet med varje klass uttryckligen definieras för att ta bort all osäkerhet. Ett problem på tidigare OOP-språk har kallats "den bräckliga basklassen." Detta händer när en bas klass lägger till en ny metod med samma namn som metodnamn i en underklass som ärver från en bas klass. Programmeraren som skrev underklassen planerade inte att åsidosätta basklassen, men det är exakt vad som händer ändå. Detta har varit känt för att resultera i gråten från den sårade programmeraren, "Jag ändrade ingenting, men mitt program kraschade ändå. "Om det finns en möjlighet att en klass kommer att uppdateras i framtiden och skapa detta problem, förklara det som NotOverridable.

MustOverride används oftast i det som kallas en abstrakt klass. (I C # använder samma sak nyckelordet Sammanfattning!) Detta är en klass som bara ger en mall och du förväntas fylla den med din egen kod. Microsoft tillhandahåller detta exempel på ett:

Tvättmaskin för offentligt Must-ärftklass. Sub Ny () "Kod för att instansera klassen går här. Avsluta sub. Offentlig MustOverride Sub Wash. Offentlig MustOverride sub-skölj (loadSize som heltal) Offentligt MustOverride-funktionsspinn (hastighet som heltal) så länge. Slutklass.

För att fortsätta Microsofts exempel kommer tvättmaskiner att göra dessa saker (Wash, Rinse and Spin) helt annorlunda, så det finns ingen fördel med att definiera funktionen i basklassen. Men det är en fördel att se till att varje klass som ärver den här gör definiera dem. Lösningen: en abstrakt klass.

Om du behöver ännu mer förklaring om skillnaderna mellan överbelastning och åsidosättningar, utvecklas ett helt annat exempel i ett snabbtips: Överbelastning versus åsidosättningar

instagram story viewer