[ Pobierz całość w formacie PDF ]
nazw są dostępne we właściwym oknie dialogowym (wyświetlanym przez wybór opcji
Tools/Options/Delphi Options/Library).
n n u
Możesz się spotkać z sytuacją, w której moduł odwołuje się w klauzuli do mo-
dułu , który z kolei w swojej klauzuli odwołuje się do modułu . Nazy-
wamy to cyklicznymi odwołaniami do modułów. Wystąpienia tego typu sytuacji z reguły
wskazują na błędy popełnione w fazie projektowania aplikacji. Powinieneś unikać two-
rzenia tego typu struktur w swoich programach. Optymalnym rozwiązaniem tego problemu
jest w większości przypadków przeniesienie tej części danych, do której odwołują się
oba moduły, do nowego, trzeciego modułu. Okazuje się jednak, że podobnie jak wielu
innych niewygodnych konstrukcji, także cyklicznych odwołań do modułów nie zawsze
można uniknąć w tak prosty sposób. Pamiętaj, że takie odwołania są niepoprawne, jeśli
w obu modułach znajdują się w części implementacji lub w obu modułach należą do
części interfejsu. Wobec tego w wielu przypadkach najlepszym rozwiązaniem jest prze-
niesienie odpowiedniej klauzuli w jednym module do części implementacji i pozo-
stawienie cyklicznej klauzuli drugiego modułu w dotychczasowej lokalizacji (lub
odwrotnie). Zazwyczaj w ten sposób można rozwiązać problem cyklicznych odwołań
do modułów3.
Pakiety Delphi umożliwiają nam umieszczanie wybranych części naszej aplikacji w wy-
odrębnionych modułach, które w postaci tzw. podzespołów .NET mogą być następ-
nie współdzielone przez wiele aplikacji opracowanych dla tej platformy.
Pakiety i podzespoły .NET omówimy bardziej szczegółowo w rozdziale 6., Podzespoły
.NET, biblioteki i pakiety .
3
Więcej informacji na temat cyklicznego odwołania do modułów znajdzie Czytelnik w rozdziale 4.,
Programy, moduły i przestrzenie nazw przyp. red.
126 Część ll Język programowania Delphi for .NET
n
Na temat koncepcji programowania obiektowego, nazywanego także programowaniem
zorientowanym obiektowo (ang. Object-Oriented Programming OOP), napisano już
mnóstwo książek. Programowanie obiektowe jest często traktowane bardziej jak religia
niż jedna z metodologii projektowania wielu programistów stara się w sposób sztuczny
wymyślać i prezentować niezliczone zalety tej techniki, nie dopuszczając do siebie żad-
nych argumentów jej przeciwników. Nie jesteśmy ortodoksyjnymi zwolennikami pro-
gramowania obiektowego i nie mamy zamiaru prezentować w tej książce faktycznych
bądz wyimaginowanych zalet tej metodologii chcemy jedynie uczciwie przedstawić
najważniejsze podstawy, na których opiera się język programowania Delphi.
Programowanie obiektowe jest metodologią przewidującą stosowanie wyodrębnionych
obiektów zawierających zarówno dane, jak i kod w roli bloków wykorzystywanych
podczas budowy aplikacji. Chociaż metodologia OOP niekoniecznie musi prowadzić do
uproszczenia procesu tworzenia kodu, efektem jej stosowania w praktyce tradycyjnie jest
otrzymywanie kodu łatwiejszego do konserwacji. Połączenie danych i kodu obiektów
upraszcza proces wyszukiwania błędów w aplikacjach, naprawiania tych błędów i ogra-
niczania do minimum ich wpływu na pozostałe obiekty a więc przyczynia się do
udoskonalenia tworzonych aplikacji. Tradycyjnie każdy język obiektowy zawiera im-
plementację przynajmniej trzech zasadniczych właściwości koncepcji programowania
obiektowego:
Hermetyzacja4 jest związana z właściwym łączeniem uzależnionych
od siebie pól danych i jednoczesnym ukrywaniem odpowiednich szczegółów
implementacyjnych. Do korzyści płynących z zapewniania hermetyczności
należy możliwość dzielenia programów na odseparowane moduły oraz łatwość
izolowania od siebie poszczególnych części kodu.
Dziedziczenie wiąże się z możliwością tworzenia nowych obiektów
w oparciu o właściwości i funkcjonalność ich obiektów macierzystych.
Dziedziczenie umożliwia nam konstruowanie hierarchii obiektów podobnej
do struktury biblioteki VCL, w której mamy jeden najbardziej ogólny obiekt
oraz jego obiekty potomne, które na każdym kolejnym poziomie są coraz
bardziej szczegółowe.
Zaletą dziedziczenia jest możliwość współdzielenia tego samego kodu.
Na rysunku 5.1 przedstawiono przykład dziedziczenia, gdzie jeden obiekt
bazowy (Owoc) jest przodkiem wszystkich obiektów reprezentujących owoce,
w tym obiektu Melon. Obiekt Melon jest w przodkiem wszystkich obiektów
reprezentujących melonowate , w tym dla obiektu Arbuz. Przeanalizuj teraz
ten rysunek.
Polimorfizm polimorfizm dosłownie oznacza wielopostaciowość .
Wywołania wirtualnych metod zmiennej obiektowej powodują wywołania
kodu właściwego dla rzeczywistego egzemplarza tego obiektu, który aktualnie
(w czasie wykonywania programu) jest reprezentowany przez tę zmienną.
4
Możesz się również spotkać z określeniem enkapsulacja przyp. red.
Rozdział 5. Język Delphi 127
un
Przykładowa struktura
dziedziczenia
Zwróć uwagę na brak możliwości stosowania znanego z języka C++ mechanizmu wielo-
krotnego (wielobazowego) dziedziczenia w środowisku uruchomieniowym .NET CLR
takiej możliwości nie daje także język programowania Delphi for .NET.
Zanim przejdziemy do omawiania podstawowych pojęć związanych z metodologią pro-
gramowania obiektowego, musimy się upewnić, że dobrze rozumiesz następujące terminy
nieodłącznie związane z tą metodologią:
Pole pola są zmiennymi reprezentującymi dane przechowywane wewnątrz
obiektów. Pola w obiektach pełnią identyczną rolę jak pola stosowane w rekordach
definiowanych w języku Delphi. W języku C# pola są niekiedy nazywane
danymi składowymi lub atrybutami.
Metoda jest to nazwa używana dla procedur i funkcji należących do obiektów.
W języku C# metody są czasami nazywane funkcjami składowymi.
Właściwość jest to konstrukcja pełniąca rolę akcesora do danych i kodu
zawartego w danym obiekcie, stanowi więc połączenie koncepcji pola i metody.
Właściwości przypominają pola, ponieważ określają taki sposób dostępu do pól
i metod, który ukrywa przed użytkownikiem szczegóły implementacji danego
obiektu.
W ogólności uważa się, że bezpośrednie udostępnianie pól obiektu jest złym stylem
programowania obiektowego, ponieważ utrudnia przyszłe zmiany szczegółów
implementacyjnych obiektu. Zamiast bezpośrednich odwołań do pól obiektu
powinieneś używać odpowiednich właściwości dostępowych, które z jednej strony
stworzą standardowy interfejs obiektu, a z drugiej nie będą zmuszały użytkownika
do zagłębiania się w strukturę jego implementacji. Właściwości zostaną omówione
w punkcie Właściwości w dalszej części podrozdziału.
n h
Jak już wspomnieliśmy, klasy są strukturami, które mogą zawierać zarówno dane, jak i kod
(metody). Obiekty są tworzonymi w czasie wykonywania programu egzemplarzami
tych klas. Klasy w języku Delphi dają nam wszystkie możliwości wynikające z podsta-
wowych cech koncepcji programowania obiektowego, a więc dziedziczenie, hermetycz-
ność i polimorfizm.
128 Część ll Język programowania Delphi for .NET
n
Zanim będziemy mogli stosować obiekty w naszym kodzie, oczywiście musimy go naj-
pierw zdefiniować za pomocą słowa kluczowego . Wspominaliśmy już w tym roz-
dziale, że klasy są deklarowane w części modułu lub programu:
Poza samą deklaracją klasy zazwyczaj będziemy dodatkowo wykorzystywali zmienną
tego typu (egzemplarz tej klasy) zadeklarowaną w części :
W języku programowania Delphi egzemplarze obiektu tworzy się przez wywołanie jed-
nego z jej konstruktorów. Konstruktor odpowiada nie tylko za stworzenie egzemplarza
naszego obiektu, ale także za przydzielenie mu odpowiedniej ilości pamięci lub inicjaliza-
[ Pobierz całość w formacie PDF ]