33
Paradygmat Paradygmat programowania programowania obiektowego, klasa, obiektowego, klasa, obiekt obiekt

Paradygmat programowania obiektowego, klasa, obiekt

  • Upload
    owen

  • View
    48

  • Download
    0

Embed Size (px)

DESCRIPTION

Paradygmat programowania obiektowego, klasa, obiekt. Paradygmat. paradygmat (słownik PWN) — przyjęty sposób widzenia rzeczywistości w danej dziedzinie Paradygmaty programowania programowanie strukturalne programowanie obiektowe. Paradygmat programowania obiektowego. - PowerPoint PPT Presentation

Citation preview

Page 1: Paradygmat programowania obiektowego, klasa, obiekt

Paradygmat programowania Paradygmat programowania obiektowego, klasa, obiektobiektowego, klasa, obiekt

Page 2: Paradygmat programowania obiektowego, klasa, obiekt

ParadygmatParadygmat

paradygmat paradygmat (słownik PWN) — przyjęty sposób (słownik PWN) — przyjęty sposób widzenia rzeczywistości w danej dziedziniewidzenia rzeczywistości w danej dziedzinie

Paradygmaty programowaniaParadygmaty programowania programowanie strukturalneprogramowanie strukturalne programowanie obiektoweprogramowanie obiektowe

Page 3: Paradygmat programowania obiektowego, klasa, obiekt

Paradygmat programowania Paradygmat programowania obiektowegoobiektowego

programowanie programowanie obiektoweobiektowe — to paradygmat — to paradygmat rozwiązywania problemów programistycznych rozwiązywania problemów programistycznych

z wykorzystaniem z wykorzystaniem obiektówobiektów, sposób , sposób interpretacji problemu jako zbioru interpretacji problemu jako zbioru obiektówobiektów i i

relacji pomiędzy nimirelacji pomiędzy nimi. .

Page 4: Paradygmat programowania obiektowego, klasa, obiekt

ObiektObiekt

Potoczne znaczenie słowa obiektPotoczne znaczenie słowa obiekt Znaczenie pojęcia obiektu w programowaniuZnaczenie pojęcia obiektu w programowaniu

Reprezentuje na potrzeby programu obiekty ze Reprezentuje na potrzeby programu obiekty ze świata rzeczywistego lub abstrakcyjne (w świata rzeczywistego lub abstrakcyjne (w potocznym znaczeniu słowa obiekt)potocznym znaczeniu słowa obiekt)

Uogólniona zmienna (struktura)Uogólniona zmienna (struktura) Zdefiniowany i używany zgodnie ze składnią i Zdefiniowany i używany zgodnie ze składnią i

semantyką językasemantyką języka

Page 5: Paradygmat programowania obiektowego, klasa, obiekt

Obiekt - uogólniona zmienna Obiekt - uogólniona zmienna (struktura)(struktura)

StrukturaStruktura zestaw danych, najczęściej różnych typówzestaw danych, najczęściej różnych typów

UogólnionaUogólniona obiekt = dane + metody operujące na tych danychobiekt = dane + metody operujące na tych danych

Page 6: Paradygmat programowania obiektowego, klasa, obiekt

Obiekt - przykaładyObiekt - przykałady

Page 7: Paradygmat programowania obiektowego, klasa, obiekt

Dużo obiektówDużo obiektów

zazwyczaj wiele obiektów ma taki sam zbiór zazwyczaj wiele obiektów ma taki sam zbiór cech, potrzebujemy aby te cechy definiować cech, potrzebujemy aby te cechy definiować raz, ale wykorzystywać wielokrotnie raz, ale wykorzystywać wielokrotnie

klasaklasa (słownik PWN) — kategoria przedmiotów (słownik PWN) — kategoria przedmiotów lub zjawisk wyróżnionych na podstawie lub zjawisk wyróżnionych na podstawie

wspólnych cechwspólnych cech

Potrzebujemy klasy dla podobnych obiektówPotrzebujemy klasy dla podobnych obiektów

Page 8: Paradygmat programowania obiektowego, klasa, obiekt

Klasa w programowaniuKlasa w programowaniu

klasa w programowaniu — uogólniony typ klasa w programowaniu — uogólniony typ zdefiniowany przez użytkownika językazdefiniowany przez użytkownika języka

służy do definiowania obiektów (uogólnionych służy do definiowania obiektów (uogólnionych zmiennych)zmiennych)

Dostarcza wielu nowych możliwości (to be discussed Dostarcza wielu nowych możliwości (to be discussed later :-)later :-)

Pojedyncza klasa powinna jasno reprezentować Pojedyncza klasa powinna jasno reprezentować określone pojęcie, dla którego nie istnieje (jeszcze) określone pojęcie, dla którego nie istnieje (jeszcze) odpowiedni typodpowiedni typ

Page 9: Paradygmat programowania obiektowego, klasa, obiekt

Dlaczego programowanie Dlaczego programowanie obiektowe?obiektowe?

kolejny etap w rozwoju technik kolejny etap w rozwoju technik IPIP:: strukturalnestrukturalne proceduralneproceduralne modularnemodularne

narzędzie do implementacji projektów obiektowych narzędzie do implementacji projektów obiektowych (istneje analiza obiektowa, projektowanie obiektowe)(istneje analiza obiektowa, projektowanie obiektowe) języki wspierające programowanie obiektowe języki wspierające programowanie obiektowe

C++, Java, …C++, Java, … kęzyki umożliwiające programowanie obiektowekęzyki umożliwiające programowanie obiektowe

wszystkiewszystkie

Page 10: Paradygmat programowania obiektowego, klasa, obiekt

Przykład – osoba strukturalniePrzykład – osoba strukturalnie

struct osobastruct osoba{{

int wiek;int wiek;char imię[20], nazwisko[30];char imię[20], nazwisko[30];

};};

void wczytaj_osobe(osoba *o);void wczytaj_osobe(osoba *o);void ustaw_osobę(osoba *o, int wiek,void ustaw_osobę(osoba *o, int wiek, char *imię, char *nazwisko);char *imię, char *nazwisko);void wypisz_osobe(osoba *o);void wypisz_osobe(osoba *o);

bez kontroli dostępu do pól strukturybez kontroli dostępu do pól struktury programista musi pamiętać, których funkcji używać na rzecz których programista musi pamiętać, których funkcji używać na rzecz których

strukturstruktur

Page 11: Paradygmat programowania obiektowego, klasa, obiekt

Przykład – osoba obiektowoPrzykład – osoba obiektowo

class osobaclass osoba{{

int wiek;int wiek; // składowe klasy – // składowe klasy – zmienne klasowezmienne klasowechar imię[20], nazwisko[30];char imię[20], nazwisko[30];

public:public:void wczytaj(); void wczytaj(); // składowe klasy – // składowe klasy – metody klasymetody klasyvoid ustaw(int wiek, char *p_imię, char *p_nazwisko);void ustaw(int wiek, char *p_imię, char *p_nazwisko);void wypisz();void wypisz();

}; }; // t// ten średnik musi tu być by zakończyć deklaracjęen średnik musi tu być by zakończyć deklarację

dane i metody razemdane i metody razem domyślnie bez dostępu do pól spoza metod klasydomyślnie bez dostępu do pól spoza metod klasy

Page 12: Paradygmat programowania obiektowego, klasa, obiekt

Specyfikacja dostępu Specyfikacja dostępu do składowych klasydo składowych klasy

privateprivate::// // składowe prywatneskładowe prywatne// // dostępne dla metod danej klasy dostępne dla metod danej klasy // // oraz metod i funkcji zaprzyjaźnionychoraz metod i funkcji zaprzyjaźnionych// private – domyślne dla „class”// private – domyślne dla „class”

ppublic:ublic:// // składowe publiczneskładowe publiczne // // dostępne dostępne spoza klasyspoza klasy // domyślne dla „struct”// domyślne dla „struct”

pprotected:rotected:// // składowe chronioneskładowe chronione // tak jak private, ale// tak jak private, ale // mogą być dodatkowo dostępne dla klas potomnych// mogą być dodatkowo dostępne dla klas potomnych

Page 13: Paradygmat programowania obiektowego, klasa, obiekt

Specyfikacja dostępu Specyfikacja dostępu do składowych klasydo składowych klasy

class osobaclass osoba

{{

int wiek;int wiek; // private// private

char imię[20]char imię[20];; // private// private

public:public:

void wczytaj(); void wczytaj(); // public// public

private:private:

char nazwisko[30];char nazwisko[30]; // private// private

public:public:

void ustaw(int wiek, char *p_imię, char *p_nazwisko);void ustaw(int wiek, char *p_imię, char *p_nazwisko); // public// public

void wypisz();void wypisz(); // public// public

};};

Page 14: Paradygmat programowania obiektowego, klasa, obiekt

Hermetyzacja i enkapsulacjaHermetyzacja i enkapsulacja

ZZamknięcie danych amknięcie danych i metod i metod w klasie w klasie (enkapsulacja) (enkapsulacja) pozwalapozwala programiście programiście na świadome ograniczenie na świadome ograniczenie

możliwości możliwości dostępu do dostępu do danych przez kod spoza klasy danych przez kod spoza klasy (hermetyzacja)(hermetyzacja). .

DDomyślnie wszystkie składowe klasy są prywatneomyślnie wszystkie składowe klasy są prywatne, , czyliczyli niedostępne z zewnątrz klasy. niedostępne z zewnątrz klasy.

OOOP ;-) OOOP ;-) — — ortodoksyjne programowanie ortodoksyjne programowanie obiektowe: wszystkie dane są prywatne, operujemy obiektowe: wszystkie dane są prywatne, operujemy na nich na nich wyłączniewyłącznie metodami klasy. metodami klasy.

Page 15: Paradygmat programowania obiektowego, klasa, obiekt

Obiekt – uogólniona strukturaObiekt – uogólniona struktura

DeklarujemyDeklarujemy

class class osoba osoba jaja, Ty, Ty;;osobaosoba szef; szef; // w deklaracji/definicji obiektu można// w deklaracji/definicji obiektu można // pomijać „class”, „struct” i „union”// pomijać „class”, „struct” i „union”

UżywamyUżywamy

szef.wczytaj();szef.wczytaj();szef.wypisz();szef.wypisz();

Page 16: Paradygmat programowania obiektowego, klasa, obiekt

Operatory dostępu Operatory dostępu do składowych klasydo składowych klasy

kropka „ kropka „ . . ””obobiieekkt.polet.pole; ; //// jak w strukturach jak w strukturach C Cobiekt.metoda(); obiekt.metoda(); // enkapsulacja// enkapsulacja

operator zakresu „ operator zakresu „ :::: „ „klasa::poleklasa::pole;; // // sizeofsizeof, pola static, pola staticklasa::metoda()klasa::metoda();; // // przy definicjiprzy definicji, metody statyczne, metody statyczne

Najczęściej kwalifikacje ( obiekt. i klasa::) można pominąćNajczęściej kwalifikacje ( obiekt. i klasa::) można pominąć metody klasy operujące na nieprzesłoniętych składowych klasymetody klasy operujące na nieprzesłoniętych składowych klasy deklarowanie/definiowanie metod wewnątrz deklaracji klasydeklarowanie/definiowanie metod wewnątrz deklaracji klasy

Page 17: Paradygmat programowania obiektowego, klasa, obiekt

Jak definiować metody klasy?Jak definiować metody klasy? Wewnątrz deklaracji klasyWewnątrz deklaracji klasy

class osobaclass osoba{{

……

void wczytaj()void wczytaj(){{

cin>>wiek>>imie>>nazwisko;cin>>wiek>>imie>>nazwisko;} } // tu nie // tu nie musi być musi być średnikaśrednika

……};};

Taka metoda jest domyślnie metodą inlineTaka metoda jest domyślnie metodą inline

Page 18: Paradygmat programowania obiektowego, klasa, obiekt

Jak definiować metody klasy?Jak definiować metody klasy? poza klasą trzebapoza klasą trzeba użyć użyć operatoroperatoraa zakresuzakresu w nagłówku w nagłówku domyślnie metoda domyślnie metoda nie będzienie będzie inline inline

void void osobaosoba::::ustaw(int wiek, char *p_imię, char *p_nazwisko)ustaw(int wiek, char *p_imię, char *p_nazwisko){{

osoba::wiek=wiek; osoba::wiek=wiek; // tu// tu też też operator operator zakresuzakresu bo wiek przysłonięty bo wiek przysłoniętystrcpy(imię, p_imię);strcpy(imię, p_imię);strcpy(nazwisko, p_nazwisko);strcpy(nazwisko, p_nazwisko);

}}

metoda ma być inline?metoda ma być inline?

inlineinline void osoba::wypisz() void osoba::wypisz(){{ cout<<"wiek: "<<wiek<<" imie: "<<imie<<" nazwisko: "<<nazwisko<<"\n";cout<<"wiek: "<<wiek<<" imie: "<<imie<<" nazwisko: "<<nazwisko<<"\n";}}

Page 19: Paradygmat programowania obiektowego, klasa, obiekt

Jak definiować metody klasy?Jak definiować metody klasy? przy tworzeniu bibliotek w pliku nagłówkowym (*.h) umieszczamy przy tworzeniu bibliotek w pliku nagłówkowym (*.h) umieszczamy

deklaracje klasy i definicje metod inline, definicje nie-inline nie mogą deklaracje klasy i definicje metod inline, definicje nie-inline nie mogą znaleźć się w *.h.znaleźć się w *.h.

mmetody podobnie jak funkcje mogą mieć argumenty domyślne i być etody podobnie jak funkcje mogą mieć argumenty domyślne i być przeciążaneprzeciążane

void ustaw(int w, char *pi="Jan", char *pn="Kowalski");void ustaw(int w, char *pi="Jan", char *pn="Kowalski");void ustaw(void ustaw(const osoba & przykladconst osoba & przyklad););

szef.ustaw(Ty); szef.ustaw(Ty); szef.ustaw(50, „Osama”, „bin Laden”); szef.ustaw(50, „Osama”, „bin Laden”); szef.ustaw(50, „Osama”);szef.ustaw(50, „Osama”);szef.ustaw(50);szef.ustaw(50);// szef.ustaw(); ERROR!// szef.ustaw(); ERROR!

Page 20: Paradygmat programowania obiektowego, klasa, obiekt

Jak definiować metody klasy?Jak definiować metody klasy? metody i zmienne zadeklarowane wewnątrz klasy są widoczne od początku metody i zmienne zadeklarowane wewnątrz klasy są widoczne od początku

definicji klasy oraz wewnątrz ciał metod zadeklarowanych wewnątrz klasydefinicji klasy oraz wewnątrz ciał metod zadeklarowanych wewnątrz klasy

class Aclass A{{public:public:

void wczytaj()void wczytaj(){{

cin>>i;cin>>i; // // deklaracja „i” jest w klasiedeklaracja „i” jest w klasiewypisz();wypisz(); // jak wyżej// jak wyżej

}}

void wypisz();void wypisz();int i;int i;

};};

Page 21: Paradygmat programowania obiektowego, klasa, obiekt

Jak definiować metody klasy?Jak definiować metody klasy? Przypomnienie: z poza metod klasy jej składowe Przypomnienie: z poza metod klasy jej składowe

trzeba kwalifikować nazwą klasy bądź obiektutrzeba kwalifikować nazwą klasy bądź obiektu

int test()int test(){{

A a;A a;

int j=sizeof(A::i);int j=sizeof(A::i);void (A::*p)()=&A::wczytaj;void (A::*p)()=&A::wczytaj;a.i=3;a.i=3; // i jest publiczne w A// i jest publiczne w A

}}

Page 22: Paradygmat programowania obiektowego, klasa, obiekt

Operator zakresu jako rozszerzenie Operator zakresu jako rozszerzenie nieobiektowenieobiektowe

int fun();int fun();

int i;int i;

class Cclass C

{{

int i;int i;

public:public:

void test();void test();

int fun();int fun();

};};

void C::test()void C::test()

{{

i++;i++; // zwieksz C::i// zwieksz C::i

::i++;::i++; // globalne i// globalne i

fun();fun(); // C::fun()// C::fun()

::fun();::fun(); // globa// globalna lna funfun()()

}}

Page 23: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

zadaniezadanie zadeklarować klasę zadeklarować klasę pointpoint, której obiekty będą , której obiekty będą

ppunktami na płaszczyźnie 2Dunktami na płaszczyźnie 2D klasa powinna nie mieć zmiennych publicznychklasa powinna nie mieć zmiennych publicznych publiczne metodypubliczne metody klasy klasy: : inputinput, , outputoutput, , movemove

((przesuń oprzesuń o wektor zadany parą współrzędnych), wektor zadany parą współrzędnych), distancedistance ( (odległość odległość od drugiego punktu od drugiego punktu przekazanego przez referencję) oraz metody przekazanego przez referencję) oraz metody coordXcoordX i i coordYcoordY zwracające rzędną i odciętą zwracające rzędną i odciętą punktupunktu

Page 24: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

class class pointpoint{{

double x, y;double x, y;

public:public:void void inputinput();();void void outputoutput();();void void movemove(double dx, double dy);(double dx, double dy);double double distancedistance((const const punkt &p);punkt &p);double double coordXcoordX();(); // tzw akcesory – udostępniają prywatne pola klasy// tzw akcesory – udostępniają prywatne pola klasydouble double coordYcoordY();();

};};

Page 25: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

zadaniezadanie zdefiniować zdefiniować inline inline metodymetody

input()input()

output()output()

move()move()

distance()distance()

Page 26: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

class class pointpoint{{

double x, y;double x, y;public:public:

void void inputinput() {cin>>x>>y; };() {cin>>x>>y; };void void outputoutput() {cout<<x<<y; };() {cout<<x<<y; };……

};};

inline void inline void pointpoint::::movemove(double dx, double dy)(double dx, double dy){{

x+=dx;x+=dx;y+=dy;y+=dy;

}}

Page 27: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

inline double inline double pointpoint::::distancedistance((pointpoint &p) &p){{

return sqrt( (x-p.x)*(x-p.x) + (y-p.y)*(y-p.y) );return sqrt( (x-p.x)*(x-p.x) + (y-p.y)*(y-p.y) );}}

uwagauwaga:: mamy dostęp do prywatnych pól obiektu na mamy dostęp do prywatnych pól obiektu na rzecz którego aktywowana jest dana metoda i do rzecz którego aktywowana jest dana metoda i do prywatnych pól innych obiektów klasy tej co obiektu prywatnych pól innych obiektów klasy tej co obiektu na którego rzecz aktywowana jest metoda (p). na którego rzecz aktywowana jest metoda (p). Prywatne znaczy prywatne dla klasy (a nie dla Prywatne znaczy prywatne dla klasy (a nie dla obiektu klasy).obiektu klasy).

Page 28: Paradygmat programowania obiektowego, klasa, obiekt

Klasy a Abstrakcyjne Typy DanychKlasy a Abstrakcyjne Typy Danych

klasy doskonale nadają się do implementacji klasy doskonale nadają się do implementacji abstrakcyjnych typów danychabstrakcyjnych typów danych

klasy klasy są abstrakcyjnymi typami danychsą abstrakcyjnymi typami danych

ZZnanammy interfejs – y interfejs – gdy gdy posługujemy się operacjami posługujemy się operacjami dozwolonymi dla typu, nie przejmujemy się tym, jak dozwolonymi dla typu, nie przejmujemy się tym, jak są one są one realizowane. realizowane. Hermetyzacja Hermetyzacja pozwala oddzielić pozwala oddzielić nieistotne z punktu widzenia użytkownika typu nieistotne z punktu widzenia użytkownika typu szczegóły implementacyjne od istotnego interfejsu. szczegóły implementacyjne od istotnego interfejsu.

na przykład stos, kolejka, zbiór, na przykład stos, kolejka, zbiór, punktpunkt, odcinek, odcinek

Page 29: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykład

zadaniezadanie zadeklarować klasę zadeklarować klasę segmentsegment, której obiekty , której obiekty

będą będą odcinkamiodcinkami na płaszczyźnie 2D na płaszczyźnie 2D klasa powinna nie mieć zmiennych publicznychklasa powinna nie mieć zmiennych publicznych publiczne metodypubliczne metody klasy klasy: : inputinput, , outputoutput, , movemove

((przesuń oprzesuń o wektor zadany parą współrzędnych), wektor zadany parą współrzędnych), lengthlength ( (długość odcinkadługość odcinka))..

Page 30: Paradygmat programowania obiektowego, klasa, obiekt

PrzykładPrzykładclass class segmentsegment{{

pointpoint p1, p2; p1, p2;public:public:

void void inputinput()(){{

p1.p1.inputinput();();p2.p2.inputinput();();

}}void void outputoutput()(){{

p1.p1.outputoutput();();p2.p2.outputoutput();();

}}

void void movemove(double dx, double dy)(double dx, double dy){{

p1. p1. movemove(dx, dy);(dx, dy);p2. p2. movemove(dx, dy);(dx, dy);

}}double double lengthlength()(){{

return p1.return p1.distancedistance(p2);(p2);}}

};};

Page 31: Paradygmat programowania obiektowego, klasa, obiekt

Ciekawostka: deklaracje Ciekawostka: deklaracje zagnieżdżonezagnieżdżone

deklaracja klasy może być zagnieżdżona w deklaracja klasy może być zagnieżdżona w deklaracji innej klasy deklaracji innej klasy

klasa zagnieżdżona nie jest widoczna klasa zagnieżdżona nie jest widoczna globalnie, można kwalifikować klasą globalnie, można kwalifikować klasą zewnętrzną jeżeli jest publiczna. zewnętrzną jeżeli jest publiczna.

Page 32: Paradygmat programowania obiektowego, klasa, obiekt

Ciekawostka: deklaracje Ciekawostka: deklaracje zagnieżdżonezagnieżdżone

class Xclass X{{

class M1class M1{{

int m;int m;};};

public:public:class M2class M2

{{int m;int m;

};};};};

void f()void f(){{

M1 m1;M1 m1; // blad // blad ////nie w zasięgunie w zasięgu globalnymglobalnym

X::M1 xm1;X::M1 xm1; // blad // blad ////M1 w sekcji prywatnej XM1 w sekcji prywatnej X

X::M2 xm2;X::M2 xm2; // ok. // ok. }}

Page 33: Paradygmat programowania obiektowego, klasa, obiekt

Ciekawostka: deklaracje Ciekawostka: deklaracje zagnieżdżonezagnieżdżone

X to klasa która X to klasa która nie ma żadnych zmiennychnie ma żadnych zmiennych ani metodani metod, tylko określone typy , tylko określone typy (można oczywiście tworzyć obiekty klasy X).(można oczywiście tworzyć obiekty klasy X).klasa, która zawiera klasa, która zawiera zmienne klasowezmienne klasowe: :

class Xclass X_d_d{{public:public:

class M2class M2{{

int m;int m;};};

M2 m2;M2 m2; // tutaj // tutaj};};

generalnie należy unikać generalnie należy unikać i unika sięi unika się zagnieżdżania klas (za wyjątkiem bardzo zagnieżdżania klas (za wyjątkiem bardzo małych klas) — małych klas) — mało czytelne i mało przydatnemało czytelne i mało przydatne. .