Załóżmy, że musimy odwołać się do chronionych właściwości (lub metod)
instancji komponentu. Można oczywiście stworzyć nową klasę dziedziczącą
po naszym komponencie, przenieść chronione składowe do sekcji publicznej,
a następnie instancjonować tę nową klasę.
Jednak, w niektórych sytuacjach, może być to zbyt skomplikowane lub
po prostu niemożliwe. Na przykład, gdy musimy odwołać się do chronionej
składowej standardowego komponentu na jedną czy dwie operacje,
tworzenie nowego komponentu, rejestrowanie go i zarządzanie nim
może się okazać nieco zbyt kłopotliwe
(jakoś zarządzanie komponentami w Delphi nigdy nie przypadło mi do gustu).
A może klasa jest instancjonowana poza kodem, który kontrolujemy
i nie mamy żadnych możliwości zmiany tego kodu?
Kod poniżej jest troszkę hakiem (lub raczej pójściem na skróty),
ale w sytuacjach takich jak omówione powyżej działa całkiem zacnie.
Rozważmy na ten przykład klasę TPanel i jej chronioną składową Canvas.
Można to zrobić jak następuje:
type
TCanvasPanel = class(TPanel)
public
property Canvas;
end;
...
// Teraz powiedzmy, że Panel jest instancjonowany poza naszym kodem,
// ale musimy mieć dostęp do jego chronionej składowej Canvas:
TCanvasPanel(Panel).Canvas.Ellipse(10, 10, 50, 50);
...
// Jednak poniższa instrukcja nie przejdzie -
// zostanie zgłoszony błąd wykonania (nieprawidłowe rzutowanie - EInvalidCast):
(Panel as TCanvasPanel).Canvas.Ellipse(10, 10, 50, 50);
...
Tak to by było w Delphi, ale powinno dać się zrobić podobnie w tych językach,
które pozwalają na rzutowanie typów bez zbyt restrykcyjnej kontroli typów.
Góra
|