Ma megint alkalmaznom kellett egy apró trükköt és eszembe jutott, hogy talán ki lehetne tenni a blogra, mert nem biztos, hogy mindenki ismeri.
Bizonyos esetekben - főleg, ha általánosan kezelünk objektumokat, jó lenne protected metódusokat vagy attribútumokat elérni az osztályon kívülről. Protected metódusok Delphi-ben alapesetben elérhetők az osztályban és a leszármazottakban. Ha ez nem elég, akkor létre kell hoznunk egy leszármazottat az elérni kívánt osztályból és arra cast-olni a megfelelő objektumot.
Tegyük fel, hogy egy TControl objektumnak szeretnénk elérni a Font tulajdonságát.
procedure ShowFontName( ctrl : TControl );
begin
ShowMessage( ctrl.Font.Name );
end;
Ez hibát fog eredményezni, mert a Font protected tulajdonság. A trükk egyszerű:
type TControlAccess = class( TControl );
procedure ShowFontName( ctrl : TControl );
begin
ShowMessage( TControlAccess( ctrl ).Font.Name );
end;
Ez már így menni fog. Feltétele a dolognak, hogy a TControlAccess osztály definíciójának ugyanabban a unit-ban kell lennie, mint ahol használni akarjuk (nem elég egy uses a tartalmazó unit-ra).
Saját osztályoknál erre az egyszerű trükkre nem nagyon lehet szükségünk, mert nyilván úgy módosítjuk az osztályt, hogy elérjük a metódust vagy attribútumot. Viszont, ha pl. a VCL könyvtár osztályait akarjuk elérni, akkor hasznos lehet.