Istraživanje virtualnih i apstraktnih metoda u C #

Programski jezik C # pruža podršku i za virtualne i za apstraktne metode, od kojih svaka ima različite prednosti. Za implementaciju kasnog vezanja koristite virtualne metode, dok apstraktne metode omogućuju prisiljavanje potklasa tipa da se metoda izričito nadjača. U ovom postu predstavit ću raspravu o virtualnim i apstraktnim metodama te o tome kada ih treba koristiti.

Virtualna metoda je ona koja je deklarirana kao virtualna u osnovnoj klasi. Metoda se deklarira kao virtualna navođenjem ključne riječi "virtual" u potpisu metode. Virtualna metoda može ili ne mora imati tip povratka. Virtualne metode omogućuju potklase tipa da nadjačaju metodu. Koriste se za provođenje polimorfizma u vremenu izvođenja ili kasnog vezanja. Treba napomenuti da se virtualni ili apstraktni članovi klase ne mogu deklarirati kao privatni. Također, možete imati implementaciju u virtualnoj metodi, tj. Virtualne metode mogu imati implementacije u sebi. Te se implementacije mogu nadjačati potklasama tipa u kojem je definirana virtualna metoda.

MSDN kaže: "Virtualna ključna riječ koristi se za modificiranje metode, svojstva, indeksatora ili deklaracije događaja i omogućava nadjačavanje u izvedenoj klasi."

Idemo sada kopati u neki kôd za bolju jasnost načina na koji se koriste virtualne metode. Pogledajte isječak koda u nastavku.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Metoda Test () deklarirana je kao virtualna u osnovnoj klasi i poništena je u izvedenoj klasi. Primijetite kako se virtualna ključna riječ koristi za deklariranje metode kao virtualne u osnovnoj klasi. Virtualna ključna riječ nije potrebna kada nadjačate virtualnu metodu u klasi Izvedeno.

Sada, pogledajte sljedeći isječak koda koji ilustrira kako se pozivaju virtualne metode.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Imajte na umu da su stvorene dvije instance klase Base - baseObj1 i baseObj2. U prvom slučaju, referentni objekt nazvan baseObj1 odnosi se na instancu klase Base. U drugom slučaju, referentni objekt nazvan baseObj2 odnosi se na instancu izvedene klase. Kada izvršite kôd, prvi poziv virtualne metode u konzoli će prikazati poruku "Ovo je osnovna verzija virtualne metode". U drugom slučaju prikazala bi se poruka "Ovo je izvedena verzija virtualne metode". Zašto ta razlika?

U prvom se slučaju razmatra vrsta referentnog objekta baseObj1 - budući da je osnovnog tipa, pozvat će se osnovna verzija virtualne metode. U drugom slučaju razmotrit će se kontekst referentnog objekta baseObj2, a time i rezultat.

Abstract methods are those that are declared abstract in the base class and cannot have implementations in them, i.e., they cannot have any functionality in them. You can use abstract methods when you would like the method to be overridden forcefully in the derived classes of the type in which the abstract method has been defined. This is enforced at compile time by the compiler. So, if you have declared a method as abstract using the abstract modifier in a base class, the subclasses of this class would have to implement the abstract method failing which the compiler would display an error stating that the derived class hasn't implemented the abstract member. In essence, an abstract method is declared using the abstract keyword in an abstract base class and non-abstract subclasses of this type have to have their own implementation of the abstract method. Abstract methods are also implicitly virtual in nature but you cannot use the virtual keyword when declaring an abstract method. It should be noted that abstract methods can only be declared inside abstract classes.

Tipična uporaba apstraktne metode je prisiljavanje nadjačavanja metoda ToString () ili Equals (). Sljedeći isječak koda ilustrira kako su apstraktne metode deklarirane u apstraktnoj klasi s imenom EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

Klasa EntityBase osnovni je tip za sve entitete - klasa entiteta Customer proširuje ovu klasu i pruža implementaciju apstraktnih metoda. U osnovi, sve klase entiteta osigurale bi vlastitu implementaciju metoda ToString () i Equals (). Nije potrebna zadana implementacija ovih metoda u osnovnoj klasi i stoga su označene kao apstraktne. Dakle, nadjačavanje metode se nameće deklariranjem metode kao apstraktne u osnovnoj klasi nazvanoj EntityBase.