Programování

Zkoumání virtuálních a abstraktních metod v C #

Programovací jazyk C # poskytuje podporu pro virtuální i abstraktní metody, z nichž každá má odlišné výhody. K implementaci pozdní vazby používáte virtuální metody, zatímco abstraktní metody vám umožňují vynutit podtřídy typu, aby byla metoda explicitně přepsána. V tomto příspěvku představím diskusi o virtuálních i abstraktních metodách a o tom, kdy by měly být použity.

Virtuální metoda je metoda, která je v základní třídě deklarována jako virtuální. Metoda je deklarována jako virtuální zadáním klíčového slova „virtuální“ v podpisu metody. Virtuální metoda může, ale nemusí mít návratový typ. Virtuální metody umožňují podtřídám typu přepsat metodu. Používají se k implementaci běhového polymorfismu nebo pozdní vazby. Je třeba poznamenat, že virtuální nebo abstraktní členové třídy nelze deklarovat jako soukromé. Také můžete mít implementaci ve virtuální metodě, tj. Virtuální metody mohou mít implementace v nich. Tyto implementace lze přepsat podtřídami typu, ve kterém byla virtuální metoda definována.

MSDN uvádí: "Virtuální klíčové slovo se používá k úpravě metody, vlastnosti, indexeru nebo deklarace události a k ​​povolení přepsání v odvozené třídě."

Pojďme nyní kopat do nějakého kódu pro lepší přehlednost toho, jak se používají virtuální metody. Viz níže uvedený fragment kódu.

veřejná třída Base

{

test veřejné virtuální neplatnosti ()

{

Console.WriteLine ("Toto je základní verze virtuální metody");

}

}

veřejná třída Odvozeno: Základna

{

test neplatnosti veřejného přepsání ()

{

Console.WriteLine ("Toto je odvozená verze virtuální metody");

}

}

Metoda Test () je ve třídě Base deklarována jako virtuální a ve třídě Derived je přepsána. Všimněte si, jak se virtuální klíčové slovo používá k deklaraci metody jako virtuální ve třídě Base. Virtuální klíčové slovo není potřeba, když přepíšete virtuální metodu ve třídě Derived.

Nyní se podívejte na níže uvedený fragment kódu, který ilustruje způsob volání virtuálních metod.

třídní program

{

static void Main ()

{

Base baseObj1 = nový Base ();

baseObj1.Test ();

Base baseObj2 = new Derived ();

baseObj2.Test ();

}

}

Všimněte si, že jsou vytvořeny dvě instance třídy Base - baseObj1 a baseObj2. V prvním případě odkazuje referenční objekt s názvem baseObj1 na instanci třídy Base. Ve druhém případě odkazuje referenční objekt s názvem baseObj2 na instanci odvozené třídy. Když spustíte kód, při prvním volání virtuální metody se v konzole zobrazí zpráva „Toto je základní verze virtuální metody“. V druhém případě by se zobrazila zpráva „Toto je odvozená verze virtuální metody“. Proč tento rozdíl?

V prvním případě je považován za typ referenčního objektu baseObj1 - protože je typu Base, bude volána základní verze virtuální metody. V druhém případě bude zvážen kontext referenčního objektu baseObj2, a tedy výsledek.

Abstraktní metody jsou ty, které jsou v základní třídě deklarovány jako abstraktní a nemohou mít v sobě implementace, tj. Nemohou mít v sobě žádnou funkci. Abstraktní metody můžete použít, pokud chcete, aby byla metoda v odvozených třídách typu, ve kterém byla definována abstraktní metoda, přepsána silou. Toto je vynuceno v době kompilace kompilátorem. Takže pokud jste deklarovali metodu jako abstraktní pomocí abstraktního modifikátoru v základní třídě, podtřídy této třídy by musely implementovat selhání abstraktní metody, která by kompilátor zobrazila chybu s uvedením, že odvozená třída neimplementovala abstrakt člen. V zásadě je abstraktní metoda deklarována pomocí abstraktního klíčového slova v abstraktní základní třídě a neabrativní podtřídy tohoto typu musí mít vlastní implementaci abstraktní metody. Abstraktní metody jsou také implicitně virtuální, ale při deklaraci abstraktní metody nemůžete použít virtuální klíčové slovo. Je třeba poznamenat, že abstraktní metody lze deklarovat pouze uvnitř abstraktních tříd.

Typickým použitím abstraktní metody je vynucení přepsání metod ToString () nebo Equals (). Následující fragment kódu ukazuje, jak jsou abstraktní metody deklarovány v abstraktní třídě s názvem EntityBase.

veřejná abstraktní třída EntityBase

{

veřejný abstraktní přepisovací řetězec ToString ();

public abstract override bool Equals (objekt obj);

}

veřejná třída Zákazník: EntityBase

{

// Implementační kód pro abstraktní metody

}

Třída EntityBase je základním typem pro všechny entity - třída entity Zákazník rozšiřuje tuto třídu a poskytuje implementaci pro abstraktní metody. V podstatě by všechny třídy entit poskytovaly vlastní implementaci metod ToString () a Equals (). V základní třídě není potřeba žádná výchozí implementace pro tyto metody, a proto jsou označeny jako abstraktní. Přepsání metody je tedy vynuceno deklarováním metody jako abstraktní v základní třídě s názvem EntityBase.