Jaskinie Podróże Grafika Mizar Artykuły Kulinaria Lemkov Namiary Mapa English  
Spelunka Trybików Teksty i artykuły Dostęp do składowych chronionych YAC Software  
 Wróć
Spis
Formy jak ramki
Sprawdzanie
błędnych odwołań
a nowy
menedżer pamięci
</form> ... <form>
Branża badawcza
w Polsce - 2007
Dostęp do
składowych
chronionych
Syntaktyka
Mizara-MSE
Kwantyfikatory
w wyrażeniach
regularnych -
co najmniej
m wystąpień
Systemy
przepisywania
słów
Kwantyfikatory
w wyrażeniach
regularnych - od m
do n wystąpień
Języki formalne
- konkatenacja
i domknięcie
Boole'owskie
właściwości
zbiorów
Homomorfizmy i
izomorfizmy grup;
grupa ilorazowa
Liczby całkowite
Dostęp do składowych chronionych
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

Komentarze
Kurczę!
Na razie brak komentarzy...

Góra

Dodaj komentarz (pola z gwiazdką są obowiązkowe)
Imię / ksywa *
Mail (pozostanie ukryty) *
Twoja strona
Komentarz (bez tagów) *
Ten blog jest moderowany, Twój wpis zostanie wyświetlony po kontroli.
Zatem, jeżeli się nie pojawi od razu, nie przejmuj się i nie wysyłaj komentarza drugi raz.
Dzięki.
Góra