Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
Objekty v Pascalu
Podle přednášky z
Programování II 19. 3. 2007:
Objekt je podobně jako často v jiných objektově orientovaných jazycích záznam (resp. struktura), ke které jsou (v závislosti na její třídě) asociované nějaké metody — funkce a procedury. Tomu odpovídá i syntaxe definice (resp. rozhraní a implementace) třídy objektů:
Deprecated: Assigning the return value of new by reference is deprecated in /DISK2/WWW/lokiware.info/mff/formatters/highlight/pascal.php on line 5
type JmenoTridy = object { nebo object(JmenoNadtridy) }
{jako vnitrek definice}
procedure JmenoProcedury1;
procedure JmenoProcedury2;
{... a obdobne funkce, strednik za deklaraci metody je povinny }
end;
procedure JmenoTridy.JmenoNejakeProcedury;
begin
{ jako vnitrek obycejne procedury, k instancnim promennym se pristupuje jako k lokalnim }
end;
Poznámka: V Delphi
class místo
object.
Viditelnost složek objektu
Složky třídy mohou být odděleny klíčovým slovem
private (před a po nejsou žádné středníky, dvojtečky). To znamená v Turbo Pascalu přístupné z téže jednotky, v Delphi z metod třídy (a
protected z třídy a podtříd,
public veřejné,
published i z inspektoru objektů).
V každé části oddělené klíčovým slovem
pněco jsou nejdříve instanční proměnné, pak metody.
Virtuální a statické metody, konstruktor
Implementace
statických metod jsou vždy vyhodnoceny při kompilaci (tzn. při kompilaci se rozhoduje, implementace které třídy se v daném místě zavolá). Metody, které nejsou explicitně
virtuální jsou statické. Deklarace virtuální metody (procedury v tomto případě):
Deprecated: Assigning the return value of new by reference is deprecated in /DISK2/WWW/lokiware.info/mff/formatters/highlight/pascal.php on line 5
procedure DoSomething; virtual;
Virtuální musí být metoda konsistentně i u všech potomků (a musí to tam být i napsané). Aby virtuální metody fungovaly, je třeba zavolat na objektu konstruktor (ten jako vedlejší efekt nastaví odkaz na tabulku virtuálních metod, takže objekt ví, co je), žádná inicializace objektu tedy neproběhne implicitně. Konstruktor se od procedury liší klíčovým slovem
constructor místo
procedure.
Další otravná věc je, že pokud potřebujeme volat metody třídy
Y na objektech, o nichž víme jen, že náleží její nadtřídě
X, musíme je už v třídě
X deklarovat jako virtuální a implementovat třeba tak, aby vyvolaly běhovou chybu (
RunError(211), kde 211 kód chyby volání abstraktní metody). V Delphi označíme metodu slovem
abstract a už ji nemusíme implementovat.
Dynamická alokace objektů
Deprecated: Assigning the return value of new by reference is deprecated in /DISK2/WWW/lokiware.info/mff/formatters/highlight/pascal.php on line 5
o : UkazatelNaObjektNejakeTridy;
{ ... }
o := New ( UkazatelNaObjektNejakeTridy, Konstruktor { s pripadnymi parametry jako u obycejneho volani} );