Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
tłum.).
Zamiast tego zaleca się jednak wywołanie metody Free():
FooObject.Free;
Metoda ta sprawdza wpierw, czy zmienna obiektowa (FooObject) nie zawiera pustego wskazania (NIL) —
jeżeli nie, następuje wywołanie metody Destroy() dla wskazywanego obiektu.
Ostrzeżenie
W C++ destruktor obiektu zadeklarowanego statycznie wywoływany jest automatycznie w momencie, gdy sterowanie opuszcza zasięg deklaracji tego obiektu; obiekty tworzone dynamicznie muszą być jednak zwalniane w sposób jawny, za pomocą słowa kluczowego delete. W Delphi nie ma obiektów statycznych, musimy więc jawnie zwalniać każdy egzemplarz obiektu, mając na uwadze dwa (z szeregu innych) uwarunkowania. Po pierwsze, zwalniany obiekt dokonuje jednoczesnego zwolnienia wszystkich innych obiektów, dla których jest właścicielem; po drugie — istnieją współdzielone przez kilka aplikacji obiekty, których wykorzystanie opiera się na tzw. liczniku odwołań ( reference counter), i które są zwalniane dopiero wówczas, gdy licznik ten osiągnie wartość 0 (czyli ostatnia z aplikacji zakończy swe operacje na obiekcie).
Przykładami takich współdzielonych obiektów są obiekty klas TInterfacedObject i TComObject.
Nasuwa się pytanie, skąd bierze się obecność konstruktora Create(), destruktora Destroy() i metody Free() w każdym typie obiektowym? Odpowiedź na to pytanie wskazuje jeszcze jedną różnicę między Turbo Pascalem a Delphi. W Delphi każdy obiekt bez wskazanej jawnie klasy bazowej jest traktowany jako typ pochodny klasy TObject, tak więc deklaracja
Type TFoo = class;
równoważna jest deklaracji
Type TFoo = class (TObject);
Wymienione metody — Create(), Destroy() i Free() są częścią klasy TObject — powrócimy za chwilę do tej kwestii.
Metody
Metody są tym aspektem typu obiektowego, który pobudza obiekt do życia i decyduje o jego zachowaniu (trudno to powiedzieć o polach obiektu, które są co najwyżej „pożywką” dla metod). Przykładami metod są poznane przed chwilą konstruktory i destruktory.
Deklarowanie własnej metody przebiega dwuetapowo. Etap pierwszy to umieszczenie nagłówka metody wewnątrz deklaracji klasy, na przykład:
Type
TDyskoteka = class;
Taniec : Boolean;
Procedure ZatanczSambe;
End;
Konkretyzacja treści procedury odbywa się w drugim etapie, w części implementacyjnej modułu zawierającego deklarację klasy:
Procedure TDyskoteka.ZatanczSambe;
begin
Taniec := TRUE;
end;
Zwróć uwagę na to, iż właściwa nazwa procedury poprzedzona jest nazwą klasy, dla której ta procedura jest metodą. Podobną (kwalifikowaną) postać mają odwołania do metody — nazwa metody poprzedzona jest określeniem obiektu, na rzecz którego metoda ta jest wywoływana:
Var
Maxim : TDyskoteka;
........
Maxim.ZatanczSambe;
Podobnie jak w przypadku rekordów, odwołania kwalifikowane można zastąpić instrukcją with: with Maxim do
ZatanczSambe;
W treści metod danej klasy odwołania do pól jej obiektów nie mają postaci kwalifikowanej, gdyż treść metody jest dla tych pól zakresem ich widoczności (vide pole Taniec w metodzie TDyskoteka.ZatanczSambe).
Typy metod
Metoda klasy w Object Pascalu może być metodą statyczną, wirtualną, dynamiczną i komunikacyjną. Oto przykład deklaracji metod każdego z wymienionych rodzajów
TFoo = class
Procedure Statyczna;
Procedure Wirtualna;virtual;
Procedure Dynamiczna;dynamic;
Procedure Komunikacyjna ( var M: TMessage ); message wm_SomeMessage;
End;
Metody statyczne
Metoda, której deklaracja nie jest opatrzona żadnymi dodatkowymi klauzulami, jest metodą statyczną.
Funkcjonuje ona podobnie do „zwykłej” procedury lub funkcji, jej adres znany jest już w czasie kompilacji, a jej wywołanie przebiega bardzo efektywnie. Metody statyczne nie udostępniają jednak żadnych korzyści płynących z polimorfizmu.
Wskazówka
W przeciwieństwie do C++, klasy Object Pascala nie mogą posiadać statycznych pól. W Object Pascalu pole jest zawsze częścią egzemplarza klasy (czyli obiektu) — zmiana zawartości pola w jednym obiekcie nie ma wpływu na jego zawartość w innym; pole statyczne jest natomiast częścią klasy, wspólną dla wszystkich jej obiektów, ma więc dla nich charakter globalny. Symulacją (do pewnego stopnia) globalnych pól klasy może być w Object Pascalu wykorzystanie zmiennych globalnych modułu (w jego części prywatnej) — w treści metod zmienne takie zachowują się tak, jak zachowywałyby się pola statyczne (gdyby istniały)15.
Metody wirtualne
Dziedziczenie wiąże się z możliwością przedefiniowywania ( overriding) metod obiektu. Oznacza to, że metoda o danej nazwie może mieć zupełnie różne działanie dla różnych klas (macierzystej i pochodnej). Innymi słowy, kompilator, znając nazwę metody, nie potrafi określić jej konkretnego adresu, gdy nie zna konkretnego obiektu (a właściwie jego typu), na rzecz którego jest ona aktywowana.