Programowanie obiektowe

Slides:



Advertisements
Podobne prezentacje
C++ wykład 9 ( ) Szablony.
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
Wstęp do programowania
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 4 Wojciech Pieprzyca.
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Wzorce.
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Programowanie w środowisku sieciowym
Tworzenie ASP.NET Web Form
ODE Zapytania. Pętla for (1) Do obiektów będących instancjami klas możemy uzyskać dostęp za pomocą pętli for Zakres tej pętli to wszystkie obiekty klasy.
Obiektowe metody projektowania systemów Command Pattern.
Dziedziczenie i jego rodzaje
C++ wykład 5 ( ) Dziedziczenie.
C++ wykład 6 ( ) Polimorfizm.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Podstawy programowania PP – WYK3 Wojciech Pieprzyca.
Podstawy programowania
Podstawy programowania PP – LAB4 Wojciech Pieprzyca.
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Podstawy programowania II
Łódź, 3 października 2013 r. Katedra Analizy Nieliniowej, WMiI UŁ Podstawy Programowania Złożona składnia języka C++
Podstawy Programowania
Programowanie strukturalne i obiektowe
Programowanie obiektowe III rok EiT
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Dziedziczenie Maciek Mięczakowski
Łódź, 3 października 2013 r. Katedra Analizy Nieliniowej, WMiI UŁ Podstawy Programowania Programy różne w C++
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Programowanie obiektowe 2013/2014
Programowanie w języku C++
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Wykład 2 Klasa Zesp i jej hermetyzacja 1.Przykład definicji klasy Zesp 2.Zmiana definicji klasy 3.Zmienne i funkcje statyczne PO2-1 / 28.
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Wątki, programowanie współbieżne
(według:
Programowanie obiektowe Wykład 10
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe Wykład 11
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
BYDGOSKI FESTIWAL NAUKI
PGO Dziedziczenie Michail Mokkas.
Zapis prezentacji:

Programowanie obiektowe Wykład Programowanie obiektowe Wykład 4 cz. I Dziedziczenie (C++) Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Dziedziczenie Co to jest dziedziczenie? Programowanie obiektowe Wykład Dziedziczenie Co to jest dziedziczenie? Jest to mechanizm umożliwiający tworzenie nowych klas na podstawie klasy już istniejących w ten sposób, że nowa klasa przejmuje (dziedziczy) wszystkie metody drugiej klasy . Zalety dziedziczenia: Możliwość tworzenia kodu, który da się wielokrotnie wykorzystać. Lepiej jest stosować kod już sprawdzony, niż wymyślać rozwiązanie od podstaw. Korzystanie z istniejącego kodu nie tylko skraca czas programowania, lecz również pozwala uniknąć błędów. Im mniej koncentrujemy się na szczegółach tym bardziej zrozumiały i przejrzysty jest cały projekt. Wzbogacanie istniejących klas o dodatkową funkcjonalność oraz deklarowanie w nowych klasach dodatkowych danych. Modyfikowanie działań metod już istniejących bez modyfikacji starego kodu. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład Klasa macierzysta Klasa oryginalna, na podstawie której tworzymy nową, nazywamy klasą macierzystą. Deklaracja klasy macierzystej (Pracownik.h) class Pracownik { private: enum [ILE = 20]; char imie[ILE]; char nazwisko[ILE]; char stanowisko[ILE]; double pensja; public: Pracownik(const char* i = „???”, const char* n = „???”, char* s = „???”, double p = 0); void wypiszDane() const; void ustawPensja(double); double getPensja() const; }; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Definicja klasy macierzystej Programowanie obiektowe Wykład Definicja klasy macierzystej Definicja klasy macierzystej (Pracownik.cc) Pracownik::Pracownik Pracownik(const char* i = „???”, const char* n = „???”, char* s = „???”, double p = 0) { strncpy(imie, i, ILE - 1); strncpy(nazwisko, n, ILE - 1); strncpy(stanowisko, s, ILE - 1); pensja = p; } void Pracownik::wypiszDane() const cout << imie << „ ” << nazwisko << „ ” << stanowisko << „ ” << pensja << endl; void Pracownik::ustawPensja(double p) double Pracownik::getPensja() const return pensja; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład Klasa potomna Klasa, która dziedziczy funkcjonalność innej klasy nazywamy klasą potomną. class Dyrektor : public Pracownik { private: double dodatekFunkcyjny; public: Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* stanowisko = „Dyrektor”, double p = 0); Dyrektor(double dF = 0, const Pracownik & p); double getDodatekFunkcyjny() {return dodatekFunkcyjny;} void setDodatekFunkcyjny(double dF) {dodatekFunkcyjny = dF;} }; Dwukropek oznacza, że klasa Dyrektor powstała z klasy Pracownik, która tutaj stanowi publiczną klasę macierzystą (dziedziczenie publiczne). Obiekt klasy potomnej zawiera wszystkie pola składowe i metody klasy macierzystej. Gdy dziedziczenie jest publiczne, to wszystkie składowe publiczne klasy macierzystej stają się składowymi publicznymi klasy potomnej. Dostęp do odziedziczonych prywatnych składowych jest możliwy poprzez odziedziczone publiczne lub chronione metody klasy macierzystej. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Obiekt klasy potomnej Obiekt klasy Dyrektor ma następujące cechy: Programowanie obiektowe Wykład Obiekt klasy potomnej Obiekt klasy Dyrektor ma następujące cechy: Zawiera w sobie poza swoimi polami, pola klasy macierzystej, czyli: imie, nazwisko, stanowisko, pensja, dodatekFunkcyjny. Może korzystać z metod klasy macierzystej: wypiszDane(), ustawPensja(), getPensja(). Składowe prywatne imie, nazwisko, stanowisko, pensja są dziedziczone, lecz nie są bezpośrednio dostępne. Wartość składowej pensja jest dostępna jedynie poprzez odziedziczoną metodę publiczną getPensja(). W klasie potomnej powinna być zdefiniowane własne konstruktory, które dostarczają danych zarówno dla nowych pól jak i odziedziczonych. Klasa potomna może być uzupełniona o dodatkowe pola składowe i metody. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Konstruktory klasy potomnej Programowanie obiektowe Wykład Konstruktory klasy potomnej Klasa potomna nie może korzystać z prywatnych składowych klasy macierzystej, musi więc odwoływać się do nich za pomocą publicznego interfejsu klasy macierzystej. W konsekwencji konstruktory klasy potomnej mogą wykorzystywać konstruktory klasy macierzystej. Podczas tworzenia obiektu klasy potomnej tworzony jest najpierw obiekt klasy macierzystej. Aby wywołać odpowiedni konstruktor klasy macierzystej, wykorzystuje się tzw. listę inicjatorów konstruktora (listę inicjalizacyjną). Dyrektor::Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* s = „Dyrektor”, double p = 0) : Pracownik(i, n, s, p) { dodatekFunkcyjny = dF; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Konstruktor bez listy inicjalizacyjnej Programowanie obiektowe Wykład Konstruktor bez listy inicjalizacyjnej Dyrektor::Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* s = „Dyrektor”, double p = 0) { dodatekFunkcyjny = dF; } Również w takim przypadku obiekt klasy macierzystej zostanie utworzony jako pierwszy. Pominięcie w tym przypadku listy inicjatorów konstruktora spowoduje uruchomienie konstruktora domyślnego klasy macierzystej. Powyższy konstruktor jest równoważny następującemu: Dyrektor::Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* s = „Dyrektor”, double p = 0) : Pracownik() { dodatekFunkcyjny = dF; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład Konstruktory c.d. Dyrektor::Dyrektor(double dF = 0, const Pracownik & p) : Pracownik(p) { dodatekFunkcyjny = dF; } Powyższy konstruktor spowoduje wywołanie konstruktora kopiującego klasy macierzystej. W klasie macierzystej nie ma zdefiniowanego jawnie konstruktora domyślnego więc zostanie wywołana jego domyślna wersja. Przykłady użycia zdefiniowanych konstruktorów: Dyrektor d1(400, „Jan”, „Kowalski”, „dyrektor”, 3600); Pracownik p(„Anna”, „Lis”, „dyrektor”, 4000); Dyrektor d2(400, p); dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Lista inicjatorów konstruktora c.d. Programowanie obiektowe Wykład Lista inicjatorów konstruktora c.d. Za pomocą listy inicjatorów konstruktora możemy również nadawać wartości polom składowym w klasie potomnej. Dyrektor::Dyrektor(double dF = 0, const Pracownik & p) : Pracownik(p), dodatekFunkcyjny(dF) { } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Podsumowanie o konstruktorach Programowanie obiektowe Wykład Podsumowanie o konstruktorach Gdy tworzony jest obiekt klasy potomnej, jako pierwszy konstruowany jest obiekt klasy macierzystej, który jest częścią klasy potomnej. Zatem pierwszy jest wywoływany konstruktor klasy macierzystej, a dopiero po nim konstruktor klasy potomnej. Konstruktor klasy potomnej powinien przekazywać informacje dotyczące klasy macierzystej do konstruktora tej klasy, posługując się w tym celu listą inicjalizacyjną. Konstruktor klasy potomnej powinien inicjalizować te pola składowe, które zostały dodane do klasy potomnej. Chcąc jawnie wskazać konstruktor klasy macierzystej, który zostanie wywołany w chwili tworzenia obiektu klasy potomnej, należy posłużyć się listą inicjatorów konstruktora. W przypadku, gdy lista ta zostanie pominięta, kompilator użyje konstruktora domyślnego klasy macierzystej. Klasa potomna może przekazywać wartości w górę drzewa dziedziczenia, wyłącznie do klas, po których klasa dziedziczy w sposób bezpośredni. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład Destruktory Podczas likwidacji obiektu klasy potomnej w pierwszej kolejności wywoływany jest destruktor tej klasy, a następnie wywoływany jest destruktor klasy macierzystej. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Deklaracja klasy potomnej Programowanie obiektowe Wykład Deklaracja klasy potomnej // pracownikdyrektor.h #ifndef PRACOWNIKDYREKTOR_H_ #define PRACOWNIKDYREKTOR_H_ class Pracownik { private: enum [ILE = 20]; char imie[ILE]; char nazwisko[ILE]; char stanowisko[ILE]; double pensja; public: Pracownik(const char* i = „???”, const char* n = „???”, char* s = „???”, double p = 0); void wypiszDane() const; void ustawPensja(double p) {pensja = p;}; double getPensja() const {return pensja;} }; class Dyrektor : public Pracownik double dodatekFunkcyjny; Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* stanowisko = „Dyrektor”, double p = 0); Dyrektor(double dF = 0, const Pracownik & p); double getDodatekFunkcyjny() {return dodatekFunkcyjny;} void setDodatekFunkcyjny(double dF) {dodatekFunkcyjny = dF;} #endif dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Definicja klasy potomnej Programowanie obiektowe Wykład Definicja klasy potomnej // pracownikdyrektor.cc #include „pracownikdyrektor.h” #include <iostream> using namespace std; Pracownik::Pracownik Pracownik(const char* i = „???”, const char* n = „???”, char* s = „???”, double p=0) { strncpy(imie, i, ILE - 1); strncpy(nazwisko, n, ILE - 1); strncpy(stanowisko, s, ILE - 1); pensja = p; } void Pracownik::wypiszDane() const cout << imie << „ ” << nazwisko << „ ” << stanowisko << „ ” << pensja << endl; Dyrektor::Dyrektor(double dF = 0, const char* i = „”, const char* n = „”, const char* s = „Dyrektor”, double p = 0) : Pracownik(i, n, s, p) dodatekFunkcyjny = dF; Dyrektor::Dyrektor(double dF = 0, const Pracownik & p) : Pracownik(p) dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wykorzystanie klasy potomnej Programowanie obiektowe Wykład Wykorzystanie klasy potomnej // testpracownikdyrektor.cc #include <iostream> #include „pracownikdyrektor.h” using namespace std; int main() { Pracownik jan(„Jan”, „Kowalski”, „stażysta”, 1500); jan.wypiszDane(); Dyrektor anna(500, „Anna”, „Lis”, „dyrektor”, 3000); anna.wypiszDane(); Dyrektor Jan(500,jan); return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

KONIEC Dziękuję za uwagę  Programowanie obiektowe Wykład dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ