Virtuální vs. abstraktní
Virtuální a abstraktní 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, klíčová slova Virtual i Abstract poskytují smysl pro částečnou implementaci entit, ke kterým se připojuje.
Abstraktní
Typicky nelze vytvořit abstraktní třídy, známé také jako Abstraktní základní třídy (ABC) (nelze vytvořit instanci této třídy). Takže abstraktní třídy mají smysl pouze tehdy, pokud 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í. Proto abstraktní třídy fungují jako nadřazené třídy, ze kterých 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 přidat k 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. Pokud tomu tak není,podřízená třída se také stane abstraktní třídou. To vše znamená, že když programátor nominuje třídu jako abstrakt, říká, že třída bude neúplná a bude obsahovat prvky, které je třeba doplnit zděděnými podtřídami. To je pěkný způsob, jak vytvořit smlouvu mezi dvěma programátory, což zjednodušuje úkoly při vývoji softwaru. Programátorka, která kód zdědí, musí přesně dodržovat definice metody (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. To je pěkný způsob, jak vytvořit smlouvu mezi dvěma programátory, což zjednodušuje úkoly při vývoji softwaru. Programátorka, která kód zdědí, musí přesně dodržovat definice metody (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. To je pěkný způsob, jak vytvořit smlouvu mezi dvěma programátory, což zjednodušuje úkoly při vývoji softwaru. Programátorka, která kód zdědí, musí přesně dodržovat definice metody (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.
Virtuální
Virtuální metody / funkce poskytují možnost volitelně přepsat 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 podřízenou třídou, takže 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 přepsány metody základní třídy. Abychom tuto nejednoznačnost vyřešili, používá se klíčové slovo Virtual. Pokud je metoda označena jako virtuální, pak se volá funkce odvozené třídy (pokud existuje) nebo se volá funkce základní třídy. Například v C ++ se virtuální klíčové slovo používá přesně pro tento účel. V jazyce C # se klíčové slovo Virtual používá podobným způsobem, ale navícpřepsání klíčového slova by mělo být použito k úpravě všech přepsaných metod. Ale v Javě neexistuje výslovné klíčové slovo Virtual. Všechny nestatické metody jsou považovány za virtuální. Virtuální funkce bez těla se nazývají Pure Virtual functions. V Javě a C # jsou abstraktní metody ve skutečnosti Pure Virtual.
Rozdíl mezi virtuální a abstraktní
Ačkoli Abstract a Virtual jsou dvě klíčová slova / koncepty, které svým 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) vůbec nemají implementaci, 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 nebo nemusí být přepsány.