int21h

Stručný popis objektově orientovaného programování

Každý objekt se definuje stejně jako typ záznam, jen má jiné klíčové slovo.
Pokud je za ním v závorce název jiného objektu, tento aktuální dědí všechny proměnné a funkce (metody) z předchozího, kromě těch, které definuje sám (se stejným názvem).
Pokud je uvedeno slovo Private, vše za ním nelze volat přímo tečkovou konvencí.
Syntakticky správně by čtení a zápis všech proměnných z objektu měly zařizovat jen jeho metody.
Ty mohou adresovat jeho proměnné bez užití tečkové konvence (bez With), nebo pokud by došlo k nejasnosti (stejné proměnné i v hlavičce funkce), "SELF." odkazuje na aktuální objekt.
Metoda může být použita ve více objektech. Objekty se definují většinou v INTERFACE jednotkách, zatímco metody se definují jako procedury/funkce v IMPLEMENTATION jednotkách jako OBJEKT.NAZEV().
Obdobně lze do metod vložit adresu funkcí z jednotek FP, např. pomocí @JEDNOTKA.FUNKCE(PARAMETR). Statické metody jsou rychlé, překladač určuje vazby v době překladu (nutno ověřit na výstupu assembleru, zda se tam např. zbytečně nevolají procedury).
Virtuální se určují za běhu, navíc vyžadují v RAM místo pro VMT (tabulka virtuálních metod). Pokud totiž potomek nahrazuje nějakou metodu tak, aby mohla pracovat s jeho novými daty, ale ta volá jiné metody, které nejsou nahrazeny, ale jsou napsány tak, že novému typu nevyhovují, překladač se je při volání pokusí najít u akt. objektu, pokud je nenajde, bude je hledat u předka, což je chyba. Stačí je jen znovu definovat (stejný název, ale jiné tělo v IMPLEMENTATION, resp. v BEGIN END;).

Při předefinování statické (někde se uvádí, že pro předefinování musí být metoda virtuální, ale to zřejmě není tak úplně pravda) metody stačí uvést jen stejný název, u virtuální se musí shodovat i počet a typ parametrů.
Stejně tak u dynamických (používají ještě index, zabírají méně RAM než virtuální).
Protože lze použít vždy statické metody (rychlejší, méně RAM, malá nevýhoda v malé upravitelnosti objektů, avšak ta vadí jen tehdy, je-li potřeba používat v potomcích metodu jak předka, tak aktuální (potomka), což je málokdy), je zbytečné používat "virtual" metody (podobné jsou dynamické metody).
Každý takový objekt musí navíc (musel by) nejprve volat "constuctor" metodu.
Většinou platí, že při volání metody se její výskyt hledá od prvního předka, tj. i když je předefinovaná u posledního potomka, ale není virtuální, použije se první nalezená, tedy u toho předka (resp. když statická metoda volá jiné statické metody, hledají se nejprve u aktuálního potomka, pokud se nenaleznou, hledají se u předků, jenže protože se vazby dělají v době překladu, u přiřadí se dané metodě (zřejmě u všech potomků) adresa té metody, která se použila jako první a pak je volána i pro jiné předky či potomky, i když k nim vůbec nepatří), což je špatně!
Objekty mohou být statické (pomocí VAR) nebo dynamické (GetMem, pointer). Každý takový objekt je nutné nejprve alokovat na haldě a před ukončením dealokovat (pokud objekt obsahuje další dynamické struktury, je nutné je také většinou uvolnit - pro tuto věc stačí uvést metodu "deskriptor", která zajistí dealokaci celé obsazené RAM objektem, ale opět využívá VMT).
Ideální je používat tedy jen statické metody a pokud jsou potřeba dynamické objekty, neměly by obsahovat žádné dynamické proměnné, popř. je potřeba je před uvolněním objektu také uvolnit. Objekt se dá alokovat pomocí New(objekt) a uvolnit pomocí Dispose(objekt).
Volá se pak opět pomocí stříšky (jako typ pointer). Procedura New se dá použít (zbytečné složitosti) i s druhým parametrem, kde by byl 2. parametr constructor funkce (u Dispose zase destructor).
New může také vracet jako výstupní hodnotu pointer (ukazatel na objekt), to platí nejen pro typy object. V tomto případě se ale jako parametr musí použít typ ukazatel (na typ objekt).

Více viz. kniha TP7 OOP od strany 125.

OOP umožňuje přehlednější programování, ale může být většinou pomalejší než přímý zápis. Hodí se možná tak akorát do editoru; do engine, který u objektů má adresy skriptů a ne metod, je to zbytečnost.
Pokud constructor alokuje dynamickou RAM (na haldě), měl by také provádět testy na NIL a případně skončit s chybou pomocí funkce FAIL. Ideální je používat jen statické objekty a metody (v datovém segmentu), v nejhorším případě dynamické objekty na haldě (u FP to ale není potřeba, protože to je stejně ten samý deskriptor - jen jsou samozřejmě v paměti neustále, když běží program).
Pokud je nutné předefinovávat metody, je nutné je napsat virtuálně, resp. dynamicky. Rychlejší je tvořit objekty tak, aby děděné vlastnosti nemusely předefinovávat (ideálně vůbec nepoužívat dědičnost).
Nejideálnější je naprogramovat si správu objektů sám bez OOP.
2006-11-30 | Martin Lux
Reklamy: