Hledejte v chronologicky řazené databázi studijních materiálů (starší / novější příspěvky).

Statické versus virtuální metody

Statické versus virtuální metody
Statické metody – charakter statických metod můžeme přirovnat k charakteru statických proměnných. Překladač jim přiřadí prostor v paměti a vyřeší všechny jejich vazby v době překladu. Kód těchto metod je tedy velmi efektivní, a proto jsou tyto metody velmi rychlé.
Nevýhodou je: pokud metoda předka volá jiné statické metody, pak se tyto volané metody uplatní na úrovni volání předka. Tzn.: v případě, že bychom volali zděděnou metodu potomka, která je definovaná na úrovni předka a potomkovi plně vyhovuje a tudíž ji ve své deklaraci znovu neuvádí a nepředefinovává , a která obsahuje volání jiných metod, které jsou deklarovány v předkovi, ale potomek je má předeklarované, dojde k tomu, že sice bude zavolána správná metoda potomka, ale metody, které jsou v ní obsaženy, se budou nejprve hledat mezi metodami předka a ne potomka. Dojde tak vlastně k zavolání špatných metod, což je dáno z principů práce překladače se statickými metodami. Překladač nejprve hledá volanou metodu uvnitř definovaného objektu (v tomto případě uvnitř objektu předka), pokud na této úrovni neuspěje, pokračuje v hledání metody na úrovni předka ( v našem případě prapředka) a tak postupuje v hierarchické struktuře, dokud volanou metodu nenajde. Metoda se použije ve formátu, v jakém byl nalezen její první výskyt. Takže, aby k tomuto konfliktu nedošlo, musíme na úrovni objektu potomka vytvořit metodu, která je úplně stejná jako metoda předka, což je neefektivní.

OOP umožňuje využít pro řešení uvedené situace možnosti vytvářet vazby mezi objekty a jejich metodami v době výpočtu. Tuto možnost nabízejí virtuální metody. Virtuální metody jsou pomalejší než metody statické, ale zato jsou flexibilnější. Svým charakterem se mohou virtuální metody přirovnat k dynamickým proměnným.
Virtuální metody jsou mimořádně mocným prostředkem polymorfismu. Polymorfismus umožňuje pojmenovat jedním jménem metodu, kterou sdílejí objekty na všech úrovních stromové struktury, ale každý objekt může definovat svoji vlastní implementaci této metody.
Takže, jeli pravděpodobné, že bude některá metoda potomky předefinována, je vhodné – ne-li nutné – definovat ji jako virtuální. Jedině tak umožníme zděděným metodám, aby ji používaly.

Žádné komentáře:

Okomentovat