Programmering

Udforskning af virtuelle og abstrakte metoder i C #

Programmeringssproget C # understøtter både virtuelle og abstrakte metoder, som hver har forskellige fordele. Du bruger virtuelle metoder til at implementere sen binding, mens abstrakte metoder giver dig mulighed for at tvinge underklasser af typen til at have metoden eksplicit tilsidesat. I dette indlæg vil jeg præsentere en diskussion om både virtuelle og abstrakte metoder, og hvornår de skal bruges.

En virtuel metode er en, der erklæres som virtuel i basisklassen. En metode erklæres som virtuel ved at angive nøgleordet "virtuel" i metodesignaturen. En virtuel metode kan have en returtype eller måske ikke. Virtuelle metoder tillader, at underklasser af typen tilsidesætter metoden. De bruges til at implementere løbetidspolymorfisme eller sen binding. Det skal bemærkes, at virtuelle eller abstrakte medlemmer af en klasse ikke kan erklæres private. Du kan også have en implementering i en virtuel metode, dvs. virtuelle metoder kan have implementeringer i dem. Disse implementeringer kan tilsidesættes af underklasser af den type, hvor den virtuelle metode er defineret.

MSDN siger: "Det virtuelle nøgleord bruges til at ændre en metode, egenskab, indekser eller hændelseserklæring og tillade, at den tilsidesættes i en afledt klasse."

Lad os nu grave i noget kode for en bedre klarhed om, hvordan virtuelle metoder bruges. Se kodestykket nedenfor.

offentlig klasse Base

{

offentlig virtuel ugyldighedstest ()

{

Console.WriteLine ("Dette er basisversionen af ​​den virtuelle metode");

}

}

offentlig klasse Afledt: Base

{

offentlig tilsidesættelse ugyldig test ()

{

Console.WriteLine ("Dette er den afledte version af den virtuelle metode");

}

}

Test () -metoden erklæres som virtuel i baseklassen og tilsidesættes i afledt klasse. Bemærk, hvordan det virtuelle nøgleord bruges til at erklære metoden som virtuel i Base-klassen. Det virtuelle nøgleord er ikke nødvendigt, når du tilsidesætter den virtuelle metode i klassen Derived.

Henvis nu til kodestykket, der er givet næste, der illustrerer, hvordan virtuelle metoder kaldes.

klasse Program

{

statisk tomrum Main ()

{

Base baseObj1 = ny Base ();

baseObj1.Test ();

Base baseObj2 = ny afledt ();

baseObj2.Test ();

}

}

Bemærk, at der oprettes to forekomster af Base-klassen - baseObj1 og baseObj2. I det første tilfælde henviser referenceobjektet med navnet baseObj1 til en forekomst af Base-klassen. I det andet tilfælde henviser referenceobjektet navngivet baseObj2 til en forekomst af klassen Derived. Når du udfører koden, vil det første opkald til den virtuelle metode vise meddelelsen "Dette er basisversionen af ​​den virtuelle metode" i konsollen. I det andet tilfælde vises meddelelsen "Dette er den afledte version af den virtuelle metode". Hvorfor denne forskel?

I det første tilfælde betragtes typen af ​​referenceobjektet baseObj1 - da det er af basetypen, kaldes basisversionen af ​​den virtuelle metode. I det andet tilfælde vil sammenhængen med referenceobjektet baseObj2 blive betragtet, og dermed resultatet.

Abstrakte metoder er dem, der erklæres abstrakte i basisklassen og ikke kan have implementeringer i dem, dvs. de kan ikke have nogen funktionalitet i sig. Du kan bruge abstrakte metoder, når du ønsker, at metoden tilsidesættes kraftigt i de afledte klasser af den type, hvor den abstrakte metode er defineret. Dette håndhæves ved kompileringstidspunktet af kompilatoren. Så hvis du har erklæret en metode som abstrakt ved hjælp af den abstrakte modifikator i en basisklasse, skal underklasserne i denne klasse implementere den abstrakte metode, hvis ikke compileren viser en fejl, der angiver, at den afledte klasse ikke har implementeret abstrakt medlem. I det væsentlige erklæres en abstrakt metode ved hjælp af det abstrakte nøgleord i en abstrakt basisklasse, og ikke-abstrakte underklasser af denne type skal have deres egen implementering af den abstrakte metode. Abstrakte metoder er også implicit virtuelle, men du kan ikke bruge det virtuelle nøgleord, når du erklærer en abstrakt metode. Det skal bemærkes, at abstrakte metoder kun kan erklæres inden for abstrakte klasser.

En typisk anvendelse af en abstrakt metode er at tvinge tilsidesættelse af ToString () eller Equals () -metoderne. Følgende kodestykke illustrerer, hvordan abstrakte metoder erklæres i en abstrakt klasse med navnet EntityBase.

offentlig abstrakt klasse EntityBase

{

offentlig abstrakt tilsidesættelse streng ToString ();

offentlig abstrakt tilsidesætter bool Lige (objekt obj);

}

offentlig klasse kunde: EntityBase

{

// Implementeringskode til de abstrakte metoder

}

EntityBase-klassen er basistypen for alle enheder - klassen EntityBase udvider denne klasse og giver implementering af de abstrakte metoder. I det væsentlige vil alle enhedsklasser levere deres egen implementering af metoderne ToString () og Equals (). Ingen standardimplementering af disse metoder er nødvendig i basisklassen, og derfor er de markeret som abstrakte. Så tilsidesættelse af metode håndhæves ved at erklære metoden som abstrakt i basisklassen ved navn EntityBase.

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