Moduły i obiekty
Programowanie obiektowe w Pascalu to krótkie kompedium na temat obiektów, metod, właściwości i w zasadzie wszystkich innych bajerów, które można spotkać w pierwszej części drugiego semestru ZAP-a. Działy na tej stronie są ułożone tak, jak plan zajęć:
Materiały pomocniczeModuły
Moduły to, mówiąc prostym językiem, kawałki programów. Głowną różnicą jest jednak to, że nie można uruchomić modułu - można go jedynie dołączyć do istniejącego projektu (programu). Większość informacji, które będą potrzebne można znaleźć w angielskojęzycznym helpie do Delphi. Cytując tenże:
A unit consists of types (including classes), constants, variables, and routines (functions and procedures). Each unit is defined in its own unit (.pas) file.
A unit file begins with a unit heading, which is followed by the interface, implementation, initialization, and finalization sections. The initialization and finalization sections are optional.
Przekładając z angielskiego na polski a dalej z komputerowego na ludzki, moduł może zawierać typy (w tym klasy), stałe (const), zmienne jak również procedury i funkcje. Każdy moduł zapisywany jest w osobnym pliku .pas.
Jak pamietamy z pierwszego semestru ZAP-a, programy zaczynały się słowem
kluczowym program: tu dla odmiany jest to unit, za
którym od razu wstawiamy nazwę modułu oraz średnik. Struktura pliku modułu też
jest specyficzna i podzielona na cztery sekcje:
interfaceimplementationinitializationfinalization
Dwie ostatnie sekcje są opcjonalne i my nie będziemy z nich korzystać. Po takim wstępie, jesteśmy gotowi napisać pierwszy, pusty na razie, moduł:
unitUnit1;interfaceuses{ lista innych modułów, z których chcemy korzystać } { sekcja interface; deklaracje typów, nagłówki procedur... }implementationuses{ tu też można zadeklarować używane moduły, jakby co } { implementacja, czyli "treść" procedur, metod czy funkcji }end. { kończymy tak jak program: endem, kropką i koniec gadki! }
Po krótce o sekcji interface. Tu umieszczamy wszystkie elementy
publiczne, to jest takie, które będą dostępne z innych modułów lub programów
korzystających z naszego modułu. Wszelkie inne funkcje, procedury itd. będą się
zachowywały tak jak zmienne lokalne. Jednak dla naszych potrzeb możemy wszystko
deklarować w tej sekcji, nie zagłębiając się dalej w temat (będzie on jeszcze poruszany
przy okazji metod prywatnych).
Jak oczywiście wiadomo, interface zawiera jedynie nagłówki funkcji
i procedur. Ich zawartość znajduje się już w sekcji implementation.
Obiekty
Tu tez można sprawę uprościć, mówiąc o obiektach jak o trochę bardziej złożonych rekordach. O ile jednak rekordy mogą składać się wyłącznie z prostych typów danych, w postaci zmiennych (pól w rekordzie), to obiekty (a w naszym przypadku klasy) mogą zawierać w sobie również procedury, funkcje i kilka innych struktur, o których nie warto teraz wspominać. Klasę definiujemy podobnie do rekordu:
TypeTMojaKlasa =classpole1: integer; pole2:string; { pola takie jak w rekordzie }procedurepokaz; { nowość: procedura }end; {kończymy jak zwykle słowem 'end'}
To kawałek kodu, który trzeba umieścić w pierwszej z dwóch omiawianych sekcji modułu. Oczywiście trzeba to uzupełnić odpowiednimi linijkami w implementacji. Np:
procedureTMojaKlasa.pokaz;beginwriteln ( 'Wartość pola pierwszego: ',pole1 );end;
Podsumowanie
Dobrze, mamy więc już nasz moduł oraz klasę TMojaKlasa:
unitUnit1;interfaceTypeTMojaKlasa =classpole1: integer; pole2:string;procedurepokaz;end;implementationprocedureTMojaKlasa.pokaz;beginwriteln ( 'Wartość pola pierwszego: ',pole1 );end;end.
Powstaje jednak pytanie - co dalej. Dalej możemy załączyć nasz moduł do programu
dopisując jego nazwę po słowie kluczowym uses (delphi robi to za nas)
i korzystać z wszystkich typów, zmiennych i stałych zadeklarowanych w danym module
jako publiczne. W powyższym przykładzie jest to tylko klasa TMojaKlasa. Oczywiście
w modułach możemy też zdefiniować najczęściej używane typy zmiennych (np. listy)
lub stałe, aby nie dopisywać tych deklaracji za każdym razem, kiedy tworzymy nowy
program.
Ostatniš rzeczš, o której trzeba wspomnieć jest konstruktor. Jest to specjalna
procedura, która powoduje zainicjalizowanie obiektu: wszystkie zmienne numeryczne
się zerujš, łańcuchy sš ustawiane na puste, do wskaników przypisuje się nil.
Jego deklaracja wyglšda tak samo, jak deklaracja metody (funkcji, procedury) z tym
wyjštkiem, że uzywa się słowa kluczowego constructor i zwyczajowo nazywa
się go create. Taki konstruktor jest również wywoływany w sposób szczególny:
bo nie na obiekcie (obiekt.create) ale na klasie obiektu (obiekt := TMojaKlasa.create).
Jest to zwišzane z konstrukcjš języka Pascal i głębsze zrozumienie tego nie jest
nikomu do programowania na ZAP-ie potrzebne. Przykład deklarowania konstrkutora
można zobaczyć w przykładzie z ostatniej lekcji
Przykład skorzystania z w/w klasy:
programklasy1; {$APPTYPE CONSOLE}usesUnit1 in 'unit1.pas'; { to zostało dopisane przez delphi automatycznie }varklasa: TMojaKlasa;beginklasa := TMojaKlasa.Create; {konstruktor} klasa.pokaz;end.
Pytania kontrolne
- Jakie są główne elementy (sekcje) pliku z definicją modułu?
- Czym się różni interfejs od implementacji?
- Czym różni się nagłówek metody (funkcji w klasie) w implementacji od odpowiadającego mu nagłówka w implementacji?