Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK
Tematyka wykładu Idea programowania obiektowego Definicja a deklaracja klasy Dane składowe (atrybuty) Funkcje składowe (metody) Sposoby ukrywania informacji w klasie Tworzenie obiektów klas Posługiwanie się składnikami klasy 2
Wstęp Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych, która definiuje programy za pomocą obiektów elementów łączących: stan (czyli dane = atrybuty), zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów. 3
Programowanie obiektowe a rzeczywistość Formie w programowaniu obiektowym odpowiada klasa, materii - instancja - obiekt. Jest to najbardziej naturalny sposób rozumienia rzeczywistości podstawową cechą mózgu ludzkiego jest klasyfikacja - łączenie występujących w rzeczywistości obiektów w grupy - klasy. 4
Podstawowe założenia paradygmatu obiektowego Cechy języków programowania, które czynią je obiektowymi: Abstrakcja - każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan, oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaimplementowano dane cechy. Enkapsulacja - czyli ukrywanie implementacji, hermetyzacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. 5
Podstawowe założenia paradygmatu obiektowego Polimorfizm - referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji powoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu - na przykład szablony i przeciążanie operatorów w C++. Dziedziczenie - porządkuje i wspomaga polimorfizm i enkapsulację dzięki umożliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. 6
Pojęcia klasy i obiektu Obiekt to podstawowe pojęcie wchodzące w skład paradygmatu obiektowości w analizie i projektowaniu oprogramowania oraz w programowaniu. Klasa to zbiór obiektów wyróżniających się wspólnymi cechami takimi jak struktura i zachowanie; częściowa lub całkowita definicja dla obiektów. 7
Pojęcia klasy i obiektu Obiekt jest to struktura zawierająca: dane (atrybuty klasy) metody klasy, czyli funkcje służące do wykonywania na tych danych określonych zadań. Z reguły obiekty (a właściwie klasy, do których te obiekty należą) są konstruowane tak, aby dane przez nie przenoszone były dostępne wyłącznie przez odpowiednie metody, co zabezpiecza je przed niechcianymi modyfikacjami. Takie zamknięcie danych nazywa się enkapsulacją czyli jakby zamknięcie ich w kapsule. W istocie obiekty są rozwinięciem koncepcji programowania z kontrolą typów zmiennych. W programowaniu obiektowym obiekty tworzone są dynamicznie jako podstawowy element konstrukcji programu. 8
Pojęcia klasy i obiektu Każdy obiekt ma trzy cechy: tożsamość, czyli cechę (atrybuty) umożliwiającą jego identyfikację i odróżnienie od innych obiektów stan, czyli aktualny stan danych składowych zachowanie (ang. behaviour), czyli zestaw metod wykonujących operacje na tych danych. 9
Klasa - definicja Klasa to zdefiniowanie własnego typu danych - wymyślony na potrzeby danego programu. Ten typ, to nie tylko jedna lub kilka zebranych liczb, ale to również sposób ich zachowania jako całości. 01. class mojaklasa 02. { 03. // ciało klasy 04. //... 05. }; 10
1/14/2017 Tworzenie obiektów tworzenie obiektu klasy mojaklasa obiektmojaklasa; tworzenie wskaźnika do obiektu klasy mojaklasa * wskazniknaobiektymojaklasa; tworzenie referencji (przezwiska) do obiektu klasy mojaklasa & obiektmojaklasa = wskazniknaobiektymojaklasa; 11
1/14/2017 Składniki klasy 1. class mojaklasa 2. { 3. // ---------------- atrybuty klasy (cechy charakterystyczne klasy) 4. int a; // definicja zmiennej typu całkowitego 5. float b[10]; // definicja tablicy typu rzeczywistego 6. char *c; // definicja wskaźnika na zmienną znakową 7. // ---------------- funkcje składowe klasy (metody klasy) 8. int funkcja1(); // deklaracja funkcji zwracającej typ int 9. float funkcja2(); // deklaracja funkcji zwracającej typ float 10. char funkcja3(); // deklaracja funkcji zwracającej typ char 06. }; 12
1/14/2017 Składniki klasy 1. class radio 2. { 3. // ---------------- atrybuty klasy (cechy charakterystyczne klasy) 4. int glosnosc; // definicja zmiennej typu całkowitego 5. float czestotliwosc[10];// definicja tablicy typu rzeczywistego 6. char *nazwa; // definicja wskaźnika na zmienną znakową 7. // ---------------- funkcje składowe klasy (metody klasy) 8. void UstawGlosnosc( ); 9. float PobierzCzestotliwosc( ); 10. void wypisz(); 11. }; 13
1/14/2017 Definicja funkcji składowych wewnątrz klasy: 1. class mojaklasa 2. { 3. int a; 4. //------------------------ definicja metody 5. void mojafunkcja(void) 6. { 7. cout<< "zmienna a = "<< a; 8. } 9. //------------------------------------------- 10.}; 14
Definicja funkcji składowych na zewnątrz klasy: 1. class mojaklasa 2. { 3. int a; 4. void mojafunkcja(void); // deklaracja metody 5. }; 6. //------------------------ definicja metody 7. void nazwa_klasy::funkcja(void) 8. { 9. cout<< "zmienna a = "<< a; 10.} 11.//------------------------------------------ 15
1/14/2017 Definicja funkcji składowych 1. class radio{ 2. int glosnosc; 3. float czestotliwosc[10]; 4. char *nazwa; 5. void UstawGlosnosc(int & ); // deklaracja metody 6. float PobierzCzestotliwosc( ); // deklaracja metody 7. //----------------------------------------- definicja metody 8. void wypisz(){ 9. cout<< "Radio "<< nazwa<< endl; 10. } 11.//---------------------------------------------------------- 12.}; 13.//----------------------------------------- definicja metody 14.void radio::ustawglosnosc(int & _a){ 15. glosnosc = _a; 16.} 17.//---------------------------------------------------------- 16
Sposoby ukrywania informacji prywatny - składniki klasy dostępne są tylko i wyłącznie w klasie i poprzez funkcje składowe klasy. private: publiczny - składniki klasy dostępne zarówno dla funkcji składowych klasy jak również poza klasą. public: chroniony - składniki klasy nie dostępne poza klasą, jednak dostępne dla klas pochodnych. protected: 17
Dostęp do danych składowych obiekt - do danej składowej klasy można odwołać się poprzez operator. obiekt.skladnik wskaźnik - odniesienie się do danej składowej obiektu pokazywanego wskaźnikiem można odwołać się poprzez operator -> wskaznik->skladnik referencja - do danej składowej obiektu znanego z referencji można odwołać się poprzez operator. referencja.skladnik 18
Dostęp do funkcji składowych obiekt - do funkcji składowej klasy można odwołać się poprzez operator. obiekt.funkcja( ); wskaźnik - odniesienie się do funkcji składowej obiektu pokazywanej wskaźnikiem można odwołać się poprzez operator -> wskaznik->funkcja( ); referencja - do funkcji składowej obiektu znanego z referencji można odwołać się poprzez operator. referencja.funkcja( ); 19
Struktura 01. struct mojastruktura 02. { 03. // ciało struktury 04. //... 05. }; Domyślnie składniki klasy są wstawione do zakresu public: 20
Koniec Dziękuję za uwagę i zapraszam na 15 minut przerwy. W dalszej części ćwiczenia do samodzielnego wykonania. 21
1/14/2017 Ćwiczenia do wykonania Zadanie 1 Napisz klasę punkt2d pozwalający przechowywać informację dotyczące punktu w dwuwymiarowym układzie współrzędnych kartezjańskim. Dane składowe (atrybuty) klasy powinny znaleźć się w prywatnym zakresie danych. Ponadto należy napisać funkcje składowe (metody) klasy pozwalające na: ustawienie własności klasy; wypisanie własności klasy według wzorów: (x,y), [x,y], {x,y}; pobranie wartości współrzędnej x; pobranie wartości współrzędnej y; obliczenie odległości obiektu klasy punktu2d od początku układu współrzędnych; obliczenie odległości pomiędzy dwoma obiektami klasy punkt2d; Przynajmniej jedna funkcja musi być zdefiniowana wewnątrz i na zewnątrz definicji klasy. Następnie w funkcji main stworzyć przynajmniej dwa obiekty klasy punkt2d oraz jedną zmienną dynamiczną klasy punkt2d Zaprezentować działanie metod klasy na stworzonych obiektach. Wykorzystać sposób ukrywania informacji w klasie. 22