Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35 Matfiz : ObjektyVPascalu

Matfiz : ObjektyVPascalu

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} );