Katalog

Anna Rozwadowska
Informatyka, Artykuły

Wstęp do programowania obiektowego

- n +

Wstęp do programowania obiektowego

Typ obiektowy jest typem strukturalnym i definiuje obiekty abstrakcyjne. Podobnie jak rekord składa się z pól opisujących obiekt i jego właściwości oraz funkcji, które określają czynności jakie można na danym obiekcie wykonać. Funkcje te często nazywamy metodami.

Jeżeli za przykład obiektu przyjmiemy samochód, to takie wielkości jak kolor, marka, zużycie paliwa, wymiary (szerokość i wysokość), ilość drzwi, czy też ciężar są właściwościami tego obiektu. Definiując typ obiektowy opisujący samochód należałoby umieścić w definicji odpowiednie pola, które przechowywały by wyżej wymienione istotne informacje o obiekcie. Samochód można poddać pewnym czynnościom jak np. zapalenie silnika, zgaszenie silnika, wjazd do garażu, wykonanie skrętu, włączenie świateł lub wycieraczek, wyczyszczenie karoserii itp. W języku programowania mówimy, że na obiekcie wykonujemy pewną czynność, którą nazywamy metodą. Metoda jest niczym innym jak operacją (czynnością), którą można wykonać na obiekcie.

Przykładem obiektu bardziej związanym z informatyką może być napis. Do jego podstawowych właściwości można zaliczyć długość, kolor tekstu lub atrybuty jakimi zostanie on wypisany na ekranie, położenie napisu na ekranie. Napis taki może mieć określone dwa rodzaje atrybutów: normalne, którymi zwyczajowo będzie wypisywany na ekranie oraz atrybuty, które otrzyma napis w momencie gdy zostanie w jakiś sposób wyróżniony (wprowadzony w stan aktywności). Wówczas każde z tych atrybutów są właściwością takiego obiektu. Ponadto informację o tym czy obiekt aktualnie znajduje się w stanie aktywnym czy też nie również można uznać za właściwość tego obiektu.

Za możliwe do wykonania na takim obiekcie metody można przyjąć wypisanie napisu, usunięcie napisu z ekranu, wprowadzenie napisu w stan aktywny, usunięcie z napisu np. pierwszego znaku, itp.
Type
Nazwa = Object
Private
{deklaracje pól obiektu}
Public
{deklaracje pól obiektu}
End;


Typ obiektowy składa się z dwóch sekcji: prywatnej i publicznej. Obie sekcje mogą zawierać deklaracje zmiennych opisujących obiekt lub metod, które będą wykonywane na obiekcie. Jeżeli obiekt jest definiowany w pliku zawierającym program, to sekcje Private i Public są nierozróżnialne i można pominąć oba te słowa - domyślnie wszystkie sekcje są publiczne. W przypadku definicji typu obiektowego w module istnieje różnica pomiędzy sekcjami typu obiektowego: program dołączający moduł zawierający typ obiektowy może się odwoływać wyłącznie do pól publicznych tego obiektu, dostęp do pól prywatnych jest zabroniony.

Jako najprostszy przykład obiektu można podać wektor na płaszczyźnie. Typ opisujący taki obiekt może mieć postać:

Type
Wektor = Object
dx, dy: Real;
Function Dlugosc: Real;
Procedure Wypisz;
Procedure Dodaj(w: Wektor);
End;


W definicji obiektu umieszczono pola: dx i dy, w których przechowywane będą współrzędne wektora, metodę Dlugosc wartością której będzie długość wektora, metodę Wypisz której zadaniem będzie wypisanie na ekranie współrzędnych wektora oraz metodę Dodaj która będzie dodawać dwa wektory.

Wszystkie metody obiektu muszą zostać zdefiniowane poza typem obiektowym. Definiując metodę podaje się tzw. kwalifikowaną nazwę metody, która składa się z nazwy typu obiektowego oraz faktycznej nazwy metody - oba te człony oddzielane są od siebie znakiem kropki. Dzięki temu można w kilku różnych typach obiektowych zadeklarować metodę o tej samej nazwie, w przeciwnym razie kompilator nie wiedziałby do którego typu obiektowego należy definiowana metoda.

Definicje metod typu obiektowego Wektor mogą mieć postać:

Function Wektor.Dlugosc;
Begin
Dlugosc:=Sqrt(dx*dx+dy*dy);
End;
Procedure Wektor.Wypisz;
Begin
Write('', dx:0:2, ';', dy:0:2, '');
End;
Procedure Wektor.Dodaj;
Begin
dx:=dx+w.dx;
dy:=dy+w.dy;
End;


Definiując metody można pominąć zarówno ich argumenty jak również typ wyniku metody gdyż zostały one określone w definicji typu obiektowego.

Do pól obiektu odwołujemy się tak samo jak do pól rekordu za pomocą znaku kropki. Jeżeli więc w jest zmienną typu Wektor, to wyrażenie w.dx identyfikuje zmienną typu Real i jest polem dx obiektu w. W ten sam sposób wywołujemy metody typu obiektowego: wyrażenie w.Dlugosc jest typu Real i zwraca długość wektora w - dokładniej mówimy, że wyrażenie to jest wywołaniem metody Dlugosc na rzecz obiektu (dla obiektu) w. Wyrażenie w.Wypisz nie ma określonego typu ponieważ metoda Wypisz nie jest funkcją tylko procedurą, niemniej jednak instrukcja

w.dx:=-2;
w.dy:=5;
w.Wypisz;


spowoduje wywołanie metody Wypisz dla obiektu w, w konsekwencji czego wypisane zostaną współrzędne wektora w zgodnie z definicją metody Wypisz.

W definicji metody Dodaj występują dwa rodzaje identyfikatorów: dx i dy oraz w.dx i w.dy. Odwołania w.dx i w.dy podobnie jak w przypadku rekordu są odwołaniami do pól dx i dy obiektu w będącego argumentem metody. Odwołania dx i dy są natomiast odwołaniami do pól obiektu dla którego metoda została wywołana.

Niech dane będą zmienne u, v: Wektor oraz wywołanie metody:

u.Dodaj(v);


Metoda Dodaj została wywołana dla wektora u w związku z czym w jej definicji zmienne dx i dy oznaczają składowe wektora u. Wyrażenia w.dx i w.dy są natomiast odwołaniami do obiektu v będącego argumentem metody. W efekcie wykonania powyższej instrukcji wektor u będzie zawierał sumę wektorów u i v, co schematycznie można zapisać za pomocą instrukcji u:=u+v (zapis ten nie jest jednak w Pascalu możliwy - niemożliwe jest bowiem dodawanie wyrażeń typów niestandardowych języka).

Obiekty mogą być argumentami dowolnych funkcji i procedur. Można zdefiniować zwykłą funkcję, nie będącą funkcją typu obiektowego Wektor, obliczającą np. długość wektora - wówczas wektor przekazujemy do funkcji w postaci argumentu:

Function Dlugosc2(w: Wektor): Real;
Begin
Dlugosc2:=Sqrt(w.dx*w.dx+w.dy*w.dy);
End;


Tak zdefiniowaną funkcję wywołujemy jak każdą inną funkcję języka:

Var
a: Wektor;
Begin
WriteLn('Długość wektora wynosi = ', Dlugosc2(a):0:2);
End.


w odróżnieniu od metody, której wywołanie musi mieć postać

WriteLn('Długość wektora wynosi = ', a.Dlugosc:0:2);

W tym wypadku to jaka metoda będzie stosowana w programie zależy od programisty i nie ma to większego znaczenia.
 

Opracowanie: Anna Rozwadowska

Wyświetleń: 833


Uwaga! Wszystkie materiały opublikowane na stronach Profesor.pl są chronione prawem autorskim, publikowanie bez pisemnej zgody firmy Edgard zabronione.