Виртуална срещу абстрактна
Виртуалната и абстрактната са две ключови думи, използвани в повечето обектно ориентирани (OO) програмни езици като Java и C #. Въпреки че има малки разлики в това какво означава на различни езици, както виртуалните, така и абстрактните ключови думи осигуряват усещане за частична реализация на субектите, към които се прикрепя.
абстрактен
Обикновено абстрактните класове, известни също като абстрактни базови класове (ABC), не могат да бъдат създадени (екземпляр от този клас не може да бъде създаден). Така че абстрактните класове имат смисъл да имат само ако езикът на програмиране поддържа наследяване (способност за създаване на подкласове от разширяване на клас). Абстрактните класове обикновено представляват абстрактно понятие или образувание с частично или без прилагане. Следователно абстрактните класове действат като родителски класове, от които се извличат детски класове, така че класът деца ще споделя непълноценните характеристики на родителския клас и може да се добави функционалност за завършването им. Абстрактните класове могат да съдържат абстрактни методи. Подкласовете, разширяващи абстрактен клас, могат да реализират тези (наследени) абстрактни методи. Ако детският клас прилага всички такива абстрактни методи, това е конкретен клас. Но ако това не стане, класът на децата също се превръща в абстрактен клас. Всичко това означава, че когато програмистът определи клас като абстракт, тя казва, че класът ще бъде непълен и ще има елементи, които трябва да бъдат попълнени от наследяващите подкласове. Това е хубав начин за създаване на договор между двама програмисти, който опростява задачите в разработката на софтуер. Програмистът, който пише код за наследяване, трябва точно да следва определенията на метода (но разбира се, може да има собствена реализация). В Java и C #, абстрактните класове и методи се декларират с помощта на абстрактната ключова дума.
Виртуален
Виртуалните методи / функции предоставят възможността по избор да надменят поведението си от наследяващ клас (използвайки функция със същия подпис). Концепцията за виртуална функция е важна в следния сценарий. Да предположим, че даден клас е производен от детски клас, тогава, когато се използва обект от производния клас, той може да се отнася до обект от базовия клас или производния клас. Но поведението на обажданията на методите може да бъде нееднозначно, ако методите на базовия клас са надминати. Така че, за да се разреши тази неяснота, се използва виртуална ключова дума. Ако методът е маркиран Виртуален, тогава функцията на извлечения клас се извиква (ако има такава) или иначе се нарича функцията на базовия клас. Например в C ++ виртуалната ключова дума се използва точно за тази цел. В C #, виртуалната ключова дума се използва по подобен начин, но в допълнение, ключовата дума трябва да бъде използвана за промяна на всички отменени методи. Но в Java няма явна виртуална ключова дума. Всички нестатични методи се считат за виртуални. Виртуалните функции без тяло се наричат чисти виртуални функции. В Java и C #, абстрактните методи всъщност са Pure Virtual.
Разлика между виртуално и абстрактно
Въпреки че Абстрактна и Виртуална са две ключови думи / концепции, които осигуряват смисъл на непълното им изпълнение на асоциираните й образувания, те имат своите разлики. Абстрактните методи (които трябва да бъдат дефинирани в абстрактните класове) изобщо нямат реализация, докато виртуалните методи могат да имат изпълнение. Ако абстрактните методи са разширени от конкретен клас, всички наследени абстрактни методи трябва да бъдат приложени, докато наследените виртуални методи могат или не могат да бъдат отменени.