Programovanie

Skúmanie virtuálnych a abstraktných metód v C #

Programovací jazyk C # poskytuje podporu pre virtuálne aj abstraktné metódy, z ktorých každá má odlišné výhody. Na implementáciu neskorej väzby používate virtuálne metódy, zatiaľ čo abstraktné metódy vám umožňujú vynútiť podtriedy typu, aby bola metóda explicitne prepísaná. V tomto príspevku predstavím diskusiu o virtuálnych aj abstraktných metódach a o tom, kedy by sa mali používať.

Virtuálna metóda je taká, ktorá je v základnej triede deklarovaná ako virtuálna. Metóda je deklarovaná ako virtuálna zadaním kľúčového slova „virtual“ v podpise metódy. Virtuálna metóda môže, ale nemusí mať návratový typ. Virtuálne metódy umožňujú, aby podtriedy typu prepísali metódu. Používajú sa na implementáciu polymorfizmu za behu alebo neskorej väzby. Je potrebné poznamenať, že virtuálnych alebo abstraktných členov triedy nemožno vyhlásiť za súkromných. Môžete tiež mať implementáciu vo virtuálnej metóde, t. J. Virtuálne metódy môžu mať implementácie v nich. Tieto implementácie môžu byť prepísané podtriedami typu, v ktorom bola definovaná virtuálna metóda.

MSDN uvádza: "Virtuálne kľúčové slovo sa používa na úpravu metódy, vlastnosti, indexátora alebo deklarácie udalosti a na jej prepísanie v odvodenej triede."

Poďme sa teraz ponoriť do nejakého kódu, aby sme lepšie pochopili, ako sa používajú virtuálne metódy. Prečítajte si útržok kódu uvedený nižšie.

verejná trieda Base

{

test verejnej virtuálnej neplatnosti ()

{

Console.WriteLine ("Toto je základná verzia virtuálnej metódy");

}

}

verejná trieda Odvodené: základňa

{

test neplatnosti verejného prepísania ()

{

Console.WriteLine ("Toto je odvodená verzia virtuálnej metódy");

}

}

Metóda Test () je v triede Base deklarovaná ako virtuálna a v triede Derived je prepísaná. Všimnite si, ako sa virtuálne kľúčové slovo používa na deklarovanie metódy ako virtuálnej v triede Base. Virtuálne kľúčové slovo nie je potrebné, keď prepíšete virtuálnu metódu v triede Derived.

Teraz si pozrite nasledujúci útržok kódu, ktorý ilustruje, ako sa volajú virtuálne metódy.

triedny program

{

static void Main ()

{

Base baseObj1 = nový Base ();

baseObj1.Test ();

Base baseObj2 = new Derived ();

baseObj2.Test ();

}

}

Upozorňujeme, že sú vytvorené dve inštancie triedy Base - baseObj1 a baseObj2. V prvom prípade referenčný objekt s názvom baseObj1 odkazuje na inštanciu triedy Base. V druhom prípade referenčný objekt s názvom baseObj2 odkazuje na inštanciu odvodenej triedy. Keď spustíte kód, pri prvom volaní virtuálnej metódy sa v konzole zobrazí správa „Toto je základná verzia virtuálnej metódy“. V druhom prípade by sa zobrazila správa „Toto je odvodená verzia virtuálnej metódy“. Prečo tento rozdiel?

V prvom prípade sa uvažuje o type referenčného objektu baseObj1 - keďže ide o typ Base, bude sa volať základná verzia virtuálnej metódy. V druhom prípade sa bude brať do úvahy kontext referenčného objektu baseObj2, a teda aj výsledok.

Abstraktné metódy sú tie, ktoré sú v základnej triede deklarované ako abstraktné a nemôžu mať v sebe implementácie, t. J. Nemôžu mať v sebe žiadnu funkcionalitu. Abstraktné metódy môžete použiť, ak chcete, aby bola metóda v odvodených triedach typu, v ktorom bola definovaná abstraktná metóda, silne prepísaná. Toto vynucuje kompilátor v čase kompilácie. Takže ak ste deklarovali metódu ako abstraktnú pomocou abstraktného modifikátora v základnej triede, podtriedy tejto triedy by museli implementovať abstraktnú metódu, ak by kompilátor zobrazil chybu o tom, že odvodená trieda neimplementovala abstraktnú členom. V zásade sa abstraktná metóda deklaruje pomocou abstraktného kľúčového slova v abstraktnej základnej triede a neabstrahové podtriedy tohto typu musia mať vlastnú implementáciu abstraktnej metódy. Abstraktné metódy majú tiež implicitne virtuálnu povahu, ale pri deklarovaní abstraktnej metódy nemôžete použiť kľúčové slovo virtual. Je potrebné poznamenať, že abstraktné metódy je možné deklarovať iba vo vnútri abstraktných tried.

Typickým použitím abstraktnej metódy je vynútenie prepísania metód ToString () alebo Equals (). Nasledujúci úryvok kódu ilustruje, ako sú abstraktné metódy deklarované v abstraktnej triede s názvom EntityBase.

verejná abstraktná trieda EntityBase

{

reťazec prepísania verejného abstraktu ToString ();

verejné abstraktné prepísanie bool Rovná sa (objekt obj);

}

verejná trieda Zákazník: EntityBase

{

// Implementačný kód pre abstraktné metódy

}

Trieda EntityBase je základným typom pre všetky entity - trieda entity Customer rozširuje túto triedu a poskytuje implementáciu pre abstraktné metódy. V podstate by všetky triedy entít poskytovali vlastnú implementáciu metód ToString () a Equals (). V základnej triede nie je potrebná žiadna predvolená implementácia týchto metód, a preto sú označené ako abstraktné. Prepísanie metódy sa teda vynúti vyhlásením metódy za abstraktnú v základnej triede s názvom EntityBase.

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