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
Paradygmat programowania Paradygmat programowania obiektowego, klasa, obiektobiektowego, 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
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. .
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
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
Obiekt - przykaładyObiekt - przykałady
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
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
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
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
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
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
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
};};
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.
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();
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
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
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";}}
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!
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;
};};
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
}}
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()()
}}
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
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();();
};};
PrzykładPrzykład
zadaniezadanie zdefiniować zdefiniować inline inline metodymetody
input()input()
output()output()
move()move()
distance()distance()
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;
}}
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).
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
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))..
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);}}
};};
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.
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. }}
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. .