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