Programowanie obiektowe Pierwsze starcie ;)
1
Jak to określić? Programowanie obiektowe pozwala nam posługiwać się rzeczywistymi pojęciami, które znamy z codziennego życia. Nie musimy zatem odwoływać się do określonej specyfiki języka maszynowego, ani też nawet do jego bardziej abstrakcyjnych wersji (ale nadal odległych od rzeczywistości, która nas otacza).
Obiektowość upraszcza nie tylko samo programowanie, ale także fazę projektowania oprogramowania. Pojęciem kluczowym dla tego sposobu programowania jest obiekt.
2
Czym jest obiekt? Obiekt jest tworem abstrakcyjnym jednak w dużym stopniu odzwierciedlającym rzeczywistą charakterystykę i działanie maszyn, ludzi, organizacji, itp. Z obiektem możemy utożsamiać 3 cechy: a) stan - dane opisujące obiekt tzw. składowe czyli informacje które obiekt ZNA, b) zachowanie - funkcje jakie może wykonywać obiekt tzw. metody, czyli zachowania które obiekt WYKONUJE, c) tożsamość od siebie.
- pozwala na jednoznaczne odróżnianie obiektów
3
Pojęcie klasy Klasa jest pojęciem pierwotnym dla obiektu ponieważ każdy obiekt jest reprezentantem jakiejś klasy obiektów (czyli, że obiekty powstają na podstawie wcześniej zdefiniowanego opisu klasy). Klasa grupuje obiekty tego samego rodzaju, posiadające tę samą strukturę.
Klasę możemy wyobrazić sobie jako matrycę służącą do tworzenia obiektów. W ten sposób informujemy kompilator jakie składowe i jakie metody zawiera dana klasa, a co za tym idzie poszczególne obiekty, które są związane z daną klasą.
4
Przykład klasy Rozpatrzmy klasę samochód. Jak wiemy każdy obiekt typu samochód posiada dość podobną charakterystykę i funkcjonalność. Przykładem opisu klasy samochód może być kolor, masa, rodzaj silnika, elementy wyposażenia, itp. Jako funkcje (metody) możemy z kolei wyróżnić: zmianę prędkości, zmianę biegu, hamowanie, przyspieszanie, itp. Mamy więc klasę samochód na postawie której możemy stworzyć obiekty tej klasy, a więc konkretne wystąpienia klasy takie jak np. Ford, Mercedes, Honda, itp. 5
Prościej
Obiekt składa się z opisujących go danych oraz może wykonywać ustalone czynności.
6
przykład
7
Klasa i kilka obiekt贸w
8
Komunikacja obiektów W sposób uproszczony możemy przyjąć, że program
obiektowy składa się z wielu obiektów komunikujących się między sobą, wymieniających informacje i wywołujących wzajemnie swoje metody. Musi zatem istnieć odpowiedni mechanizm komunikacji obiektów. Obiekty zwykle komunikują się poprzez wywołanie metod publicznych, tzn. takich które są dostępne spoza samego obiektu macierzystego.
9
Wywołanie metody W przykładzie widzimy, że obiekt kierowca wywołuje metodę publiczną zmianaBiegu obiektu samochód.
Metoda zmianaBiegu(3)
Obiekt kierowca
Obiekt samochód
10
Czym jest enkapsulacja? Enkapsulacja jest próbą ukrycia niektórych składowych i metod obiektu przed dostępem z zewnątrz (czyli przez inne obiekty). Dobrym zwyczajem jest pisanie dla wszystkich składowych (zmiennych) do których istnieje potrzeba dostania się z zewnątrz obiektu, odpowiednich metod dostępowych. Na przykład dla zmiennej int liczba, napisalibyśmy dwie metody dostępowe ustawLiczbe(int x) ustalającą wartość zmiennej na podaną wartość x i pobierzLiczbe() zwracającą aktualną wartość liczby. Taki sposób programowania chroni składową x przed bezpośrednim dostępem i ingerencją z zewnątrz. Dzięki temu w metodach dostępowych można kontrolować sposób zmiany tej wartości. 11
Klasyfikatory dostępu Ze względu na możliwy dostęp wyróżniamy 3 rodzaje składowych: 1) prywatne danej klasy
(private) – przeznaczone wyłącznie do użytku wewnątrz
2) publiczne (public) – dostęp do nich jest nieograniczony, tzn. możliwy zarówno w ramach klasy jak i spoza niej, 3) chronione (protected) – dostępne wewnątrz danej klasy, ale również dla klas potomnych oraz klas i metod zaprzyjaźnionych (o tym powiemy później).
12
Jak to wygląda w C++ Zdefiniowanie klasy opiera się zazwyczaj na określeniu jej nazwy, składowych oraz metod, które w niej występują. Dodatkowo składowe i metody należy umieścić w odpowiedniej sekcji określającej możliwości dostępu do danego elementu składowego (private, protected lub public).
13
Przykład kodu
14
15
16
17
Inny spos贸b definicji klasy
18
19
20
21
Programy w dobrym stylu ;)
22
Prościej – lecz mniej elegancko Możemy napisać program, który nie będzie przestrzegał tych zasad. Możemy, ale czy powinniśmy ? 1. Czasami zachodzi potrzeba użycia bezpośredniego dostępu do składowych w celu uproszczenia jakiegoś obiegu albo przetwarzania informacji. 2. Generalnie jednak nie powinniśmy tego robić, gdyż jest to niezgodne z zasadą enkapsulacji, która stanowi jeden z fundamentów programowania obiektowego.
23
Przykład
24
25
Przykład 2 Tematem przykładu będzie program przechowujący informacje na temat liczb zespolonych i potrafiący obliczyć sumę dwóch takich liczb. Jak wszyscy wiedzą, liczbą zespoloną nazywamy parę uporządkowaną liczb rzeczywistych (a,b).
Często taka parę zapisuje się w postaci sumy:
Oznaczenia: a – część rzeczywista, b – część urojona
26
Przykład kodu
27
28
29
Dodatkowo zdefiniujemy funkcje (poza klasą), która będzie obliczać sumę dwóch liczb zespolonych. Argumentami tej funkcji będą, rzecz jasna, dwie liczby zespolone. Wynikiem działania powinna być suma tych dwóch liczb, a więc również liczba zespolona.
Metoda ta tworzy nowy obiekt typu zespolona i wpisuje do niego parametry a,b, które zostały wcześniej obliczone zgodnie z definicją sumy dwóch liczb zespolonych.
30
Ostatnia linia kodu jest dość ciekawa. Odnosimy się w niej do obiektu, który choć istnieje to nigdzie wcześniej go nie deklarowaliśmy, ani nie posiada on nazwy. Wynika to stąd iż pracujemy bezpośrednio na obiekcie zwróconym przez funkcję suma.
31
Konstruktor Konstruktor obiektu to metoda składowa klasy. Metoda ta uruchamiana jest automatycznie w czasie tworzenia każdego nowego obiektu danej klasy. Zazwyczaj używa się go do inicjalizowania danych (składowych) określonego obiektu. Dwie ważne informacje na temat konstruktora:
32
Klasa może mieć więcej niż jeden konstruktor Oznacza to, że może istnieć kilka możliwości inicjalizowania składowych klasy. Jeżeli istnieje kilka konstruktorów (a więc metod o tej samej nazwie) to mówimy, iż nastąpiło przeładowanie nazw metod. To który konstruktor będzie wywołany zależeć będzie od rodzaju argumentów, które mu podamy.
33
Napiszemy klasę Osoba, tym razem jednak zamiast metody wpiszDane posłużymy się odpowiednim konstruktorem. Dodatkowo przechowywać będziemy informacje o wysokości płac danej osoby, przy czym liczba pensji o której przechowujemy informacje dla danej osoby może być różna (trzeba będzie więc zastosować odpowiednią strukturę dynamiczną).
34
O konstruktorze bezargumentowym mówimy, iż jest to konstruktor domniemany. Dlaczego tak ? Otóż jeżeli programista sam nie zdefiniuje żadnego konstruktora to kompilator automatycznie i samodzielnie stworzy domyślnie konstruktor bezargumentowy. Kompilator zatem domniema iż w przypadku, gdy sami nie zatroszczyliśmy się o zdefiniowanie konstruktora to praca ta spada na niego. Nie może bowiem zaistnieć klasa, która nie posiada konstruktora.
35
Uwagi:
n – liczba pensji do zapamiętania Zmienna place to wskaźnik na obiekt typu float. W ten sposób możemy wskazać na początek tablicy, która będzie przechowywać informacje o płacach w kolejnych miesiącach.
36
37
destruktor Metoda o nazwie ~Osoba to destruktor. Pojawia się pytanie: po co nam destruktor ? Naturalnie kojarzy nam się on z czymś odwrotnym niż konstruktor. I słusznie. Destruktor wywoływany jest przy usuwaniu obiektu z pamięci.
38
39
40
W funkcji main utworzyliśmy 3 obiekty. Dla jednego obiektu wykorzystany został konstruktor domniemany, bezargumentowy, dla pozostałych konstruktor argumentowy.
Uwaga! Jeżeli zdefiniujemy konstruktor argumentowy, a chcemy używać do tworzenia obiektów również konstruktora bezargumentowego, to musimy go jawnie zdefiniować. Wynika to z tego, iż w przypadku, gdy programista sam zdefiniuje jakikolwiek konstruktor, kompilator nie będzie już tworzył automatycznie bezargumentowego konstruktora domniemanego. Innymi słowy kompilator stworzy konstruktor za nas tylko i wyłącznie wówczas jeżeli sami nie zdefiniujemy żadnego swojego konstruktora.
Trzeci obiekt istnieje w ramach wydzielonego bloku kodu. Zakończenie tego bloku jest jednoznaczne z zakończeniem cyklu życia obiektu o nazwie os3. Przed usunięciem obiektu wywoływany jest destruktor, który zwalnia pamięć zarezerwowaną wcześniej na tablicę płac dla osoby reprezentowanej przez ten obiekt.
41
dziękuję
42