RTTI

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

RTTI (Run Time Type Information – informacja o typie w trakcie wykonywania programu) jest techniką stosowaną w nowoczesnych obiektowych językach programowania. Technika ta polega na dołączeniu do kodu programu informacji o typach (klasach), czasami też ich własnościach i dostępnych metodach.

W C++[edytuj | edytuj kod]

W standardowym C++ każdej klasie towarzyszy struktura przechowująca nazwę klasy. Dostęp do niej uzyskuje się poprzez typeid.

Wyrażenie typeid (e).name() zwraca nazwę klasy, do której należy obiekt e. Standard C++ nie określa co ma zawierać zwrócony napis. Konstrukcja ta jest mało użyteczna i można się obejść bez niej.

Wyrażenie dynamic_cast<Samochod*>( x ) dla wskaźnika obiektu x zwraca jego wskaźnik jeśli typ ten należy do klasy Samochod lub jej potomka, przeciwnie zwraca wskaźnik pusty. Operator dynamic_cast jest użytecznym mechanizmem. Jeżeli przykładowo pojemnik obiektów (np. lista) zawiera obiekty typu Pojazd, a pewna operacja ma być wykonana tylko dla pojazdów będących samochodami, do wyselekcjonowania pojazdów będącymi samochodami (lub ich potomkami) można użyć wyżej opisanej konstrukcji. Instrukcja dynamic_cast wspomaga polimorfizm ułatwiając operowanie na różnych typach obiektów.

Delphi i C++ Builder[edytuj | edytuj kod]

W Delphi i C++ Builder RTTI jest rozbudowanym mechanizmem dającym programistom i użytkownikom wiele nowych cech programowania, tworząc z tych środowisk narzędzia do szybkiego generowania aplikacji (RAD). Technikę RTTI stosuje się w celu umożliwienia tworzenia podczas wykonywania programu obiektów na podstawie nazwy klasy tworzonego obiektu, sprawdzania typu obiektu (przynależności do wybranej klasy), a także zmiany własności obiektów poprzez modyfikację dostępnych (także poprzez nazwę) własności (property). Własności te (property) mogą być też powiązane z kodem procedur, nazywane są wówczas zdarzeniami. Połączenie kodu do danego zdarzenia umożliwia indywidualizację zachowania obiektu utworzonego podczas działania programu.

Technika ta wprowadza do języków programowania kompilujących kod źródłowy nowe, opisane niżej, możliwości niedostępne wcześniej dla programów kompilowanych i umożliwia nowe podejście do programowania o możliwościach wymaganych przez języki czwartej generacji (4GL). Wprawdzie RTTI występuje bezpośrednio tylko w ostatnim etapie, ale zmienia sposób pracy na etapie 2.

Tworzenie programu może być rozdzielone na etapy.

  • Przygotowanie komponentów.
W etapie tym zaawansowany programista tworzy komponenty (klasy), w których decyduje jakie własności tej klasy są dostępne przez RTTI. Własności te nazywane własnościami opublikowanymi (published) są dostępne dla programistów korzystających z tych komponentów nie tylko w kodzie programu, ale także w specjalnym edytorze zwanym inspektorem obiektów. Własności opublikowane mogą być dostępne dla użytkownika programu w momencie pracy programu i są często używane do zapisywania ustawień programu.
  • Tworzenie aplikacji
W etapie drugim programista tworzący aplikację, używa komponentów dołączając je (wybiera z palety i umieszcza w okienku programu) do swego programu, tym samym tworzy obiekty danego typu. Wybierając utworzony obiekt programista widzi, w inspektorze obiektów, jakie własności opublikowane ma utworzony obiekt i może je zmieniać, zmiany te natychmiast są uwzględniane, w kodzie programu (dwustronna edycja) i wyglądzie projektowanej aplikacji (wiele obiektów działa już na tym etapie, tak jak w skompilowanym programie). W ten sposób bez znajomości języka programowania, lub znając tylko jego podstawy, można zbudować w pełni działający program.
  • Działanie programu
Program uruchamiając się odczytuje, umieszczone zazwyczaj w zasobach, informacje o obiektach (np. elementach ekranu), które ma utworzyć; odczytuje nazwę typu obiektu do utworzenia, odszukuje ją w informacjach zawartych w strukturach RTTI i na tej podstawie tworzy obiekt. Następnie odczytuje nazwy własności i nadaje im wartości zawarte we wczytywanych danych. Technika wczytywania i zapisywania danych obiektów może być wykorzystywana na różnych etapach pracy programu do różnych celów, np. zapisywania ustawień programu.

Umieszczenie danych o wyglądzie i sposobie działania programu nie w kodzie wynikowym programu, lecz w dodatkowych plikach, umożliwia dostosowanie programu do preferencji użytkownika bez konieczności przebudowy oraz kompilowania programu, użytkownik często może sam zmienić ustawienia, a te w prosty sposób, wykorzystując technikę RTTI, mogą być zapisane i odczytane.

Przykład 1:

Wszystkie informacje o wyglądzie okna programu w środowisku Delphi nie są kompilowane do kodu wynikowego, podczas pracy są one umieszczane w plikach typu .dfm, a podczas kompilacji są dołączane do pliku programu. Poniżej zamieszczony jest fragment pliku *.dfm. Opisuje on przycisk z obrazkiem (TBitBtn) umieszczony w oknie programu. W trakcie tworzenia tego okna powstaje obiekt (instancja) klasy TBitBtn, zostaje nadana mu nazwa BtnPrzerwij, umieszczony będzie on wewnątrz tego okna w miejscu o współrzędnych (192, 216) (Left, Top), będzie miał wysokość 25 (Height) pikseli oraz szerokość 75 (Width) pikseli. W momencie jego naciśnięcia ma zostać uruchomiona opublikowana procedura o nazwie BtnPrzerwijClick.

   
  object BtnPrzerwij: TBitBtn
    Left = 192
    Top = 216
    Width = 75
    Height = 25
    TabOrder = 2
    OnClick = BtnPrzerwijClick
    Kind = bkCancel
  end

Operatory RTTI[edytuj | edytuj kod]

W celu spawdzania czy dany obiekt jest zgodny z typem (należy do klasy lub jej potomka) wprowadzono operator is oraz operator bezpiecznego rzutowania typu as

Przykład

  if sender is TButton then 
     TButton(sender).caption := 'To ja wywołałem';   
  try
    (sender as TEdit).Text := 'To ja wywołałem zdarzenie';
  except
       // wyciszenie wyjatku jeśli sender nie jest zgodny z TEdit
  end