You are on page 1of 80

Objektno orijentirano

programiranje
C++ continued
Razmišljanje u okvirima objekata
2

Objektno orijentirano programiranje


3

C++
Podsjetimo se!
▪ C++ sintaksa za definiranje klasa je slična sintaksi struktura

class class_name Podsjetimo se: Čemu služi


ključna riječ private?
{
private:
data_type variable_name;
data_type variable_name;

Objektno orijentirano programiranje


4

C++
definiranje klasa
▪ C++ sintaksa za definiranje klasa je slična sintaksi struktura

Čemu služi ključna riječ public?


… Što je konstruktor? Što je
public: destruktor?
class_name();
~class_name();

return_type method_name( parameter_list );


return_type method_name( parameter_list );
return_type method_name( parameter_list );
};

Objektno orijentirano programiranje


5

C++ definiranje klasa

class Time{
// Privatne varijable
private:
int hour;
int minute;
int second;
// Public metode
public:
Time();
~Time();

void Set(const int Hr, const int Min, const int Sec);
void Get(int &Hr, int &Min, int &Sec) const;
void Print() const;
}; const?

Objektno orijentirano programiranje


6

C++ definiranje klasa


• Nov način korištenja ključne riječi „const” kod liste metoda
• Ovo govori kompajleru da Get i Print metode NE MIJENJAJU
varijable objekta
– accessors (pristupnici)
• Metodama bez ključne riječi „const” je dopušteno mijenjati
varijable objekta
– mutators

Objektno orijentirano programiranje


7

C++
implementiranje klasa
▪ Metode se implementiraju poput običnih funkcija
▪ Dodajemo ime klase prije imena metode

return_type class_name::method_name( parameter_list )


{
// Kod metode ide ovdje
}

Objektno orijentirano programiranje


8

C++
implementiranje klasa
▪ Podsjetimo se: konstruktor i destruktor nemaju povratne
vrijednosti
▪ Čak ni void
Time::Time(){
cout << "Constructor\n";
}

Time::~Time(){
cout << "Destructor\n";
}

Objektno orijentirano programiranje


9

C++ implementiranje klasa

void Time::Set(const int Hr, const int Min, const int Sec){
cout << "Set\n";
hour = Hr;
minute = Min;
second = Sec;
}

void Time::Get(int &Hr, int &Min, int &Sec) const{


cout << "Get\n";
Hr = hour;
Min = minute;
Sec = second;
}
...

Objektno orijentirano programiranje


10

C++
korištenje klasa
• Objekte deklariramo kao i obične varijable
class_name object_name;
• Ovime ćemo alocirati djelić memorije dovoljno velik da sadrži
sve podatke unutar klase
• Također, automatski će se pozvati i default konstruktor

Objektno orijentirano programiranje


11

C++ korištenje klasa

int main(){ Deklariramo dva Time objekta


int Hr, Min, Sec;
Time Now, Then;
Now objekt će ispisati 10:30:00

Now.Set(10, 30, 0);


Now.Print();
Ovo će kopirati podatke od Now u
Then = Now; Then i ispisati 10:30:00
Then.Print(); Ovo će izvući podatke za Hr, Min,
Sec i ispisat će 10 30 0
Now.Get(Hr, Min, Sec);
cout << Hr << " " << Min << " " << Sec << endl;
Now.minute = 42;
cout << Then.hour;
}
GREŠKA!

Objektno orijentirano programiranje


12

C++
napredne klase
▪ Pridjeljivanje objekata
– Pretpostavimo da su Now i Then objekti iste klase
– MOŽEMO koristiti "Now = Then;"
– Program će izvršiti field-by-field kopiranje objekta

▪ Usporedba dva objekta


– NE SMIJEMO koristiti "if (Now == Then)" za usporedbu
– Umjesto toga, moramo uspoređivati dva objekta na field-by-
field bazi

Objektno orijentirano programiranje


13

C++
napredne klase
▪ Ispisivanje objekata
– NE SMIJEMO ispisivati objekt korištenjem „cout << Now”
– Moramo koristiti vlastitu metodu klase
– Npr. Now.Print() koju smo sami implementirali

▪ Inicijaliziranje objekta
– Možemo postaviti inicijalne vrijednosti prilikom deklariranja
objekta
– Za to trebamo kreirati konstruktor koji prima dodatne
parametre

Objektno orijentirano programiranje


14

C++
napredne klase
▪ Objekti kao parametri
– Objekte možemo slati kao parametre preko vrijednosti ili
preko reference
– Slanje preko reference je malo brže jer ne zahtijeva kopiranje
objekata

▪ Objekti kao povratne vrijednosti


– Objekt možemo vratiti preko return-a
– Ovo nam daje mogućnost vraćanja više od jedne povratne
vrijednosti iz funkcije

Objektno orijentirano programiranje


15

C++
napredne klase
▪ Metode smiju biti private
▪ što to znači? kad se koristi?
▪ Podaci smiju biti public
▪ ovime se ipak razbija koncept skrivanja podataka u OOP

Objektno orijentirano programiranje


16

C++
napredne klase
▪ Nizovi objekata
▪ Slobodno možemo koristiti nizove za spremanje objekata

niz objekti objekti[2] objekti[2].ime


objekt privatna varijabla

Objektno orijentirano programiranje


17

C++
osnovni (default) konstruktor
▪ Osnovni konstruktor je metoda koja se poziva automatski
prilikom stvaranja objekata
▪ Osnovni konstruktor nema parametre i postavlja sve
podatke u neku inicijalnu vrijednost
class_name();
▪ Na sljedeći način se kreira objekt klase:
class_name object;

Objektno orijentirano programiranje


18

C++
overload-ani konstruktor
▪ Možemo kreirati konstruktor koji prima parametre

class_name::class_name(float param1, int param2){


field1 = param1;
field2 = param2;

}

Objektno orijentirano programiranje


19

C++
kopirni (copy) konstruktor
▪ Riječ je o posebnoj metodi koja kreira novi objekt tako da
kopira drugi objekt
▪ Ova se metoda automatski poziva kad šaljemo objekt u
funkciju preko vrijednosti
▪ Copy konstruktor mora primiti jedan objekt poslan preko
const reference

class_name(const class_name & object);

Objektno orijentirano programiranje


20

C++
copy konstruktor
▪ copy konstruktor se također može koristiti za stvaranje objekata

class_name object1; // kreira object1


object1.set(72.5, 49); // postavlja neke vrijednosti
class_name object2(object1); // object2 je kopija object1

▪ Ovo smo mogli napraviti i na sljedeći način:

class_name object1; // kreira object1


object1.set(72.5, 49); // postavlja neke vrijednosti
class_name object2; // kreira object2
object2 = object1; // kopira object1 u object2

Objektno orijentirano programiranje


shallow vs. deep copy 21

class ShalloC{
private:
int * x; Konstruktor s jednim parametrom
public:
ShalloC(int m){ int main(){
x = new int;
*x = m;
ShalloC ob1(10);
} ShalloC ob2 = ob1 ;
int GetX() const{ ob1.PrintX();
return *x; ob2.PrintX();
}
void SetX(int m){
*x = m;
ob1.SetX(12);
} ob1.PrintX();
void PrintX(){ ob2.PrintX();
cout << "Int X=" << *x << endl; }
}
~ShalloC(){
delete x;
}
};
Oba objekta imaju x
postavljen u 12 !
class ShalloC{
private:
shallow vs. deep copy 22

int * x;
public:
ShalloC(int m){
x = new int; copy konstruktor i obavljanje
*x = m; deep copy-ja (duboko kopiranje)
}
ShalloC(const ShalloC& obj){
x = new int;
*x = obj.GetX(); int main(){
} ShalloC ob1(10);
int GetX() const{
return *x;
ShalloC ob2 = ob1 ;
} ob1.PrintX();
void SetX(int m){ ob2.PrintX();
*x = m;
} ob1.SetX(12);
void PrintX(){
cout << "Int X=" << *x << endl;
ob1.PrintX();
} ob2.PrintX();
~ShalloC(){ }
delete x;
}
};

Objektno orijentirano programiranje


23

C++
static

class family
{
public: Čemu služi ključna riječ static?

private:
static const int NUM_CHILDREN = 19;
string mother, father;
string children[NUM_CHILDREN];

};

Objektno orijentirano programiranje


24

Objektno orijentirano programiranje


25

Uvod
• Kao i u stvarnom svijetu, u programiranju ne postoji samo
jedan pristup rješavanju problema
• Model rješenja ne mora biti savršen u prvoj iteraciji
• Najbolje istražiti više različitih pristupa
• U startu procesa nije još bitan odabir programskog jezika
• Početak je rješavanje problema/zadatka domene
• Odabir tehnologije u startu samo ako je fundamentalno
vezana za sam problem

Objektno orijentirano programiranje


26

OO programiranje
• Osim objekata u OO pristupu koristimo i različite programske
strukture (petlje, uvjetne izraze, itd.)
• Za početak programiranja u OO pristupu potrebno je prvo
naučiti OO koncepte i OO način razmišljanja
• Tri važne stvari kod OO načina razmišljanja:
– Poznavanje razlike između sučelja i implementacije
– Apstraktno razmišljanje
– Pružanje korisniku samo minimalno potrebno sučelje

Objektno orijentirano programiranje


27

Sučelje vs implementacija
• Kod dizajna klase potrebno je razlučiti što korisnik treba, a što
ne treba znati
• Mehanizam skrivanja podataka sadržan u procesu
učahurivanja

• Sučelje kod automobila je poznato, implementacija je


nepoznata za većinu ljudi

Objektno orijentirano programiranje


28

Što korisnici vide


• Korisnici klasa (programeri koji koriste klasu) vide sučelje klase
• Programeri često koriste više različitih klasa paralelno
• Sve te klase napisali su različiti ljudi
• Programer mora znati kako ispravno koristiti neku klasu
• Ispravno napisane klase se trebaju sastojati od dva dijela:
sučelje i implementacija

Objektno orijentirano programiranje


29

Sučelje (interface)
• Usluge koje se pružaju korisniku zajedno čine sučelje
• U najboljem slučaju samo one usluge koje su korisniku
potrebne idu u sučelje
• Pravo pitanje je što korisniku zapravo treba
• Različiti ljudi će vjerojatno dati donekle različite odgovore na
ovo pitanje
• Potrebno je poznavati korisnike klase koje dizajniramo i na koji
način će one njima biti korisne

Objektno orijentirano programiranje


30

Implementacija
• Detalji implementacije su skriveni od korisnika
• Jedna bitna stvar koju treba imati na umu: promjene u
implementaciji ne bi trebale utjecati na kod koji je korisnik
pisao, niti zahtijevati da korisnik mora mijenjati svoj kod
• Interfejs sadrži sintaksu kako pozvati metodu i povratnu
vrijednost – ako se ovo ne mijenja i dobije se ista povratna
vrijednost onda korisnik ne mora ništa mijenjati
• Primjer korištenja mobitela – interfejs je jednostavan –
utipkamo broj i pozovemo. U slučaju da se implementacija
mijenja (npr. operater instalira novu opremu) to ne mijenja
način na koji mi koristimo mobitel

Objektno orijentirano programiranje


31

Primjer
• Potrebno je napraviti klasu kora predstavlja čitač iz baze
podataka
• Potrebno je poznavati koje funkcionalnosti treba naš korisnik
(korisnik ove klase)
• Obično se zahtjevi navedu u dokumentu vezanom za projekt
nakon analize i razgovora sa potencijalnim korisnicima

Objektno orijentirano programiranje


32

Primjer
• Klasa koju dizajniramo je namijenjena programerima kojima je
potrebna upotreba baze podataka
• Prema tome, ovo sučelje je zapravo API – Application-
programming interface koje će korisnik koristiti
• Ovakav interfejs je zapravo wrapper funkcionalnosti baze
• Razlog zbog kojeg ga radimo je mogućnost prilagodbe
(customization) različitih funkcionalnosti (npr. dodatna
priprema podataka prije zapisa ili čitanja iz baze)
• Dodatan razlog je mogućnost promjene sustava/baze bez
potrebe za mijenjanjem korisničkog koda

Objektno orijentirano programiranje


33

Lista zahtjeva
• Otvaranje konekcije prema bazi
• Zatvaranje konekcije prema bazi
• Postavi pokazivač na poziciju prvog zapisa
• Postavi pokazivač na poziciju zadnjeg zapisa
• Dohvati ukupan broj zapisa
• Da li ima još zapisa (da li je pokazivač na zadnjem zapisu)
• Postavi pokazivač na određeni zapis korištenjem ključa
• Dohvati određeni zapis korištenjem ključa
• Dohvati sljedeći zapis u odnosu na pokazivač

Objektno orijentirano programiranje


34

Primjer
ČitačBazePodataka

+otvori:void
+zatvori:void
+idiNaPrviElement:void
+idiNaZadnjiElement:void
+dohvatiBrojElemenata:int
+pročitajZapis:String

• U slučaju da naknadno uočimo da nam trebaju još neke


funkcionalnosti možemo ih dodati – dizajn je iterativan proces

Objektno orijentirano programiranje


35

Interface
• Za svaki od zahtjeva koji smo napisali također smo napisali i
metodu koja pruža tu funkcionalnost. Potrebno je postaviti
nekoliko pitanja:
• Da bi korisnik (programer) efektivno koristio klasu je li
potrebno da zna još nešto o njoj?
• Treba li korisnik znati interni kod implementiran za otvaranje
baze podataka?
• Treba li korisnik znati interni kod implementiran za
postavljanje pokazivača na neki određeni zapis?
• Treba li korisnik znati interni kod implementiran za provjeru
postoji li još zapisa?

Objektno orijentirano programiranje


36

Interface
• Odgovor na ova pitanja je ne
• Nije potrebno poznavati ove informacije
• Ono što je bitno da korisnik dobije točne povratne vrijednosti i da
su operacije ispravno napravljene
• Aplikacijski programer će zapravo najvjerojatnije biti još jedan
apstraktni nivo iznad implementacije
• Aplikacija će koristiti ove klase za otvoriti bazu, a klase će pozvati
API od baze podataka
• Da bi se pružio minimalni interfejs najbolje je krenuti od potpuno
praznog interfejsa i polako dodavati funkcionalnosti koje bi korisnik
želio
• Nije dobro unaprijed pretpostavljati će korisnik željeti neku
specifičnu funkcionalnost

Objektno orijentirano programiranje


37

Interface
• Stvaranje wrappera može izgledati kao suvišan posao, ali ima svojih
prednosti
• Npr. razmotrimo potrebu mapiranja objekata u relacijske baze
podataka
• Na tržištu postoje OO baze podataka, ali i veliki broj sustava koji
koristi relacijske baze
• Ako radimo programe za sustav koji koristi relacijski model može se
koristiti middleware koji će mapirati objekte iz aplikacijskog koda u
relacijski model
• Čak i ako iz početka stvorimo potpuni OO sustav često nećemo moći
izbjeći korištenje relacijskih baza – budući da većina sustava ovisi o
informacijama iz nekog drugog ili više različitih sustava

Objektno orijentirano programiranje


38

Object persistence
• Koncept koji se odnosi na spremanje stanja objekta na način
koji omogućava njegovo kasnije korištenje
• Objekt koji ne koristi „persistnace” po prirodi nestaje kada
izađe iz dosega
• Npr. stanje objekta se može spremiti u bazu podataka ili
datoteku

Objektno orijentirano programiranje


39

Primjer implementacije
public void open(String ime){
/*Kod potreban za specifične zadatke*/
/*Pozovi Oracle API za otvaranje baze*/
/*Dodatni kod potreban za specifične zadatke*/
}

Objektno orijentirano programiranje


40

Primjer implementacije
public void open(String ime){
/*Kod potreban za specifične zadatke*/
/*Pozovi SQLAnywhere API za otvaranje baze*/
/*Dodatni kod potreban za specifične zadatke*/
}

• Nakon kodiranja potrebnih stvari od strane implementatora,


pogledajmo što naš krajnji korisnik treba promijeniti
• Ništa – to je upravo prednost razdvajanja interfejsa i
implementacije

Objektno orijentirano programiranje


41

Primjer implementacije

Objektno orijentirano programiranje


42

Apstraktno razmišljanje
• Jedna od najvećih prednosti OO programiranja je mogućnost
ponovnog korištenja koda (eng. code reuse)
• Konkretni interfejsi su vrlo specifični, a apstraktni interfejsi su
generalniji
• Primjer razlike između apstraktnog i konkretnog interfejsa
Odvedi me
na aerodrom

Objektno orijentirano programiranje


43

Apstraktno razmišljanje
• Postavlja se pitanje koji od ova dva scenarija ima bolju
mogućnost ponovnog korištenja u različitim situacijama

Vozi ravno,
skreni desno,
ravno, lijevo …

Objektno orijentirano programiranje


44

Minimalni interface
• Pružite korisniku isključivo samo ono što mu je potrebno. Ako
pokaže da je potrebno proširiti interfejs to se radi iterativno.
• Bitno je klase dizajnirati iz perspektive korisnika, a ne iz
perspektive sustava. Dizajneri klasa klase dizajniraju na način
da se uklapa u specifični tehnološki model. Potrebno je
razmišljati na koji način će ta klasa biti korisna korisniku.

Objektno orijentirano programiranje


45

Potrebe korisnika
• Potrebno je postići kompromis između jednostavnosti i
udovoljavanju zahtjevima korisnika i mogućnosti
implementacije
• Ponekad je neke zahtjeve tehnički nemoguće izvesti i treba se
pronaći zajedničko rješenje

Objektno orijentirano programiranje


46

Definiranje interface-a
• Nakon što su se sakupili svi potrebni zahtjevi kreće se u
definiranje interfejsa
• Prilikom definiranja interfejsa razmišlja se o načinu kako se
objekt koristi, a ne o načinu njegove implementacije
• U slučaju da se otkriju novi zahtjevi oni se dodaju narednim
iteracijama
• Analogija interfejsa sa primjerom taksija:
– pozovi taksi
– uđi
– specificiraj odredište
– plati vožnju …

Objektno orijentirano programiranje


47

Definiranje interface-a

Taksi

+pozoviTaksi:void
+uđiUtaksi:void
+specificirajOdredište:void
+platiVožnju:void
+izađi:void

Objektno orijentirano programiranje


48

Identifikacija implementacije
• Tek nakon što su interfejsi odabrani kreće se sa identifikacijom
implementacije
• Tehnički gledano – sve što nije dio interfejsa se smatra
implementacijom
• Sve privatne metode se smatraju implementacijom
• Korisnik bi trebao vidjeti samo način pozivanja/komunikacije s
interfejsom, ali ne i sam kod koji te metode sadrže
• Sve što se smatra implementacijom bi dizajner klase trebao
moći promijeniti (u slučaju da je to potrebno) bez da se to
odrazi na krajnjeg korisnika

Objektno orijentirano programiranje


49

• Napisati program za pamćenje brojeva.


• Broj se pokaže 2 sekunde i onda nestane, a korisnik ga
mora ponovno točno upisati.
• Sa svakom iteracijom broj znamenaka se povećava.

Objektno orijentirano programiranje


50

Zadatak

Sequence

-numbers: int[]
-length : int

+generateSequence(length):void
+printNumber: void
+checkUserInput: bool

Objektno orijentirano programiranje


51

Sequence
class Sequence {
private:
int numbers[100];
int length = 0;

public:
...
};

Objektno orijentirano programiranje


52

+generateSequence(length):void
void generateSequence(int receivedLength) {
length = receivedLength;
for (int i = 1; i <= length; i++) {
numbers[i] = rand() % 10;
}
}

Objektno orijentirano programiranje


53

+printNumber:void
void printNumber() {
cout << "Duljina " << length << ", broj je:" << endl;
for (int i = 1; i <= length; i++) {
cout << numbers[i];
}
Sleep(2000);
system("CLS");
}

Objektno orijentirano programiranje


54

+checkUserInput:bool
bool checkUserInput() {
cout << "Duljina " << length << ", broj je:" << endl;
for (int i = 1; i <= length; i++) {
char c = _getche();
int broj = c - '0’;
if (broj != numbers[i]) return false;
}
return true;
}

Objektno orijentirano programiranje


class Sequence {
private: 55
int numbers[100];
int length = 0;
public:
void generateSequence(int receivedLength) {
length = receivedLength;
for (int i = 1; i <= length; i++) {
numbers[i] = rand() % 10;
}
}
void printNumber() {
cout << "Duljina " << length << ", broj je:" << endl;
for (int i = 1; i <= length; i++) {
cout << numbers[i];
}
Sleep(2000);
system("CLS");
}
bool checkUserInput() {
cout << "Duljina " << length << ", broj je:" << endl;
for (int i = 1; i <= length; i++) {
char c = _getche();
int broj = c - '0’;
if (broj != numbers[i]) return false;
}
return true;
}
};

Objektno orijentirano programiranje


int main() { 56
srand(time(NULL));

cout << "Dobrodosli u igru pogadjanja!" << endl;


for (int i = 1; i < 1000; i++) {
Sequence sequence;
sequence.generateSequence(i);
sequence.printNumber();
bool ispravno = sequence.checkUserInput();
if (!ispravno) {
cout << endl << "Uspjesno ste rijesili do duljine "
<< i - 1 << "!" << endl;
break;
}
else {
cout << "TOCNO!";
Sleep(2000);
system("CLS");
}
}
}

Objektno orijentirano programiranje


57

Objektno orijentirano programiranje


58

ČitačBazePodataka

ČitačBazePodataka

-imeBaze:string
-pozicijaPokazivaca:int

+ČitačBazePodataka(string)
+ČitačBazePodataka(string, int)
+otvori:void
+zatvori:void
+idiNaPrviElement:void
+idiNaZadnjiElement:void
+dohvatiBrojElemenata:int
+pročitajZapis:String

Objektno orijentirano programiranje


59

Preopterećivanje metoda (overloading)


• Isto ime metode, ali različit broj ili tip argumenata koje
ona prima
• Metode imaju različiti potpis
• Potpis uključuje ime metode i listu argumenata

Potpis
public string dohvatiZapis(int redniBroj)

Potpis = dohvatiZapis (int redniBroj)


ime metode + lista argumenata

Objektno orijentirano programiranje


60

Konstruktori
class CitacBazePodataka{
string imeBaze;
int pozicijaPokazivaca;

//inicijalizacija samo imena


public CitacBazePodataka(string ime){
imeBaze = ime;
pozicijaPokazivaca = 0;
}

//inicijalizacija imena i kursora


public CitacBazePodataka(string ime, int pozicija){
imeBaze = ime;
pozicijaPokazivaca = pozicija;
}
//... ostatak koda klase
};

Objektno orijentirano programiranje


61

Konstruktor roditeljske klase


• Kada koristimo nasljeđivanje moramo poznavati i
konstruktor roditeljske klase (njegovu funkcionalnost)
• Kada koristimo nasljeđivanje onda nasljeđujemo
atribute i metode od roditelja
• Trebamo poznavati ponašanje roditeljske klase
• Kako se nasljeđuje konstruktor?

Objektno orijentirano programiranje


62

Konstruktor roditeljske klase

Objektno orijentirano programiranje


class Base{
63
int x;
public:
Base() {
cout << "Base default constructor\n";
}
};
class Derived : public Base{
int y;
public:
Derived() {
cout << "Derived default constructor\n";
}
Derived(int i) {
cout << "Derived parameterized constructor\n";
}
};
int main(){
Base b;
Derived d1;
Derived d2(10);
return 0;
}

Objektno orijentirano programiranje


64
class Base{
int x;
public:
Base() {
cout << "Base default constructor\n";
}
Base(int i) {
cout << "Base parameterized constructor\n";
}
}; Čak i ako dodamo base
parameterized konstruktor, on se
neće automatski pozivati
class Derived : public Base{ int main(){
int y; Base b;
public: Derived d1;
Derived() { Derived d2(10);
cout << "Derived default constructor\n"; return 0;
} }
Derived(int i) {
cout << "Derived parameterized constructor\n";
}
};

Objektno orijentirano programiranje


class Base{ 65
int x;
public:
Base(int i){
x = i;
cout << "Base Parameterized Constructor\n";
}
};
Pozivamo parametrizirani
class Derived : public Base{ konstruktor Base klase
int y;
public:
Derived(int j):Base(j){
y = j;
cout << "Derived Parameterized Constructor\n";
}
};

int main(){
Derived d2(10);
return 0;
}

Objektno orijentirano programiranje


class Animal { 66
public:
Animal() {
cout << "Animal constructor" << endl;
}
};
class Lion : Animal {
public:
Lion() {
cout << "Lion constructor" << endl;
}
};
class Tiger : Animal {
public:
Tiger() {
cout << "Tigar constructor" << endl;
}
};
class Liger : Tiger, Lion {
public:
Liger() {
cout << "Liger constructor" << endl;
}
};

Objektno orijentirano programiranje


67

int main() {
Liger liger;
return 0;
}

Objektno orijentirano programiranje


68

C++
• Base konstruktor se poziva automatski
• C++ podržava višestruko nasljeđivanje
• Možemo pozvati i parametrizirani konstruktor Base
klase, ali to moramo posebno naglasiti

Objektno orijentirano programiranje


69

class Parent(object):
def __init__(self):
print ("Calling parent constructor")

class Child(Parent):
def __init__(self):
print ("Calling child constructor")

c = Child()

Objektno orijentirano programiranje


70

class Parent(object):
def __init__(self):
print ("Calling parent constructor")

class Child(Parent):
def __init__(self):
super(Child, self).__init__()
print ("Calling child constructor")

c = Child()

Objektno orijentirano programiranje


class Animal: 71
def __init__(self):
print ("Calling Animal constructor")

class Lion(Animal):
def __init__(self):
super(Lion, self).__init__()
print ("Calling Lion constructor")

class Tiger(Animal):
def __init__(self):
super(Tiger, self).__init__()
print ("Calling Tiger constructor")

class Liger(Lion, Tiger):


def __init__(self):
super(Liger, self).__init__()
print ("Calling Liger constructor")

liger = Liger()

Objektno orijentirano programiranje


class Animal: 72
def __init__(self):
print ("Calling Animal constructor")

class Lion(Animal):
def __init__(self):
super(Lion, self).__init__()
print ("Calling Lion constructor")

class Tiger(Animal):
def __init__(self):
super(Tiger, self).__init__()
print ("Calling Tiger constructor")

class Liger(Tiger, Lion):


def __init__(self):
super(Liger, self).__init__()
print ("Calling Liger constructor")

liger = Liger()

Objektno orijentirano programiranje


73

Python
• Možemo definirati samo jedan konstruktor
• Python podržava višestruko nasljeđivanje
• Redoslijed je bitan
• Ručno moramo pozivati konstruktor base klase korištenjem „super”
• Postoje različiti MRO
https://python-history.blogspot.com/2010/06/method-resolution-order.html

Objektno orijentirano programiranje


74
public class Base{
public Base(){
Console.WriteLine("Base default constructor!");
}
}

public class Derived : Base{


public Derived(){
Console.WriteLine("Derived default constructor!");
}
}

class Program{
static void Main(string[] args){
Derived d = new Derived();
}
}

Objektno orijentirano programiranje


public class Base{ 75
public Base(){
Console.WriteLine("Base default constructor!");
}
public Base(int x){
Console.WriteLine("Base parameterized constructor!");
}
}

public class Derived : Base{


public Derived(){
Console.WriteLine("Derived default constructor!");
}
public Derived(int x){
Console.WriteLine("Derived parameterized constructor!");
}
}

class Program{
static void Main(string[] args){
Derived d = new Derived(100);
}
}

Objektno orijentirano programiranje


public class Base{ 76
public Base(){
Console.WriteLine("Base default constructor!");
}
public Base(int x){
Console.WriteLine("Base parameterized constructor!");
}
}

public class Derived : Base{


public Derived(){
Console.WriteLine("Derived default constructor!");
}
public Derived(int x) : base(x){
Console.WriteLine("Derived parameterized constructor!");
}
}

class Program{
static void Main(string[] args){
Derived d = new Derived(100);
}
}

Objektno orijentirano programiranje


public class Base { 77

public Base(){
System.out.println("Base default constructor!");
}
public Base(int x){
System.out.println("Base parameterized constructor!");
}
}

public class Derived extends Base{


public Derived(){
System.out.println("Derived default constructor!");
}
public Derived(int x){
System.out.println("Derived parameterized constructor!");
}
public static void main(String[] args) {
Derived d = new Derived(100);
}
}

Objektno orijentirano programiranje


78

public class Derived extends Base{


public Derived(){
System.out.println("Derived default constructor!");
}

public Derived(int x){


super(x);
System.out.println("Derived parameterized constructor!");
}

public static void main(String[] args) {


Derived d = new Derived(100);
}
}

Objektno orijentirano programiranje


79
class Base {
function __construct() {
print "Base default constructor!<br>";
}
}

class Derived extends Base {


function __construct() {
parent::__construct();
print "Derived default constructor!<br>";
}
}

class DerivedTwo extends Base {


}

$obj = new Base();


$obj = new Derived();
$obj = new DerivedTwo();

Objektno orijentirano programiranje


Objektno orijentirano
programiranje

KRAJ

You might also like