Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
W sekcji interfejsu umieszcza się wówczas definicję typu, a w sekcji implementacji definicje metod. Zaletą takiego rozwiązania jest ukrycie szczegółowego kodu, którego modyfikacja nie jest potrzebna. Na wydruku 6.1 przedstawiona jest opracowana w ten sposób popra-wiona wersja typu obiektowego TPunkt.
Wydruk 6.1. Moduł Punkty.pas definiujący typ obiektowy reprezentujący punkt unit Punkty; interface type PPunkt = ^TPunkt; TPunkt = object constructor Init(xPoc, yPoc: integer); destructor Done; virtual; procedure Pokaz; virtual; procedure kryj; virtual; procedure Rysuj; virtual; function PodajX: integer; function PodajY: integer; function Widoczny: Boolean; procedure PrzesunDo(xNowe, yNowe: integer); virtual; procedure Przesun (xDelta, yDelta: integer); virtual; private x, y: integer; Wid : Boolean; end; implementation uses Graph; constructor TPunkt.Init(xPoc, yPoc: integer); begin x := xPoc; y := yPoc; Wid := false; end; destructor TPunkt.Done; Rozdział 6. ♦ Programy obiektowe 221 begin if Wid then kryj; end; procedure TPunkt.Pokaz; begin Wid := true; Rysuj; end; procedure TPunkt. kryj; var Color: word; begin Color := GetColor; SetColor(GetBkColor); Wid := false; Rysuj; SetColor(Color); end; procedure TPunkt.Rysuj; begin PutPixel(x, y, GetColor); end; function TPunkt.PodajX: integer; begin PodajX := x; end; function TPunkt.PodajY: integer; begin PodajY := y; end; function TPunkt.Widoczny: Boolean; begin Widoczny := Wid; end; procedure TPunkt.PrzesunDo(xNowe, yNowe: integer); var BylWidoczny: Boolean; begin BylWidoczny := Wid; if BylWidoczny then kryj; x := xNowe; y := yNowe; if BylWidoczny then Pokaz; end; procedure TPunkt.PrzesunO(xDelta, yDelta: integer); begin PrzesunDo(x+xDelta, y+yDelta); end; end. 222 Turbo Pascal i Borland C++. Przykłady Definicja typu TPunkt składa się z domyślnej sekcji publicznej obejmującej metody i sekcji prywatnej opisującej pola. Dostęp do pól poza modułem jest możliwy tylko za pomocą metod. Wartości pól x, y i Wid udostępniają proste metody PodajX, PodajY i Widoczny. Metody PrzesunDo i PrzesunO przesuwają punkt reprezentowany przez obiekt — pierwsza do pozycji o określonych współrzędnych, druga do pozycji przesuniętej względem jego położenia bieżącego o określony przyrost poziomy i pionowy. Konstruktor Init inicjalizuje obiekt, nadając wartości początkowe wszystkim jego polom. Destruktor Done usuwa punkt z ekranu, gdy obiekt jest niszczony3. Metody Done, Rysuj, PrzesunDo i PrzesunO są wirtualne; można więc będzie je przedefiniować w typach pochodnych, gdy zajdzie taka potrzeba. Klasa w C++ i jej moduł definiujący Kluczową rolę w programowaniu obiektowym w języku C++ pełni klasa, stanowiąca odpowiednik typu obiektowego w Turbo Pascalu. Definicja klasy przypomina definicję struktury. Składowymi klasy są pola i funkcje, a poziom dostępu do nich określają specyfikatory dostępu (słowa kluczowe zakończone dwukropkiem): t private (prywatne) — dostępne tylko w klasie, w której są zdefiniowane, t protected (chronione) — dostępne również w klasach pochodnych, t public (publiczne) — dostępne w całym programie. Brak specyfikatora dostępu oznacza, że składowe klasy są prywatne. Jak widać, mechanizm określania dostępu jest w C++ bardziej precyzyjny niż w Turbo Pascalu. Nazwa konstruktora w C++ jest zawsze taka sama jak nazwa klasy, a nazwa destruk-tora również, z tym że jest poprzedzana znakiem tyldy (~). Obie funkcje nie zwracają żadnej wartości, nawet typu void, dlatego nie określa się ich typu. Deklaracje funkcji wirtualnych poprzedza się w definicji klasy słowem kluczowym virtual. Funkcje udostępniające wartości pól są bardzo proste, toteż zazwyczaj definiuje się je, poprzedzając ich deklaracje słowem kluczowym inline lub umieszczając po nich właściwy kod funkcji [6, 14]. W miejscu wywołania takiej funkcji kompilator nie generuje żadnego kodu wywołującego, lecz udostępnia bezpośrednio wartość po-la, co przyśpiesza wykonanie programu.
|
WÄ…tki
|