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 pomocnicze

Moduł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:

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ł:

unit Unit1;

interface
 
uses  { lista innych modułów, z których chcemy korzystać }
 
  { sekcja interface; deklaracje typów, nagłówki procedur... }
 
implementation
 
uses  { 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:

Type TMojaKlasa = class
                  pole1: integer;
                  pole2: string;	{ pola takie jak w rekordzie }
                  procedure pokaz; { 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:

procedure TMojaKlasa.pokaz;
begin
        writeln ( 'Wartość pola pierwszego: ',pole1 );
end;

Podsumowanie

Dobrze, mamy więc już nasz moduł oraz klasę TMojaKlasa:

unit Unit1;

interface

Type TMojaKlasa = class
                  pole1: integer;
                  pole2: string;
                  procedure pokaz;
                  end;

implementation

procedure TMojaKlasa.pokaz;
begin
        writeln ( '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 wskaŸnikó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:

program klasy1;
{$APPTYPE CONSOLE}
uses Unit1 in 'unit1.pas';
	{ to zostało dopisane przez delphi automatycznie }
var klasa: TMojaKlasa;
begin
     klasa := TMojaKlasa.Create; {konstruktor}
     klasa.pokaz;
end.

Pytania kontrolne

  1. Jakie są główne elementy (sekcje) pliku z definicją modułu?
  2. Czym się różni interfejs od implementacji?
  3. Czym różni się nagłówek metody (funkcji w klasie) w implementacji od odpowiadającego mu nagłówka w implementacji?
↑ góra → komentuj
δ playground notes maciej łebkowski