Virtuální vs abstraktní
Virtual a Abstract jsou dvě klíčová slova používaná ve většině objektově orientovaných (OO) programovacích jazyků, jako je Java a C. Ačkoli existují drobné rozdíly v tom, co to znamená v různých jazycích, jak virtuální, tak abstraktní klíčová slova poskytují pocit částečné implementace entitám, ke kterým se připojuje.
Abstrakt
Abstraktní třídy, známé také jako abstraktní základní třídy (ABC), obvykle nelze vytvořit instanci (nelze vytvořit instanci této třídy). Abstraktní třídy jsou tedy smysluplné pouze v případě, že programovací jazyk podporuje dědičnost (schopnost vytvářet podtřídy z rozšíření třídy). Abstraktní třídy obvykle představují abstraktní koncept nebo entitu s částečnou nebo žádnou implementací. Abstraktní třídy proto fungují jako nadřazené třídy, z nichž jsou odvozeny podřízené třídy, takže podřízená třída bude sdílet neúplné funkce nadřazené třídy a lze přidat funkce pro jejich dokončení. Abstraktní třídy mohou obsahovat abstraktní metody. Podtřídy rozšiřující abstraktní třídu mohou implementovat tyto (zděděné) abstraktní metody. Pokud podřízená třída implementuje všechny takové abstraktní metody, jedná se o konkrétní třídu. Ale pokud tomu tak není, stane se podřízená třída také abstraktní třídou. To vše znamená, že když programátorka nominuje třídu jako Abstrakt, říká, že třída bude neúplná a bude mít prvky, které je třeba doplnit dědícími podtřídami. Je to pěkný způsob, jak vytvořit smlouvu mezi dvěma programátory, což zjednodušuje úkoly při vývoji softwaru. Programátor, který píše kód ke zdědění, musí přesně dodržovat definice metod (ale samozřejmě může mít vlastní implementaci). V Javě a C jsou abstraktní třídy a metody deklarovány pomocí abstraktního klíčového slova.
Virtual
Virtuální metody/funkce poskytují možnost volitelně přepsat jejich chování dědící třídou (pomocí funkce se stejnou signaturou). Koncept virtuální funkce je důležitý v následujícím scénáři. Předpokládejme, že třída je odvozena podřízenou třídou, pak kdykoli je použit objekt odvozené třídy, může odkazovat na objekt základní třídy nebo odvozené třídy. Chování volání metody však může být nejednoznačné, pokud jsou metody základní třídy přepsány. K vyřešení této nejednoznačnosti se tedy používá klíčové slovo Virtual. Pokud je metoda označena jako Virtual, pak se zavolá funkce odvozené třídy (pokud existuje) nebo se zavolá funkce základní třídy. Například v C++ se přesně pro tento účel používá klíčové slovo Virtual. V C se klíčové slovo Virtual používá podobným způsobem, ale navíc by se mělo použít klíčové slovo override pro úpravu všech přepsaných metod. V Javě však žádné explicitní virtuální klíčové slovo neexistuje. Všechny nestatické metody jsou považovány za virtuální. Virtuální funkce bez těla se nazývají čistě virtuální funkce. V Javě a C jsou abstraktní metody ve skutečnosti čistě virtuální.
Rozdíl mezi virtuálním a abstraktním
Přestože abstraktní a virtuální jsou dvě klíčová slova/koncepty, které přidruženým entitám poskytují význam neúplné implementace, mají své rozdíly. Abstraktní metody (které musí být definovány uvnitř abstraktních tříd) nemají implementaci vůbec, zatímco virtuální metody mohou mít implementaci. Pokud jsou abstraktní metody rozšířeny o konkrétní třídu, musí být implementovány všechny zděděné abstraktní metody, zatímco zděděné virtuální metody mohou, ale nemusí být přepsány.