Programiranje

Raziskovanje virtualnih in abstraktnih metod v jeziku C #

Programski jezik C # nudi podporo tako virtualnim kot abstraktnim metodam, od katerih ima vsaka svoje prednosti. Za izvajanje pozne vezave uporabljate navidezne metode, medtem ko abstraktne metode omogočajo vsiljevanje podrazredov tipa, da je metoda izrecno preglašena. V tem prispevku bom predstavil razpravo o virtualnih in abstraktnih metodah ter o tem, kdaj jih je treba uporabiti.

Navidezna metoda je tista, ki je v osnovnem razredu razglašena za navidezno. Metoda je deklarirana kot virtualna z določitvijo ključne besede "virtual" v podpisu metode. Navidezna metoda ima lahko ali pa tudi ne vrnjeni tip. Navidezne metode omogočajo, da podrazredi tipa preglasijo metodo. Uporabljajo se za izvajanje polimorfizma med izvajanjem ali pozne vezave. Treba je opozoriti, da virtualnih ali abstraktnih članov razreda ni mogoče razglasiti za zasebne. Prav tako lahko imate izvedbo v navidezni metodi, tj.Navidezne metode imajo lahko izvedbe v njih. Te izvedbe lahko preglasijo podrazredi tipa, v katerem je bila definirana virtualna metoda.

MSDN navaja: "Navidezna ključna beseda se uporablja za spreminjanje metode, lastnosti, indeksatorja ali izjave o dogodku in omogoči, da jo v izpeljanem razredu preglasi."

Poglejmo zdaj nekaj kode za boljšo jasnost uporabe virtualnih metod. Glejte spodnji delček kode.

javni razred Base

{

javni preskus navidezne praznine ()

{

Console.WriteLine ("To je osnovna različica navidezne metode");

}

}

javni razred Izvedeno: Baza

{

javni preskus razveljavitve void ()

{

Console.WriteLine ("To je izpeljana različica navidezne metode");

}

}

Metoda Test () je v osnovnem razredu deklarirana kot navidezna in je v razredu Izpeljana razveljavljena. Upoštevajte, kako se navidezna ključna beseda uporablja za razglasitev metode kot navidezne v osnovnem razredu. Navidezna ključna beseda ni potrebna, če preglasite navidezno metodo v razredu Izvedeno.

Zdaj si oglejte delček kode, ki sledi, ki ponazarja, kako se kličejo virtualne metode.

razredni program

{

statična praznina Main ()

{

Base baseObj1 = new Base ();

baseObj1.Test ();

Base baseObj2 = novo Izvedeno ();

baseObj2.Test ();

}

}

Upoštevajte, da sta ustvarjena dva primerka osnovnega razreda - baseObj1 in baseObj2. V prvem primeru se referenčni objekt z imenom baseObj1 nanaša na primerek osnovnega razreda. V drugem primeru se referenčni objekt z imenom baseObj2 nanaša na primerek razreda Izvedeno. Ko zaženete kodo, bo prvi klic navidezne metode v konzoli prikazal sporočilo "To je osnovna različica navidezne metode". V drugem primeru bi se prikazalo sporočilo "To je izpeljana različica virtualne metode". Zakaj ta razlika?

V prvem primeru se upošteva vrsta referenčnega predmeta baseObj1 - ker je osnovnega tipa, bo poklicana osnovna različica virtualne metode. V drugem primeru bo upoštevan kontekst referenčnega predmeta baseObj2 in s tem rezultat.

Abstraktne metode so tiste, ki so v osnovnem razredu razglašene za abstraktne in v njih ne morejo imeti izvedb, torej ne morejo imeti nobene funkcionalnosti. Abstraktne metode lahko uporabite, kadar želite, da se metoda v izpeljanih razredih tipa, v katerem je bila abstraktna metoda definirana, na silo preglasi. To v času prevajanja uveljavi prevajalnik. Torej, če ste metodo razglasili za abstraktno z uporabo abstraktnega modifikatorja v osnovnem razredu, bi morali podrazredi tega razreda izvesti abstraktno metodo, v nasprotnem primeru pa bi prevajalnik prikazal napako, da izpeljani razred ni implementiral abstrakta. član. V bistvu je abstraktna metoda deklarirana z uporabo abstraktne ključne besede v abstraktnem osnovnem razredu in ne-abstraktni podrazredi te vrste morajo imeti lastno izvedbo abstraktne metode. Tudi abstraktne metode so implicitno navidezne, vendar pri razglasitvi abstraktne metode ne morete uporabiti ključne besede virtual. Treba je opozoriti, da je abstraktne metode mogoče prijaviti samo znotraj abstraktnih razredov.

Tipična uporaba abstraktne metode je vsiljevanje preglasitve metod ToString () ali Equals (). Naslednji delček kode prikazuje, kako so abstraktne metode deklarirane v abstraktnem razredu z imenom EntityBase.

javni abstraktni razred EntityBase

{

javni abstrakt preglasi niz ToString ();

javni povzetek preglasi bool Enako (objekt obj);

}

javni razred Naročnik: EntityBase

{

// Implementacijska koda za abstraktne metode

}

Razred EntityBase je osnovni tip za vse entitete - razred entitete Customer razširi ta razred in zagotavlja izvedbo abstraktnih metod. V bistvu bi vsi razredi entitet zagotovili lastno izvajanje metod ToString () in Equals (). Privzeta izvedba teh metod v osnovnem razredu ni potrebna, zato so označene kot abstraktne. Torej, preglasitev metode se uveljavi z razglasitvijo metode kot abstraktne v osnovnem razredu z imenom EntityBase.

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