Přetypování

Už v klasickém Pascalu se občas hodila možnost lokálního přetypování. Přetypování znamená, že se v daném místě na proměnnou pohlíží, jako by byla jiného typu. Nepleťte ale přetypování s konverzí (převodem). V níže uvedeném příkladu se do J přiřazuje hodnota, která nevznikla přepočítáním X na celé číslo (ostatně, k tomu existují funkce round a trim). Přiřazuje se tam číslo, které vzniklo tak, že se z 8-bytového čísla X (real má v paměti délku 8 bytů a má semilogaritmický formát) vezmou první 4 byty (typ integer má délku 4 byty) a tyto 4 byty se přiřadí do J. Naproti tomu do Y se přiřazuje hodnota, která skutečně vznikla konverzí z J, takže číselná hodnota v J i v Y bude stejná:

TYPE
Cele = INTEGER;
VAR
X, Y : real;
J : Cele;
BEGIN
J := Cele (X); { lokální přetypování }
Y := J; { automatická konverze real-->integer }

Tento elementární příklad sice ukázal princip přetypování, avšak nijak nevyjasnil smysl, k čemu se ho dá použít. Nejčastěji se přetypování použije právě pro práci se třídami, jak ukazuje tento příklad:

var

P : pointer;

begin

{ vytvoření objektu třídy Memo; zápis je přípustný, protože typ "pointer" je kompatibilní s jakýmkoliv pointerem }

P := TMemo.Create(self);

{ následující řádek je chybně; typ "pointer" nemá žádnou datovou položku Lines ani metodu Clear }

P.Lines.Clear;

{ následující řádek naopak je správně, P se nejprve přetypovalo na TMemo }

TMemo(P).Lines.Clear;

Toto přetypování existovalo již ve starších verzích Pascalu, ale je pokládáno za dosti nebezpečné. Proto byl zaveden operátor "as" pro bezpečné přetypování. Má tvar

Obj as Trida

a vyžaduje, aby Obj byl objektem třídy Trida, nebo některé z ní zděděné třídy. Tento vztah je při použití operátoru "as" kontrolován a nesouhlas vede k chybě. Například:

with Sender as TButton do

begin

Caption := '&Ok';

OnClick := OkClick;

end;

 

Pravidla pro prioritu operátorů často vyžadují, aby se výraz s oparátorem "as" uzavřel do závorek, například:

(Sender as TButton).Caption := '&Ok';