Programmering

Utforske virtuelle og abstrakte metoder i C #

Programmeringsspråket C # gir støtte for både virtuelle og abstrakte metoder, som hver har forskjellige fordeler. Du bruker virtuelle metoder for å implementere sen binding, mens abstrakte metoder gjør det mulig for deg å tvinge underklassene av typen til å ha metoden eksplisitt overstyrt. I dette innlegget vil jeg presentere en diskusjon om både virtuelle og abstrakte metoder og når de skal brukes.

En virtuell metode er en som blir erklært virtuell i basisklassen. En metode blir erklært som virtuell ved å spesifisere nøkkelordet "virtuelt" i metodesignaturen. En virtuell metode kan ha eller ikke ha en returtype. Virtuelle metoder tillater at underklasser av typen overstyrer metoden. De brukes til å implementere polymorfisme eller sen binding. Det skal bemerkes at virtuelle eller abstrakte medlemmer av en klasse ikke kan erklæres som private. Du kan også ha en implementering i en virtuell metode, dvs. virtuelle metoder kan ha implementeringer i seg. Disse implementeringene kan overstyres av underklassene av typen den virtuelle metoden er definert i.

MSDN uttaler: "Det virtuelle nøkkelordet brukes til å endre en metode, eiendom, indekser eller hendelseserklæring og tillate at den overstyres i en avledet klasse."

La oss nå grave inn i noen koder for bedre klarhet i hvordan virtuelle metoder brukes. Se kodebiten nedenfor.

offentlig klasse Base

{

offentlig virtuell ugyldighetstest ()

{

Console.WriteLine ("Dette er basisversjonen av den virtuelle metoden");

}

}

offentlig klasse Avledet: Base

{

offentlig overstyring ugyldig test ()

{

Console.WriteLine ("Dette er den avledede versjonen av den virtuelle metoden");

}

}

Test () -metoden blir erklært virtuell i baseklassen og overstyres i avledet klasse. Legg merke til hvordan det virtuelle nøkkelordet brukes til å erklære metoden som virtuell i Base-klassen. Det virtuelle nøkkelordet er ikke nødvendig når du overstyrer den virtuelle metoden i avledet klasse.

Henvis nå til kodebiten som er gitt neste som illustrerer hvordan virtuelle metoder kalles.

klasse Program

{

statisk tomrom Main ()

{

Base baseObj1 = ny Base ();

baseObj1.Test ();

Base baseObj2 = ny avledet ();

baseObj2.Test ();

}

}

Merk at to forekomster av Base-klassen opprettes - baseObj1 og baseObj2. I det første tilfellet refererer referanseobjektet med navnet baseObj1 til en forekomst av Base-klassen. I det andre tilfellet refererer referanseobjektet med navnet baseObj2 til en forekomst av klassen Derived. Når du utfører koden, vil den første samtalen til den virtuelle metoden vise meldingen "Dette er basisversjonen av den virtuelle metoden" i konsollen. I det andre tilfellet vises meldingen "Dette er den avledede versjonen av den virtuelle metoden". Hvorfor denne forskjellen?

I det første tilfellet vurderes typen referanseobjekt baseObj1 - siden den er av basetype, vil baseversjonen av den virtuelle metoden kalles. I det andre tilfellet vil konteksten til referanseobjektet baseObj2 bli vurdert og dermed resultatet.

Abstrakte metoder er de som blir erklært abstrakte i basisklassen og ikke kan ha implementeringer i seg, dvs. de kan ikke ha noen funksjonalitet i seg. Du kan bruke abstrakte metoder når du vil at metoden skal overstyres kraftig i de avledede klassene av typen der den abstrakte metoden er definert. Dette håndheves på kompileringstidspunktet av kompilatoren. Så hvis du har erklært en metode som abstrakt ved å bruke den abstrakte modifikatoren i en basisklasse, vil underklassene til denne klassen måtte implementere den abstrakte metoden som ikke har kompilatoren vist en feil om at den avledede klassen ikke har implementert abstrakt. medlem. I det vesentlige blir en abstrakt metode erklært ved hjelp av det abstrakte nøkkelordet i en abstrakt baseklasse, og ikke-abstrakte underklasser av denne typen må ha sin egen implementering av den abstrakte metoden. Abstrakte metoder er også implisitt virtuelle, men du kan ikke bruke det virtuelle nøkkelordet når du erklærer en abstrakt metode. Det skal bemerkes at abstrakte metoder kun kan erklæres i abstrakte klasser.

En typisk bruk av en abstrakt metode er å tvinge overstyring av ToString () eller Equals () -metodene. Følgende kodebit illustrerer hvordan abstrakte metoder blir erklært i en abstrakt klasse med navnet EntityBase.

offentlig abstrakt klasse EntityBase

{

offentlig abstrakt overstyring streng ToString ();

offentlig abstrakt overstyring bool lik (objekt obj);

}

offentlig klasse kunde: EntityBase

{

// Implementeringskode for abstrakte metoder

}

EntityBase-klassen er basistypen for alle enheter - klassen EntityBase utvider denne klassen og gir implementering for de abstrakte metodene. I hovedsak vil alle enhetsklasser gi sin egen implementering av ToString () og Equals () -metodene. Ingen standardimplementering for disse metodene er nødvendig i basisklassen, og de er derfor markert som abstrakte. Så håndheving av metode håndheves ved å erklære metoden som abstrakt i basisklassen med navnet EntityBase.

$config[zx-auto] not found$config[zx-overlay] not found