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';