Virtuální vs abstrakt
Virtual a Abstract jsou dvě klíčová slova používaná ve většině objektově orientovaných programovacích jazyků, jako jsou Java a C #. Ačkoli existují malé rozdíly v tom, co to znamená v různých jazycích, virtuální i abstraktní klíčová slova poskytují pocit částečné implementace entitám, ke kterým se připojují.
Abstraktní
Typicky nelze abstraktní třídy, také známé jako ABC (Abstract Base Classes), vytvořit instanci (instanci této třídy nelze vytvořit). Takže abstraktní třídy mají smysl pouze tehdy, pokud programovací jazyk podporuje dědičnost (schopnost vytvářet podtřídy z rozšiřování třídy). Abstraktní třídy obvykle představují abstraktní pojem nebo entitu s částečnou nebo žádnou implementací. Proto abstraktní třídy 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 je doplnit funkčností. 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, je to konkrétní třída. Ale pokud tomu tak není, třída dítěte se také stává třídou abstraktní. To vše znamená, že když programátor nominuje třídu jako abstrakt, říká, že třída bude neúplná a bude mít prvky, které musí být doplněny zděděný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, aby zdědil, musí přesně dodržovat definice metod (ale samozřejmě může mít i vlastní implementaci). V Javě a C # jsou abstraktní třídy a metody deklarovány pomocí klíčového slova Abstraktní.
Virtuální
Virtuální metody / funkce poskytují možnost volitelně potlačit své chování zděděnou třídou (pomocí funkce se stejným podpisem). Koncept virtuální funkce je důležitý v následujícím scénáři. Předpokládejme, že třída je odvozena od podřízené třídy, a 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í metod však může být nejednoznačné, pokud jsou metody základní třídy přepsány. K vyřešení této dvojznačnosti se tedy používá virtuální klíčové slovo. Pokud je metoda označena jako virtuální, pak se vyvolá funkce odvozené třídy (pokud existuje) nebo se nazývá funkce základní třídy. Například v C ++ se virtuální klíčové slovo používá přesně za tímto účelem. V C # je virtuální klíčové slovo používáno podobným způsobem, ale navíc by mělo být přepsání klíčových slov použito k úpravě všech přepsaných metod. Ale v Javě neexistuje žádné explicitní virtuální klíčové slovo. 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 Java a C # jsou abstraktní metody ve skutečnosti Pure Virtual.
Rozdíl mezi virtuální a abstraktní
Ačkoli abstraktní a virtuální jsou dvě klíčová slova / koncepty, které poskytují význam neúplné implementace přidruženým entitám, 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 metody abstrakt rozšířeny o konkrétní třídu, musí být implementovány všechny zděděné metody abstrakt, zatímco zděděné virtuální metody mohou nebo nemusí být přepsány..