Wprowadzenie do obiektowości

Podobne dokumenty
Wprowadzenie do obiektowości

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

Dziedziczenie i interfejsy

TEMAT : KLASY DZIEDZICZENIE

Podstawy Programowania Obiektowego

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Definiowanie własnych klas

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wykład 8: klasy cz. 4

Programowanie obiektowe - 1.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wprowadzenie do programowanie obiektowego w języku C++

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe w języku C++

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Technologie i usługi internetowe cz. 2

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Mechanizm dziedziczenia

Do czego służą klasy?

Mechanizm dziedziczenia

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Materiały do zajęć VII

PARADYGMATY PROGRAMOWANIA Wykład 4

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Dokumentacja do API Javy.

Zaawansowane programowanie w języku C++ Klasy w C++

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Szablony klas, zastosowanie szablonów w programach

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Aplikacje w środowisku Java

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASY cz.1. Dorota Pylak

Wstęp do programowania obiektowego. Wykład 2

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Do czego służą klasy?

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

TEMAT : KLASY POLIMORFIZM

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Klasy i obiekty cz II

Polimorfizm. dr Jarosław Skaruz

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Rozdział 4 KLASY, OBIEKTY, METODY

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

PARADYGMATY PROGRAMOWANIA Wykład 2

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Język C++ zajęcia nr 2

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Interfejsy i klasy wewnętrzne

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Wykład 5: Klasy cz. 3

Programowanie strukturalne i obiektowe. Funkcje

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Definiowanie własnych klas

Języki i techniki programowania Ćwiczenia 2

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Technologie obiektowe

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wstęp do Programowania 2

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Aplikacje w środowisku Java

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Programowanie obiektowe

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Wykład 4: Klasy i Metody

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

PARADYGMATY PROGRAMOWANIA Wykład 3

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Enkapsulacja, dziedziczenie, polimorfizm

Dziedziczenie jednobazowe, poliformizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Transkrypt:

Wprowadzenie do obiektowości

Obiekt jest abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentujący rzecz (obiekt fizyczny), pojęcie (obiekt konceptualny) lub pewny byt programistyczny nie mający swojego odpowiednika w rzeczywistości. Klasa określa właściwości i możliwości każdego obiektu do niej należącego, definiuje zatem to, jak obiekt jest zbudowany i co potrafi. W szczególności klasa zawiera specyfikację danych i metod, implementację metod, informacje dotyczące relacji i powiązań z innymi klasami. Można różnić jeszcze następujące pojęcia: Tożsamość (ang. identity), pozwala na odróżnienie danego obiektu od każdego innego (poprzez jego unikatową nazwę lub adres w pamięci). Stan (ang. state), opisuje to co obiekt w danym momencie powinien wiedzieć aby sprawnie działać (poprzez zestaw atrybutów i przypisanych im wartości). Zdolność do działania (ang. behavior) opisuje operacje(metody), które obiekt może wykonać.

Właściwości (atrybuty): string Producent; int Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo();

Abstrakcja obiekt jest abstrakcją pewnego konkretnego bytu ze świata rzeczywistego, reprezentującego rzecz (obiekt fizyczny) lub pojęcie (obiekt konceptualny). Abstrakcja pozwala postrzegać modelowaną rzeczywistość bez wnikania w jej wewnętrzną strukturę. Enkapsulacja (hermetyzacja) dostęp do danych obiektu jest możliwy tylko przez określone operacje (metody) obiektu. Możliwa jest zmiana implementacji obiektu bez negatywnego wpływu na resztę programu. Polimorfizm - Referencje mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje 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. Diedziczenie pozwala na tworzenie hierarchicznych związków między klasami. Podklasa dziedziczy atrybuty i metodzie po nadklasie.

Abstrakcyjny model roweru Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); Rzeczywiste byty (rowery)

Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); PobierzProducenta(); ZmienProducenta(producent); PobierzKolor(); ZmienKolor(kolor); Należy odwoływać się do konkretnych metod, a nigdy bezpośrednio do wartości pól Przykład: ZmienProducenta( Author ); Zamiast Producent = Author ; Po co? Enkapsulacja pozwala obiektom kontrolować poprawność swojej reprezentacji wewnętrznej. Użytkownik odwołując się bezpośrednio do pola Producent może tam wpisać błędną wartość np. 1243, natomiast korzystając z metody ZmienProducenta() zostałby wyświetlony błąd.

Załóżmy, że istnieją 3 klasy: Rower, Samochód i Pojazd. Zarówno Rower jak i Samochód są pojazdami, więc mają jakieś cechy wspólne (Kolor, Producenta) i podobne możliwości (mogą jechać, zatrzymywać się i skręcać). Aby zatem nie powtarzać się tworząc te 3 klasy, wystarczy zdefiniować klasę Pojazd, a potem stworzyć klasy Rower i Samochód, które będą dziedziczyły wszystkie pola i metody klasy pojazd. Pojazd Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Stój(); Skręć_w_lewo(); Skręć_w_prawo(); Rower Właściwości (atrybuty): Typ roweru Metody: Nasmaruj łańcuch() Samochód Właściwości (atrybuty): Numer nadwozia Metody: Zatankuj();

Zarówno rower jak i samochód potrafią się poruszać, ale robią to w odmienny sposób (mimo, iż ogólna zasada jest taka sama). Musi być zatem znany obiekt, dla którego metoda poliformiczna jedź() ma zadziałać. Rower Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); Samochód Właściwości (atrybuty): Producent; Kolor; Metody: Jedź(); ob = new Rower(); ob.jedź(); //wywołanie metody Jedź z klasy Rower ob = new Samochód(); ob.jedź(); //wywołanie metody Jedź z klasy Samochód

Określenie klasy w języku C++ najczęściej jest rozdzielone na 2 części: Definicję wstawianą w pliku nagłówkowym (*.h), w której określane są pola klasy i prototypy metod. Implementację umieszczoną w określonym module programu (*.cpp), stanowiąca ciało (kod) wcześniej zadeklarowanych metod. Nie jest to natomiast wymagane przez składnie języka. Jest to natomiast mocno zalecane, zwłaszcza przy okazji realizacji dużych projektów. Jak się przekonamy C++ umożliwia 3 rodzaje definiowania klas.

Funkcje składowe w obrębie klasy Funkcje składowe poza klasą

Implementacja metod Zawartość pliku Protokat.cpp Interfejs klasy Zawartość pliku Protokat.h

Każda składowa klasy może być zdefiniowana jako: Prywatna Dostępna jest tylko w danej klasie (private). Chroniona dostępna z danej klasy i wszystkich klas ją dziedziczących lub z funkcji zaprzyjaźnionych (protected). Publiczna dostępna skądkolwiek (public). Potrzebne są jeszcze metody udostępniające i zmieniające wartość danego elementu (pola). Mówimy zatem o tzw. akcesorach (ang. getter) i mutatorach lub modyfikatorach (ang. setter). Zalety enkapsulacji: 1. Ochrona przed zepsuciem. 2. Przejrzystość interfejsu. 3. Możliwa zmiana implementacji klasy bez wpływu na kod, który z niej korzysta, ponieważ interfejs publiczny pozostaje bez zmian.

Konstruktor specjalna funkcja aktywowana automatycznie, gdy tworzony jest obiekt. Powinna ona dokonać inicjacji określonych składowych i wykonać inne funkcje potrzebne do funkcjonowania obiektu danego typu. Konstruktor nie zwraca żadnego rezultatu, nosi nazwę taką samą jak nazwa klasy i zazwyczaj nie ma potrzeby wywoływać go jawnie w kodzie programu. Dwie wersje realizacji konstruktora: Wersja intuicyjna Wersja z listą inicjalizacyjną

Konstruktor ogólny pozwala na zainicjowanie pól obiektu na etapie jego deklaracji: Prostokat p(100, 200); Konstruktory podobnie jak funkcje można przeciążać. Dwie wersje realizacji konstruktora: Wersja intuicyjna Wersja z listą inicjalizacyjną

Przy założeniu, że mamy zdefiniowaną klasę Prostokąt, mającą 2 konstruktory: ogólny i parametrowy.

Aby przekopiować zawartość stanu jednego obiektu do drugiego nie wystarczy: Prostokat p1(100, 200); Prostokat p2 = p1; Trzeba zdefiniować konstruktor kopiujący odpowiedzialny za skopiowanie zawartości jednego obiektu do drugiego (tej samej klasy) na etapie inicjalizacji. Teraz zadziała: Prostokat p1(100, 200); Prostokat p2 = p1; Ale tak już nie: Prostokat p1(100, 200); Prostokat p2; p2 = p1; Dlaczego?

Załóżmy, że mamy klasę kwadrat zadeklarowaną następująco: Czy można napisać: Kwadrat k (50); Prostokat p( k ); Tak, jeśli zdefiniujemy konstruktor rzutujący, odpowiedzialny za skopiowanie zawartości obiektu pewnej klasy do innej klasy.

Parametr domyślny wartość określona na etapie deklaracji funkcji, która zostanie wstawiona do parametru formalnego, jeśli dana funkcja zostanie wywołana bez odpowiedniego parametru aktualnego: void zniszczswiat(int i, float f = 0, char c = Z ); void zniszczswiat(int i, float f, char c) { cout << Tak jest. Swiat zostanie zniszczony za << i << endl; cout << Koszt zniszczenia to : << f << zlotych << endl; cout << Zniszczenie swiata w dzisiejszym odcinku sponsorowala literka << c << endl; } Jeżeli stosujemy prototypy funkcji, wartości parametrów domyślnych określa się właśnie w prototypie, w definicji funkcji już nie występują.

Konstruktor domyślny: Jest bezparametrowy, lub posiada wszystkie parametry będące parametrami domyślnymi. Inicjuje obiekty, deklarowane (bądź tworzone) bez parametrów. Dotyczy to również obiektów będących elementami tablicy. Jeżeli dla danej klasy nie zdefiniowano żadnego konstruktora, kompilator syntetyzuje konstruktor domyślny. Nie należy mu ufać! Jeżeli dla danej klasy zdefiniowano jakiś konstruktor inny od domyślnego, a ten jest potrzebny lecz niezdefiniowany, kompilator zgłosi błąd. Konstruktor ogólny: Jest to podstawowy konstruktor przeznaczony do inicjowania obiektów na etapie ich deklaracji czy też tworzenia. Argumenty określają zwykle wartości jakie mają być przypisane określonym polom obiektu. Konstruktorów ogólnych może być więcej, mogą one zawierać również parametry domyślne.

Konstruktor kopiujący Jest potrzebny jedynie wtedy, gdy przewidziana jest inicjalizacja obiektu danej klasy innym obiektem tejże klasy. Istnieje też mechanizm kopiowania bitowego pole po polu wówczas konstruktor kopiujący nie jest potrzebny. Używanie konstruktora kopiującego jest dobrą praktyką. Konstruktor rzutujący Posiada jeden parametr będący referencją obiektu innej klasy. Innych argumentów może nie być lub powinny być one argumentami domyślnymi. Jest stosowany wszędzie tam, gdzie należy zainicjować obiekt pewnej klasy wartością obiektu innej klasy.

Zdefiniować klasę Data zawierającą pola prywatne: int dzien, int miesiac, int rok. Klasa powinna zawierać funkcje dostępowe, pobierające zawartość pól (np. podajdzien itd.), oraz fposzczególnych unkcje pozwalające na ustalanie zawartości pól (np. ustawdzien, itd.). Klasa ma posiadać konstruktor domyślny, zerujący wszystkie pola, oraz konstruktor ogólny, otrzymujący trzy parametry, trafiające odpowiednio do pól opisujących dzień, miesiąc, rok. Przetestować klasę wyprowadzając dane na ekran.

Zdefiniować klasę Punkt, przeznaczoną do reprezentowania punktów w przestrzeni dwuwymiarowej. Klasa powinna posiadać dwa pola prywatne x oraz y przeznaczone do przechowywania współrzędnych punktu, konstruktor domyślny, zerujący wartości tych pól, konstruktor ogólny umożliwiający ustawienie wartości pól (np. w deklaracji Punkt p(10, 20);). Ustawianie i pobieranie wartości pól powinny realizować funkcje dostępowe ustawx, ustawy, pobierzx, pobierzy.

Zdefiniować klasy reprezentujące płaskie figury geometryczne: Kwadrat, Prostokat, Kolo, Trapez. Klasy powinny posiadać pola przechowujące informacje niezbędne do obliczenia pól tych figur. Pola powinny być prywatne, dostęp do nich powinien być zapewniany przez odpowiednie metody pobierania i ustawiania wartości. Klasy powinny posiadać konstruktor bezparametrowy oraz ogólny, zapewniające inicjalizację wszystkich pól. Obliczenie pola danej figury powinna realizować odpowiednia funkcja składowa o nazwie obliczpole wyznaczona wartość pola powinna być jej rezultatem.

Zaprojektuj klasę RownanieKwadratowe, rozwiązującą równanie kwadratowe zapisane jako: Ax 2 + Bx + C = 0 Klasa powinna posiadać pola prywatne A, B, C, reprezentujące współczynniki równania, wraz z odpowiednimi akcesorami i modyfikatorami. Dodatkowo należy stworzyć funkcję składową delta(), obliczającą wyróżnik trójmianu, oraz trzy funkcje obliczające miejsca zerowe. Klasa powinna być wyposażona w konstruktor domyślny oraz trójparametrowy konstruktor ogólny. Należy zastanowić się nad przypadkiem, gdy równanie staje się liniowym tzn. A = 0 i zaproponować rozwiązanie tego problemu.

Obiekt stworzonej klasy może być wykorzystany następująco: RownanieKwadratowe r; double num; cout << Podaj A: ; cin >> num; r.ustawa( num ); cout << Podaj B: ; cin >> num; r.ustawb( num ); cout << Podaj C: ; cin >> num; r.ustawc( num ); if( r.delta() > 0 ) cout << "Pierwiastki rownania x1=" << r.obliczx1() << " x2=" << r.obliczx2() << endl; else if(r.delta() = 0 ) cout << "Pierwiastek podwójny x12=" << r.obliczx12() << endl; else cout << "Brak pierwiastkow rzeczywistych" << endl; Obiekty mogą być inicjowane następująco: RownanieKwadratowe r1; // Konstruktor inicjuje A=B=C=0; RownanieKwadratowe r2(3,2,1); // Konstruktor inicjuje A=3,B=2,C=1;

1. Załóżmy, że gromadzimy wodę mineralną. Są trzy rodzaje butelek o pojemności 2l (duże), średnie o pojemności 1l oraz małe o pojemności 0.5 litra. Stworzyć klasę MyWater z metodami: void addlarge(int) dodaje do zapasu wody podaną jako argument liczbę dużych butelek. void addmedium(int) dodaje do zapasu wody podaną jako argument liczbę średnich butelek. void addsmall(int) dodaje do zapasu wody podaną jako argument liczbę małych butelek. Dodatkowo należy zaimplementować metody umożliwiające uzyskanie informacji o tym ile jest każdego rodzaju butelek, oraz jaka jest łączna pojemność zgromadzonej wody. Pojemności butelek (dużych, małych, średnich) przedstawić jako pola statyczne. Dostarczyć metod pozwalających uzyskiwać informacje o tych pojemnościach oraz je zmieniać. Klasę przetestować wyprowadzając dane na ekran: Mam teraz 6.5 litrów wody. Dużych butelek: 2 Małych butelek: 3 Średnich butelek: 1