Проучване на виртуални и абстрактни методи в C #

Езикът за програмиране C # осигурява поддръжка както за виртуални, така и за абстрактни методи, всеки от които има различни предимства. Използвате виртуални методи за внедряване на късно свързване, докато абстрактните методи ви позволяват да принудите подкласовете от типа методът да бъде изрично заменен. В този пост ще представя дискусия както за виртуалните, така и за абстрактните методи и кога те трябва да бъдат използвани.

Виртуален метод е този, който е деклариран като виртуален в базовия клас. Методът се декларира като виртуален, като се посочи ключовата дума „виртуален“ в сигнатурата на метода. Виртуалният метод може или не може да има тип на връщане. Виртуалните методи позволяват подкласовете от типа да заменят метода. Те се използват за реализиране на полиморфизъм по време на изпълнение или късно свързване. Трябва да се отбележи, че виртуални или абстрактни членове на клас не могат да бъдат декларирани като частни. Също така можете да имате реализация във виртуален метод, т.е. виртуалните методи могат да имат реализации в тях. Тези изпълнения могат да бъдат заменени от подкласовете на типа, в който е дефиниран виртуалният метод.

MSDN гласи: „Виртуалната ключова дума се използва за модифициране на метод, свойство, индексатор или декларация за събитие и позволява тя да бъде заменена в производен клас.“

Нека сега да разровим малко код за по-голяма яснота как се използват виртуалните методи. Обърнете се към кодовия фрагмент по-долу.

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");

}

}

Методът Test () е деклариран като виртуален в базовия клас и е заменен в производния клас. Обърнете внимание как виртуалната ключова дума се използва за деклариране на метода като виртуален в базовия клас. Виртуалната ключова дума не е необходима, когато замените виртуалния метод в класа Производен.

Сега се обърнете към кодовия фрагмент, даден по-нататък, който илюстрира как се извикват виртуални методи.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Имайте предвид, че са създадени два екземпляра на базовия клас - baseObj1 и baseObj2. В първия случай референтният обект с име baseObj1 се отнася до екземпляр на базовия клас. Във втория случай референтният обект с име baseObj2 се отнася до екземпляр на производния клас. Когато изпълнявате кода, първото извикване на виртуалния метод ще покаже съобщението "Това е основната версия на виртуалния метод" в конзолата. Във втория случай ще се покаже съобщението „Това е производната версия на виртуалния метод“. Защо тази разлика?

В първия случай се разглежда типа на референтния обект baseObj1 - тъй като е от базовия тип, ще бъде извикана базовата версия на виртуалния метод. Във втория случай ще бъде разгледан контекстът на референтния обект baseObj2 и следователно резултатът.

Абстрактните методи са тези, които са обявени за абстрактни в базовия клас и не могат да имат имплементации в тях, т.е. те не могат да имат никаква функционалност в тях. Можете да използвате абстрактни методи, когато искате методът да бъде заменен принудително в производни класове от типа, в който абстрактният метод е дефиниран. Това се налага по време на компилация от компилатора. Така че, ако сте декларирали метод като абстрактен, използвайки модификатора на абстракт в основен клас, подкласовете на този клас ще трябва да внедрят абстрактния метод, при който компилаторът ще покаже грешка, заявявайки, че производният клас не е реализирал абстрактния член. По същество,абстрактен метод се декларира с помощта на абстрактната ключова дума в абстрактен основен клас и не абстрактни подкласове от този тип трябва да имат собствена реализация на абстрактния метод. Абстрактните методи също имат имплицитен виртуален характер, но не можете да използвате ключовата дума virtual, когато декларирате абстрактен метод. Трябва да се отбележи, че абстрактните методи могат да бъдат декларирани само в абстрактни класове.

Типично използване на абстрактен метод е принудително отменяне на методите ToString () или Equals (). Следният кодов фрагмент илюстрира как абстрактните методи се декларират в абстрактния клас с име 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

}

Класът EntityBase е базовият тип за всички обекти - класът обект на клиента разширява този клас и осигурява изпълнение за абстрактните методи. По същество всички класове обекти биха осигурили собствена реализация на методите ToString () и Equals (). Не е необходимо прилагане по подразбиране за тези методи в базовия клас и следователно те са маркирани като абстрактни. И така, заместването на метода се налага чрез деклариране на метода като абстрактен в базовия клас, наречен EntityBase.