Wykład 3
Koncepcja obiektowo
ś
ci
Poj
ę
cie klasy
Własno
ś
ci klasy
Programowanie obiektowe
1
Własno
ś
ci klasy
Obiekty
Paradygmat programowania obiektowego
Hermetyzacja
Dziedziczenie
Polimorfizm
Koncepcja obiektowości
Obiektowo
ść
- cecha naturalnego postrzegania
ś
wiata - analiza
otoczenia poprzez analiz
ę
wzajemnych zwi
ą
zków mi
ę
dzy
wyst
ę
puj
ą
cymi w tym
ś
wiecie obiektami;
Obiektami s
ą
ludzie, pa
ń
stwa, domy, samochody, ale tak
ż
e płace,
zadania, decyzje itp.
Koncepcja obiektowo
ś
ci jest podstaw
ą
obiektowej analizy,
Programowanie obiektowe
2
Koncepcja obiektowo
ś
ci jest podstaw
ą
obiektowej analizy,
projektowania i programowania SI;
Koncepcja obiektowości
Poj
ę
cie jest terminem, który stosujemy do rzeczy lub wyobra
ż
e
ń
abstrakcyjnych.
Termin poj
ę
cie zawiera intensj
ę
(tre
ść
poj
ę
cia) i ekstensj
ę
(zakres
poj
ę
cia).
Intensja jest pełn
ą
definicj
ą
poj
ę
cia i testu okre
ś
laj
ą
cego, czy
dane poj
ę
cie odnosi si
ę
do danej rzeczy lub wyobra
ż
enia
Programowanie obiektowe
3
dane poj
ę
cie odnosi si
ę
do danej rzeczy lub wyobra
ż
enia
abstrakcyjnego.
Ekstensja jest zbiorem wszystkich rzeczy i wyobra
ż
e
ń
abstrakcyjnych do których stosuje si
ę
dane poj
ę
cie.
Trójka poj
ę
ciowa = (nazwa, intensja, ekstensja)
Obiektem jest co
ś
, do czego da si
ę
zastosowa
ć
jakie
ś
poj
ę
cie.
Obiekt jest egzemplarzem poj
ę
cia.
Koncepcja obiektowości
Obiekt:
podstawowa jednostka konstrukcyjna programu;
konkretny lub abstrakcyjny byt (wyró
ż
nialny w modelowanej
rzeczywisto
ś
ci), posiadaj
ą
cy nazw
ę
, okre
ś
lone granice, atrybuty
i inne własno
ś
ci;
charakteryzuj
ą
go:
Programowanie obiektowe
4
charakteryzuj
ą
go:
Atrybuty – reprezentuj
ą
stan obiektu i zwi
ą
zki z innymi obiektami,
np. kolor, rozmiar, przynale
ż
no
ść
…
Funkcje (metody) – operacje, które obiekt mo
ż
e wykonywa
ć
, np.
przemieszczanie, całkowanie, wyznaczanie stanu konta itp.
Zasady u
ż
ycia – niezmiennicze reguły okre
ś
laj
ą
ce zasady u
ż
ycia
(w trym tzw. widzialno
ść
obiektu) i sposób powi
ą
zania z innymi
obiektami.
Pojęcie klasy
Zazwyczaj wiele obiektów ma taki sam zbiór cech, wskazane
jest, aby te cechy zdefiniowa
ć
raz, a potem wielokrotnie
wykorzystywa
ć
klasa (słownik PWN) — kategoria przedmiotów lub zjawisk
wyró
ż
nionych na podstawie wspólnych cech
Programowanie obiektowe
5
wyró
ż
nionych na podstawie wspólnych cech
Klasa w programowaniu
Klasa w programowaniu — uogólniony typ zdefiniowany przez
programist
ę
Słu
ż
y do definiowania typów obiektów (uogólnionych typów
zmiennych)
Programowanie obiektowe
6
Dostarcza wielu nowych mo
ż
liwo
ś
ci (o czym pó
ź
niej)
Pojedyncza klasa powinna jasno reprezentowa
ć
okre
ś
lone
poj
ę
cie, dla którego nie istnieje (jeszcze) odpowiedni typ
Koncepcja obiektowości
Klasa:
pozwala na utworzenie zbioru obiektów, maj
ą
cych tak samo
okre
ś
lone dane i metody;
wzorzec dla konkretnych obiektów;
wyra
ż
enie j
ę
zykowe specyfikuj
ą
ce budow
ę
obiektów,
dozwolone operacje na obiektach, ograniczenia dost
ę
pu,
Programowanie obiektowe
7
dozwolone operacje na obiektach, ograniczenia dost
ę
pu,
wyj
ą
tki itd.
Przykład – osoba strukturalnie
struct osoba {
int wiek;
char imi
ę
[20], nazwisko[30];
};
void wczytaj_osobe(osoba *o);
Programowanie obiektowe
8
void wczytaj_osobe(osoba *o);
void zapisz(osoba *o, int wiek, char *imi
ę
, char *nazwisko);
void wypisz(osoba *o);
Wady:
brak kontroli dost
ę
pu do pól struktury
programista musi pami
ę
ta
ć
, których funkcji u
ż
ywa
ć
na rzecz
których struktur
Przykład – osoba obiektowo
class osoba {
int wiek;
// składowe klasy – zmienne klasy
char imi
ę
[20], nazwisko[30];
public:
void wczytaj();
// składowe klasy – metody klasy
void zapisz(int wiek, char *p_imi
ę
, char *p_nazwisko);
Programowanie obiektowe
9
void zapisz(int wiek, char *p_imi
ę
, char *p_nazwisko);
void wypisz();
};
//
ś
rednik ko
ń
cz
ą
cy deklaracj
ę
klasy
Korzy
ść
dane i metody razem
dost
ę
p do danych: poprzez funkcje publiczne
Deklaracja klasy
class nazwa_klasy {
prywatne dane i funkcje;
okre
ś
lenie_dost
ę
pu:
// public, protected lub private
dane i funkcje;
okre
ś
lenie_dost
ę
pu:
// public, protected lub private
Programowanie obiektowe
10
okre
ś
lenie_dost
ę
pu:
// public, protected lub private
dane i funkcje;
...
okre
ś
lenie_dost
ę
pu:
// public, protected lub private
dane i funkcje;
} lista nazw obiektów;
Deklaracja klasy
Deklaracja klasy
class Klasa {
public:
Klasa();
// Konstruktor (domy
ś
lny) klasy
~Klasa();
// Destruktor klasy
// składowe dost
ę
pne dla innych klas
private:
// składowe dost
ę
pne tylko dla metod tej klasy
Programowanie obiektowe
11
// składowe dost
ę
pne tylko dla metod tej klasy
protected:
// składowe dost
ę
pne dla składowych klas potomnych
};
Uwagi:
Domniemanie: wszystkie składowe klasy s
ą
prywatne
Nie ma ogranicze
ń
na liczb
ę
okre
ś
le
ń
dost
ę
pu w definicji klasy
Deklaracja klasy - przykład
#define SIZE 100
class stack {
int stck[SIZE];
int tos;
public:
Programowanie obiektowe
12
public:
void init();
void push(int i);
int pop();
};
Deklaracja klasy - przykład
void stack::init()
{
tos=0;
}
void stack::push(int i)
{
if (tos==SIZE) {
cout << „Stos jest pełny.\n”;
Programowanie obiektowe
13
cout << „Stos jest pełny.\n”;
}
stck[tos]=i;
tos++;
}
Deklaracja klasy - przykład
int stack::pop() {
if (tos==0) {
cout << „Stos jest pusty.\n”;
return 0;
}
Programowanie obiektowe
14
}
tos--;
return stck[tos];
}
Deklaracja klasy - przykład
int main() {
stack stos1, stos2;
//utworzenie dwóch obiektów typu stack
stos1.init(); stos2.init();
stos1.push(1); stos2.push(2);
stos1.push(3); stos2.push(4);
cout << stos1.pop() << „ „;
cout << stos1.pop() << „ „;
Programowanie obiektowe
15
cout << stos1.pop() << „ „;
cout << stos2.pop() << „ „;
cout << stos2.pop() << „ „;
return 0;
}
Wynik działania programu:
3 1 4 2
Program 3.1
Wprowadzenie do języka C++
Operatory dost
ę
pu do składowych i zakresu klasy
sposób dost
ę
pu zgodny z dost
ę
pem do zmiennej typu
„struct”;
operator dost
ę
pu „kropka” (.)dotyczy:
składowych obiektów,
funkcji (metod) obiektów;
Programowanie obiektowe
16
funkcji (metod) obiektów;
np.
obiekt.pole;
obiekt.metoda();
operator dost
ę
pu „strzałka” (->) dotyczy:
wska
ź
ników;
np.
wsk_na_obiekt -> metoda();
operator zakresu „ :: ”
klasa::pole;
klasa::metoda();
Wprowadzenie do języka C++
Definicja funkcji (metody) klasy
Definicja funkcji (metody) wewn
ą
trz deklaracji klasy:
class Moja_Klasa {
public:
TypZwrotnejWarto
ś
ci NazwaMetodySkładowej()
{…};
Programowanie obiektowe
17
{…};
};
Definicja funkcji (metody) poza deklaracj
ą
klasy:
TypZwrotnejWarto
ś
ci Moja_Klasa :: NazwaMetodySkładowej( )
{
…
};
Operator zakresu „::” wi
ąż
e metod
ę
z klas
ą
;
Ró
ż
ne klasy mog
ą
mie
ć
metody o tej samej nazwie;
Wprowadzenie do języka C++
Definicja funkcji (metod) klasy
Przykład poza deklaracj
ą
klasy:
void osoba::ustaw(int wiek, char *p_imie, char *p_nazwisko)
{
osoba::wiek = wiek;
operator zakresu w nagłówku
Programowanie obiektowe
18
osoba::wiek = wiek;
strcpy(imie, p_imie);
strcpy(nazwisko, p_nazwisko);
};
operator zakresu w nagłówku
tu też operator zakresu,
bo „wiek” jest przysłonięty
Obiekt – uogólniona struktura
Deklaracja obiektów
class osoba ja, Ty;
osoba szef;
// w deklaracji/definicji obiektu mo
ż
na
// pomija
ć
„class”, „struct” i „union”
Programowanie obiektowe
19
U
ż
ycie obiektów
szef.wczytaj();
szef.wypisz();
Jak definiować metody klasy?
Wewn
ą
trz deklaracji klasy
class osoba {
…
inline void wczytaj()
{
Programowanie obiektowe
20
{
cin>>wiek>>imie>>nazwisko;
}
// tu nie musi by
ć
ś
rednika
…
};
Taka funkcja jest funkcj
ą
inline (wplatan
ą
)
Specyfikator inline mo
ż
e by
ć
(tutaj, tzn. w obr
ę
bie klasy) pomini
ę
ty
Jak definiować metody klasy?
Poza klas
ą
trzeba u
ż
y
ć
operatora zakresu w nagłówku
void osoba::zapisz (int wiek, char *p_imi
ę
, char *p_nazwisko) {
osoba::wiek=wiek;
// tu te
ż
operator zakresu bo wiek przesłoni
ę
ty
strcpy(imi
ę
, p_imi
ę
);
strcpy(nazwisko, p_nazwisko);
}
Programowanie obiektowe
21
}
Metoda ma by
ć
inline?
inline void osoba::wypisz()
{
cout<<"wiek: "<<wiek<<" imie: "<<imie<<
" nazwisko: "<<nazwisko<<"\n";
}
Jak definiować metody klasy?
Metody (funkcje) mog
ą
mie
ć
argumenty domy
ś
lne i by
ć
przeci
ąż
ane
void znajdz(int wiek, char *pi="Jan", char *pn="Kowalski");
szef. znajdz(50, „Adam”, „Nowak”);
Programowanie obiektowe
22
szef. znajdz(50, „Adam”, „Nowak”);
szef. znajdz(50, „Adam”);
szef. znajdz(50);
// ale nie: szef. znajdz();
Dlaczego?
Jak definiować metody klasy?
Metody i zmienne zadeklarowane wewn
ą
trz klasy s
ą
widoczne od
pocz
ą
tku definicji klasy oraz wewn
ą
trz ciał funkcji zadeklarowanych
wewn
ą
trz klasy
class A
{
public:
Programowanie obiektowe
23
public:
void wczytaj()
{
cin>>i;
// deklaracja zmiennej „i” jest wewn
ą
trz klasy
wypisz();
// funkcja „wypisz” jest wewn
ą
trz klasy
}
int i;
void wypisz();
};
Paradygmat programowania obiektowego
Paradygmat (encyklopedia PWN) — ogólnie uznane
osi
ą
gni
ę
cie naukowe (teoria naukowa); dostarcza modelowych
rozwi
ą
za
ń
w danej dziedzinie nauki .
Programowanie obiektowe
24
Przykładowe paradygmaty programowania
programowanie strukturalne
programowanie obiektowe
Programowanie obiektowe:
metoda rozwi
ą
zywania problemów programistycznych
z wykorzystaniem obiektów;
sposób interpretacji problemu jako zbioru obiektów
Paradygmat programowania obiektowego
Programowanie obiektowe
25
sposób interpretacji problemu jako zbioru obiektów
i relacji pomi
ę
dzy nimi
Hermetyzacja
Dziedziczenie
Polimorfizm
Paradygmaty programowania obiektowego
Programowanie obiektowe
26
Hermetyzacja (ang. encapsulation) oznacza poł
ą
czenie danych i funkcji
w jednostk
ę
programow
ą
, zwan
ą
obiektem
Zamkni
ę
cie pewnego zestawu bytów programistycznych w “kapsuł
ę
” o dobrze
okre
ś
lonych granicach
Informacja o wewn
ę
trznej budowie obiektu nie jest dost
ę
pna poza jego
definicj
ą
– oddzielenie specyfikacji obiektu (tak
ż
e klasy) od implementacji
Podstawow
ą
zalet
ą
hermetyzacji jest mo
ż
liwo
ść
zabezpieczenia danych przed
równoczesnym dost
ę
pem ze strony ró
ż
nych skladowych programu.
Hermetyzacja
Programowanie obiektowe
27
równoczesnym dost
ę
pem ze strony ró
ż
nych skladowych programu.
W tym celu wszystkie dane (pola w obiekcie) i zapisy instrukcji (metody w
obiekcie) dzieli si
ę
na ogólnodost
ę
pne (interfejs obiektowy) i wewn
ę
trzne
(implementacja obiektu).
Dost
ę
p do pól i metod wewn
ę
trznych jest mo
ż
liwy tylko za po
ś
rednictwem
"ł
ą
cza obiektowego" - pól i metod ogólnodost
ę
pnych.
Wybrane pola i metody mo
ż
na ukry
ć
przed okre
ś
lonymi (tak
ż
e wszystkimi)
obiektami zewn
ę
trznymi.
Hermetyzacja ma ogromne znaczenie dla przeno
ś
no
ś
ci programów i optymali-
zowania nakładów potrzebnych na ich modyfikacje.
Wpływa tak
ż
e dodatnio na osi
ą
ganie niezawodno
ś
ci w projektach
programistycznych.
Dziedziczenie
Dziedziczenie (ang. inheritance) oznacza zwi
ą
zek pomi
ę
dzy klasami
obiektów, okre
ś
laj
ą
cy przekazywanie cech (pól i metod) z klasy do jej
podklas (klas pochodnych);
np. obiekt klasy Samochód dziedziczy wszystkie własno
ś
ci (dane i
metody) okre
ś
lone w ogólniejszej klasie Pojazd;
Mechanizm dziedziczenia słu
ż
y w j
ę
zykach obiektowych do odwzorowania
wyst
ę
puj
ą
cych cz
ę
sto w naturze powi
ą
za
ń
typu generalizacja –
Programowanie obiektowe
28
wyst
ę
puj
ą
cych cz
ę
sto w naturze powi
ą
za
ń
typu generalizacja –
specjalizacja (uszczegółowienie).
Umo
ż
liwia programi
ś
cie definiowanie potomków istniej
ą
cych obiektów.
Ka
ż
dy potomek dziedziczy przy tym (wszystkie lub wybrane) pola i metody
obiektu bazowego, lecz dodatkowo uzyskuje pewne pola i własno
ś
ci
unikatowe, nadaj
ą
ce mu nowy charakter.
Typ takiego obiektu potomnego mo
ż
e sta
ć
si
ę
z kolei typem bazowym do
zdefiniowania kolejnego typu potomnego.
Dziedziczenie jest podstawowym mechanizmem sprzyjaj
ą
cym
ponownemu u
ż
yciu i rozszerzaniu klas;
Koncepcja obiektowości - dziedziczenie
Pojazd
Koła
Kolor
Jedź
Broń
Rodzaj amunicji
Szybkostrzelność
Strzelaj
klasy
Programowanie obiektowe
29
Samochód
Koła
Kolor
Rodzaj paliwa
Jedź
Tankuj
WózBojowy
Koła
Kolor
Rodzaj amunicji
Szybkostrzelność
Jedź
Strzelaj
podklasy (klasy pochodne)
nowa
metoda
metody
dziedziczone
Polimorfizm:
mo
ż
liwo
ść
istnienia wielu funkcji o tej samej nazwie, powi
ą
zana
z mo
ż
liwo
ś
ci
ą
wyboru konkretnej funkcji podczas wykonania
programu;
uto
ż
samiany jest z przeci
ąż
aniem funkcji lub operatorów
(overloading);
Polimorfizm
Programowanie obiektowe
30
(overloading);
np. metoda Jed
ź
inaczej b
ę
dzie si
ę
zachowywała dla
Samochodu a inaczej dla WozuBojowego;
zasi
ę
g polimorfizmu ograniczony jest do poddrzewa hierarchii
dziedziczenia;
Polimorfizm
Polimorfizm umo
ż
liwia tworzenie w klasach potomnych tzw. metod
wirtualnych, nazywaj
ą
cych si
ę
identycznie jak w typach bazowych,
lecz ró
ż
ni
ą
cych si
ę
od swych odpowiedników pod wzgl
ę
dem
znaczeniowym.
Polimorfizm, stanowi
ą
cy uzupełnienie dziedziczenia sprawia,
ż
e
mo
ż
liwe jest pisanie kodu, który w przyszło
ś
ci (na etapie wykonania
Programowanie obiektowe
31
mo
ż
liwe jest pisanie kodu, który w przyszło
ś
ci (na etapie wykonania
programu) b
ę
dzie wykorzystywany w warunkach nie daj
ą
cych si
ę
jeszcze przewidzie
ć
.
Ka
ż
dy obiektowy j
ę
zyk programowania definiuje pewne ograniczenia
składniowe zwi
ą
zane z u
ż
ywaniem metod wirtualnych.
We wszystkich wypadkach dotycz
ą
one sygnatury metody
(identyczna liczba parametrów formalnych, zgodno
ść
typów
odpowiadaj
ą
cych sobie parametrów), a cz
ę
sto tak
ż
e typu wyniku
funkcji.
Funkcje nosz
ą
ce takie same nazwy nazywamy funkcjami
przeci
ąż
onymi
Tworzenie funkcji przeci
ąż
onych nazywamy przeci
ąż
aniem funkcji
Wielokrotne stosowanie nazw - polimorfizm
Programowanie obiektowe
32
Mo
ż
emy nazwy tej samej funkcji u
ż
ywa
ć
w wielu miejscach w
programie bez obawy o bł
ę
dne działanie tego programu.
Języki programowania - klasyfikacja
Stricte obiektowe j
ę
zyki programowania (OPL) – podstawow
ą
jednostk
ą
syntaktyczn
ą
jest klasa obiektów:
Simula 67,
Smalltalk.
J
ę
zyki programowania zorientowane obiektowo (OOPL) -
podstawow
ą
jednostk
ą
syntaktyczn
ą
jest moduł (program, unit,
Programowanie obiektowe
33
podstawow
ą
jednostk
ą
syntaktyczn
ą
jest moduł (program, unit,
package), w którym umieszczane s
ą
definicje klas i deklaracje
obiektów:
C++,
Java,
Borland Pascal (Delphi),
TopSpeed Modula2,
ModSim II,
Visual C++,
Visual Basic.
Zastosowanie koncepcji obiektowości
J
ę
zyki programowania (Simula, Smalltalk, C++, Java, Eiffel, Beta,
OO-COBOL, Ada, Object Pascal, Visual Basic i inne)
j
ę
zyki te wprowadzaj
ą
nowe poj
ę
cia, bezpo
ś
rednio odnosz
ą
ce
si
ę
do obiektowo
ś
ci, tzn. klasy, dziedziczenie, hermetyzacja i
polimorfizm;
Programowanie obiektowe
34
trudno
ś
ci w projektowaniu i wypromowaniu nowego j
ę
zyka
programowania skutkuj
ą
tendencj
ą
do rozszerzania
klasycznych j
ę
zyków programowania w kierunku obiektowo
ś
ci;
Ewolucja języków programowania
1950
1960
1970
1980
1990
2000
PL/I(66)
Ada(95)
Pascal(70)
Cobol(58)
A
S
S
E
M
B
L
Y
Eiffel (86)
Ada(83)
Programowanie obiektowe
35
Fortran(54)
Java(96)
Basic(66)
C(72)
Pascal(70)
Algol(60)
Simula(67)
Smalltalk(80)
C++(89)
A
S
S
E
M
B
L
Y
Eiffel (86)
Programowanie obiektowe
36