Tilsidesætter i VB.NET

Dette er en af ​​en miniserie, der dækker forskellene i overbelastning, skygger og tilsidesættelse i VB.NET. Denne artikel dækker tilsidesættelse. Artiklerne, der dækker de andre, er her:

-> Overbelastning
-> Skygger

Disse teknikker kan være enormt forvirrende; der er mange kombinationer af disse nøgleord og de underliggende arvemuligheder. Microsofts egen dokumentation begynder ikke at gøre emnet retfærdigt, og der er en masse dårlige eller forældede oplysninger på nettet. Det bedste råd for at være sikker på, at dit program er kodet korrekt, er "Test, test og test igen." I denne serie skal vi se på dem én ad gangen med vægt på forskellene.

tilsidesætter

Det, Shadows, Overloads og Overrides alle har til fælles, er, at de genbruger navnet på elementer, mens de ændrer, hvad der sker. Skygger og overbelastning kan fungere både inden for samme klasse eller når a klasse arver en anden klasse. Tilsidesættelse kan dog kun bruges i en afledt klasse (undertiden kaldet en barneklasse), der arver fra en

instagram viewer
baseklasse (kaldes nogle gange en forældreklasse). Og tilsidesættelse er hammeren; det giver dig mulighed for helt at erstatte en metode (eller en egenskab) fra en baseklasse.

I artiklen om klasser og Shadows-nøgleordet (se: Shadows in VB.NET) blev der tilføjet en funktion for at vise, at der kunne henvises til en arvet procedure.

Public Class ProfessionalKontakt. '... kode vises ikke... Offentlig funktion HashTheName ( ByVal nm som streng) som streng. Retur nm. GetHashCode. Slut Funktion. Slutteklasse.

Koden, der instantierer en klasse, der er afledt af denne (CodedProfessionalContact i eksemplet), kan kalde denne metode, fordi den er arvet.

I eksemplet brugte jeg VB.NET GetHashCode metode til at holde koden enkel, og dette gav et ret nytteløst resultat, værdien -520086483. Antag, at jeg ville have et andet resultat returneret i stedet for, men,

-> Jeg kan ikke ændre baseklassen. (Måske er alt, hvad jeg har, kompileret kode fra en leverandør.)

... og ...

-> Jeg kan ikke ændre opkaldskoden (måske er der tusind eksemplarer, og jeg kan ikke opdatere dem.)

Hvis jeg kan opdatere den afledte klasse, kan jeg ændre det returnerede resultat. (For eksempel kan koden være en del af en opdaterbar DLL.)

Der er et problem. Fordi det er så omfattende og kraftfuldt, skal du have tilladelse fra baseklassen til at bruge Overrides. Men godt designede kodebiblioteker leverer det. (Dine kodebiblioteker er alle godt designet, ikke?) For eksempel er den leverede Microsoft-funktion, vi lige har brugt, overvældelig. Her er et eksempel på syntaks.

Offentlig overkoblet funktion GetHashCode som heltal

Så dette nøgleord skal også være til stede i vores eksempelbaseklasse.

Offentlig overskydelig funktion HashTheName ( ByVal nm som streng) som streng.

Overskridelse af metoden er nu så simpelt som at levere en ny med Overrides-søgeordet. Visual Studio giver dig igen en løbende start ved at udfylde koden til dig med AutoComplete. Når du indtaster ...


Offentlig tilsidesættelse af funktion HashTheName (

Visual Studio tilføjer resten af ​​koden automatisk, så snart du indtaster åbningsparentesen, inklusive return-sætningen, der kun kalder den originale funktion fra baseklassen. (Hvis du bare tilføjer noget, er det normalt en god ting at gøre, når din nye kode alligevel er kørt.)

Offentlig tilsidesættelse af funktion HashTheName ( nm som streng) som streng. Returner MyBase. HashTheName (nm) Slut Funktion.

I dette tilfælde vil jeg dog erstatte metoden med noget andet, der er lige så ubrugeligt bare for at illustrere, hvordan det gøres: VB.NET-funktionen, der vil vende strengen.

Offentlig tilsidesættelse af funktion HashTheName ( nm som streng) som streng. Returner Microsoft. VisualBasic. StrReverse (nm) Slut Funktion.

Nu får opkaldskoden et helt andet resultat. (Sammenlign med resultatet i artiklen om Shadows.)


KontaktID: 246. Forretningsnavn: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Du kan også tilsidesætte egenskaber. Lad os antage, at du besluttede, at ContactID-værdier større end 123 ikke ville være tilladt og skulle som standard være 111. Du kan bare tilsidesætte ejendommen og ændre den, når ejendommen gemmes:

Privat _KontaktID som heltal. Offentlig tilsidesætter ejendomskontaktID som heltal. Få. Retur _KontaktID. Slut Get. Sæt (ByVal-værdi som heltal) Hvis værdi> 123 Derefter. _KontaktID = 111. Andet. _ContactID = værdi. Afslut Hvis. Afslut sæt. Slut ejendom.

Så får du dette resultat, når en større værdi er bestået:


KontaktID: 111. Forretningsnavn: Damsel Rescuers, LTD. 

I den hidtidige eksempelkode fordobles heltalværdier i det nye subrutine (Se artiklen om skygger), så et heltal på 123 ændres til 246 og ændres derefter igen til 111.

VB.NET giver dig endnu mere kontrol ved at lade en baseklasse specifikt kræve eller nægte en afledt klasse at tilsidesætte ved hjælp af MustOverride og NotOverridable nøgleord i baseklassen. Men begge af disse bruges i forholdsvis specifikke tilfælde. For det første NotOverridable.

Da standard for en offentlig klasse er NotOverridable, hvorfor skulle du nogensinde nødt til at specificere den? Hvis du prøver det på HashTheName-funktionen i baseklassen, får du en syntaksfejl, men teksten til fejlmeddelelsen giver dig en anelse:

'NotOverridable' kan ikke specificeres for metoder, der ikke tilsidesætter en anden metode.

Standard for en overstyret metode er netop det modsatte: Overdrivbar. Så hvis du ønsker tilsidesættelse for bestemt at stoppe der, skal du angive NotOverridable på denne metode. I vores eksempelkode:


Offentlig NotOredridable tilsidesætter Funktion HashTheName (... 

Så hvis klassen CodedProfessionalContact igen er arvet ...


Offentlig klasse NotOverridableEx. Inherits CodedProfessionelKontakt. 

... funktionen HashTheName kan ikke tilsidesættes i den klasse. Et element, der ikke kan tilsidesættes, kaldes undertiden et forseglet element.

En grundlæggende del af det .NET Foundation er at kræve, at formålet med hver klasse udtrykkeligt defineres for at fjerne al usikkerhed. Et problem på tidligere OOP-sprog er blevet kaldt "den skrøbelige baseklasse." Dette sker når en base klasse tilføjer en ny metode med det samme navn som et metodenavn i en underklasse, der arver fra en base klasse. Programmereren, der skrev underklassen, havde ikke planer om at tilsidesætte grundklassen, men det er nøjagtigt hvad der sker alligevel. Dette har været kendt for at resultere i skrig fra den sårede programmør, ”Jeg har ikke ændret noget, men mit program styrtede ned alligevel. "Hvis der er en mulighed for, at en klasse opdateres i fremtiden og skaber dette problem, skal du erklære det som NotOverridable.

MustOverride bruges oftest i det, der kaldes en abstrakt klasse. (I C # bruger den samme ting nøgleordet Abstract!) Dette er en klasse, der bare giver en skabelon, og du forventes at udfylde den med din egen kode. Microsoft leverer dette eksempel på et:

Vaskemaskine til offentlig brug af arv. Under nyt () 'Kode til at indlede klassen går her. Afslut under. Offentlig MustOverride Sub Wash. Offentlig MustOverride subskylning (loadSize som heltal) Offentlig MustOverride-funktionsspin (hastighed som heltal) som lang. Slutteklasse.

For at fortsætte Microsofts eksempel vil vaskemaskiner gøre disse ting (Wash, Rinse and Spin) helt anderledes, så der er ingen fordel ved at definere funktionen i baseklassen. Men der er en fordel ved at sikre, at enhver klasse, der arver denne gør definere dem. Løsningen: en abstrakt klasse.

Hvis du har brug for endnu mere forklaring om forskellene mellem overbelastning og tilsidesættelse, udvikles et helt andet eksempel i en hurtig tip: Overbelastning versus overforbrug

VB.NET giver dig endnu mere kontrol ved at tillade en baseklasse specifikt at kræve eller nægte en afledt klasse at tilsidesætte vha. MustOverride og NotOverridable nøgleord i baseklassen. Men begge af disse bruges i forholdsvis specifikke tilfælde. For det første NotOverridable.

Da standard for en offentlig klasse er NotOverridable, hvorfor skulle du nogensinde nødt til at specificere den? Hvis du prøver det på HashTheName-funktionen i baseklassen, får du en syntaksfejl, men teksten til fejlmeddelelsen giver dig en anelse:

'NotOverridable' kan ikke specificeres for metoder, der ikke tilsidesætter en anden metode.

Standard for en overstyret metode er netop det modsatte: Overdrivbar. Så hvis du ønsker tilsidesættelse for bestemt at stoppe der, skal du angive NotOverridable på denne metode. I vores eksempelkode:


Offentlig NotOredridable tilsidesætter Funktion HashTheName (... 

Så hvis klassen CodedProfessionalContact igen er arvet ...


Offentlig klasse NotOverridableEx. Inherits CodedProfessionelKontakt. 

... funktionen HashTheName kan ikke tilsidesættes i den klasse. Et element, der ikke kan tilsidesættes, kaldes undertiden et forseglet element.

En grundlæggende del af .NET Foundation er at kræve, at formålet med hver klasse udtrykkeligt defineres for at fjerne al usikkerhed. Et problem på tidligere OOP-sprog er blevet kaldt "den skrøbelige baseklasse." Dette sker når en base klasse tilføjer en ny metode med det samme navn som et metodenavn i en underklasse, der arver fra en base klasse. Programmereren, der skrev underklassen, havde ikke planer om at tilsidesætte grundklassen, men det er nøjagtigt hvad der sker alligevel. Dette har været kendt for at resultere i skrig fra den sårede programmør, ”Jeg har ikke ændret noget, men mit program styrtede ned alligevel. "Hvis der er en mulighed for, at en klasse opdateres i fremtiden og skaber dette problem, skal du erklære det som NotOverridable.

MustOverride bruges oftest i det, der kaldes en abstrakt klasse. (I C # bruger den samme ting nøgleordet Abstract!) Dette er en klasse, der bare giver en skabelon, og du forventes at udfylde den med din egen kode. Microsoft leverer dette eksempel på et:

Vaskemaskine til offentlig brug af arv. Under nyt () 'Kode til at indlede klassen går her. Afslut under. Offentlig MustOverride Sub Wash. Offentlig MustOverride subskylning (loadSize som heltal) Offentlig MustOverride-funktionsspin (hastighed som heltal) som lang. Slutteklasse.

For at fortsætte Microsofts eksempel vil vaskemaskiner gøre disse ting (Wash, Rinse and Spin) helt anderledes, så der er ingen fordel ved at definere funktionen i baseklassen. Men der er en fordel ved at sikre, at enhver klasse, der arver denne gør definere dem. Løsningen: en abstrakt klasse.

Hvis du har brug for endnu mere forklaring om forskellene mellem overbelastning og tilsidesættelse, udvikles et helt andet eksempel i en hurtig tip: Overbelastning versus overforbrug