74
Objektno orijentisano programiranje Klase

Objektno orjentisano programiranje - Klase

Embed Size (px)

DESCRIPTION

Objektno orjentisano programiranje - Klase

Citation preview

Page 1: Objektno orjentisano programiranje - Klase

Objektno orijentisano programiranje

Klase

Page 2: Objektno orjentisano programiranje - Klase

Definisanje i deklarisanje klasa Objekti klasnih tipova Metode klasa Konstruktori i destruktori Zajednički članovi klasa Prijateljske funkcije i klase

Klase

Page 3: Objektno orjentisano programiranje - Klase

Za filozofe◦ Predmet klasifikacije ljudi◦ Klasifikacija bazirana na zajedničkim osobinama i

ponašanju◦ Dogovor o opisima i imenima korisnih klasa

Za programere◦ Imenovana sintaksna konstrukcija koja opisuje

zajedničko ponašanje i svojstva◦ Struktura podataka koja obuhvata i podatke i

funkcije

Pojam klase

Page 4: Objektno orjentisano programiranje - Klase

Objekat je primjerak (instanca) klase Objekti posjeduju:

◦ Identitet (objekti iste klase se razlikuju jedan od drugog)

◦ Ponašanje (objekti mogu da izvršavaju operacije)◦ Stanje (objekti čuvaju podatke)

Pojam objekta

Page 5: Objektno orjentisano programiranje - Klase

Apstrakcija – selektivno “ignorisanje”◦ Razdvajanje važnih od nevažnih stvari◦ Fokusiranje na ono što je važno◦ Ignorisanje onoga što je nevažno◦ Koristiti enkapsulaciju (zatvaranje) za primjenu

apstrakcije

Apstrakcija

Page 6: Objektno orjentisano programiranje - Klase

Kombinovanje podataka i metoda (data and methods) u jednoj “kapsuli”

Kontrola pristupa/vidljivosti

Enkapsulacija

Page 7: Objektno orjentisano programiranje - Klase

Kombinacija podataka i metoda

Zatvaranje podataka i metoda u isti kontejner

Granica kontejnera razdvaja unutrašnjost od okoline

Withdraw( )

Deposit( )

balance

Withdraw( )

Deposit( )

balance

BankAccount ?BankAccount ?

Page 8: Objektno orjentisano programiranje - Klase

Kontrola pristupa Metode su obično javne (public), dostupne

izvana Podaci su obično privatni (private),

nedostupni izvana

Withdraw( )

Deposit( )

balance

Withdraw( )

Deposit( )

balanceû

BankAccount ?BankAccount ?

Page 9: Objektno orjentisano programiranje - Klase

Zašto koristiti enkapsulaciju? Omogućava kontrolu

◦ Korišćenje objekta vršise samo posredstvomjavnih metoda

Omogućava izmjene◦ Korišćenje objekta

izvana ostaje isto u slučaju promjeneinternih tipova

◦ podataka

Withdraw( )

Deposit( )

dollars 12

Withdraw( )

Deposit( )

balance 12.56

cents 56

û

Page 10: Objektno orjentisano programiranje - Klase

Podaci objekata Podaci objekata daju informacije o

individualnim objektima◦ Svaki račun ima svoje stanje. Ako dva računa

imaju isto stanje, to je samo slučajnost.

Withdraw( )

Deposit( )

balance 12.56

owner "Bert"

Withdraw( )

Deposit( )

balance 12.56

owner "Fred"

Page 11: Objektno orjentisano programiranje - Klase

Zajednički (statički) podaci

Zajednički podaci daju informaciju o svim objektima klase ◦ Svi računi imaju istu kamatnu stopu.

Čuvanje iste stope za svaki račun nije dobro rješenje.

Withdraw( )

Deposit( )

balance 12.56

interest 7%

Withdraw( )

Deposit( )

balance 99.12

interest 7%û û

Page 12: Objektno orjentisano programiranje - Klase

Zajedničke (statičke) metode Zajedničke metode pristupaju zajedničkim

podacima, pozivaju se za klasu, ne za objekat

InterestRate( )

interest 7%

Withdraw( )

Deposit( )

balance 99.12

owner "Fred"

An account objectThe account class

Classes contain static data and static methods

Objects contain object data and object methods

û

û

Page 13: Objektno orjentisano programiranje - Klase

Složeni tipovi podataka Elementi klasa – članovi (atributi, metode) Podaci klasnog tipa – primjerci, instance

klase, objekti Vrijednosti atributa čine stanje objekta Metode služe za izvođenje operacija koje

objekat podržava

Klase

Page 14: Objektno orjentisano programiranje - Klase

Određuju moguće vrijednosti objekata Određuju moguće operacije nad objektima Sprečavaju bilo koje druge operacije nad

objektima Obezbjeđuju obaveznu inicijalizaciju

objekata Obezbjeđuju uništavanje objekata kada više

nisu potrebni

Klase kao tipovi podataka

Page 15: Objektno orjentisano programiranje - Klase

Definicija klase – navođenje svih članova klase

Deklaracija klase – naznačavanje da neki identifikator predstavlja klasu, bez detalja implementacije

Definicija atributa – naredba za definisanje podataka

Definicija metoda – definicija funkcija

Definisanje i deklarisanje klasa

Page 16: Objektno orjentisano programiranje - Klase

class Time { public:Time(); void setTime( int, int, int ); void printUniversal(); void printStandard();

private:int hour; int minute; int second;

};

Definicija klase: C++

Page 17: Objektno orjentisano programiranje - Klase

class Time {public Time() {...} public void setTime(int x,int y,int z)

{...}public printUniversal() {...} private int hour; private int minute; private int second;

};

Definicija klase: C#

Page 18: Objektno orjentisano programiranje - Klase

Hello World: C++

#include <iostream>

using namespace std;

int main () { cout << "Hello World!"; return 0;

}

#include <iostream>

using namespace std;

int main () { cout << "Hello World!"; return 0;

}

Page 19: Objektno orjentisano programiranje - Klase

Hello World: C#

using System; class Hello{

public static int Main( ) {

Console.WriteLine("Hello, World");return 0;

}}

using System; class Hello{

public static int Main( ) {

Console.WriteLine("Hello, World");return 0;

}}

Page 20: Objektno orjentisano programiranje - Klase

Naredba definisanja podataka, bez mogućnosti navođenja inicijalizatora

Odjednom se može definisati više atributa zajedničkog osnovnog tipa

Atributi ne mogu biti tipa klase koja se upravo definiše, ali mogu biti pokazivači i upućivači na primjerke te klase (C++)

Definisanje atributa (polja)

Page 21: Objektno orjentisano programiranje - Klase

Ekvivalentno definisanju funkcija Za metode definisane u okviru klase

podrazumijeva se modifikator inline, tzv ugrađene metode (C++)

Tumačenje tijela metode odlaže se do kraja definicije klase, što omogućava korištenja članova klase koji se definišu poslije definicije metode u okviru klase

Povratna vrijednost i argumenti metode mogu biti tipa klase koja se definiše

Definisanje metoda

Page 22: Objektno orjentisano programiranje - Klase

Prototip funkcije (potpis, signature) Metode koje se u klasi deklarišu moraju biti

definisane izvan definicije klase (C++) Mogu biti i ugrađene metode ali je tada

potrebno eksplicitno navesti modifikator inline pri definisanju metode (C++)

Deklarisanje metoda

Page 23: Objektno orjentisano programiranje - Klase

Privatni◦ Pristup samo iz unutrašnjosti klase◦ Nevidljivi izvan klase

Javni◦ Pristup iz unutrašnjosti i izvan klase

Atributi uglavnom privatni, metode i privatne i javne

Pristup atributima pomoću javnih metoda

Prava pristupa i vidljivost članova

Page 24: Objektno orjentisano programiranje - Klase

Doseg svih identifikatora unutar klase je od mjesta definisanje do kraja klase

Članovi klase imaju klasni doseg Definicija klase mora biti dostupna

prevodiocu pri prevođenju programa koji stvara objekte te klase

Definicije klase obično se stavljaju u zaglavlja (ime_klase.h) koja se uključuju u program direktivama #include (C++)

Opseg važenja - doseg

Page 25: Objektno orjentisano programiranje - Klase

Klasni doseg (class scope)◦ Podaci članovi, funkcije članice

U okviru klasnog dosega članovi klase◦ Direktno dostupni svim funkcijama članicama◦ Referenciranje navođenjem imena

Van klasnog dosega◦ Referenciranje na osnovu imena objekta,

reference objekta, pokazivača na objekat

Opseg važenja - doseg

Page 26: Objektno orjentisano programiranje - Klase

Promjenljive deklarisane u funkciji članici poznate samo u funkciji

Promjenljive sa istim imenom kao promjenljive u dosegu klase◦ Promenljive klasnog dosega se “sakrivaju -

maskiraju”◦ Pristup je moguć korišćenjem operatora za

razrješenje dosega (scope resolution operator) (::)

ClassName::classVariableName (C++) Promjenljive su poznate samo u funkcijama gdje

su definisane Promjenljive se uništavaju nakon završetka

funkcije tj. izlaska iz nje

Opseg važenja - doseg

Page 27: Objektno orjentisano programiranje - Klase

Lakše se modifikuju programi Header fajlovi

◦ definicija klasa i prototipova funkcija◦ uključuju se u svaki fajl koji koristi klasu

(#include)◦ Ekstenzija fajla *.h

Fajlovi sa kodom◦ Definicija funkcija◦ Isto osnovno ime po konvenciji◦ Kompajliraju se i poslije se linkuju

Razdvajanje interfejsa od implementacije (C++)

Page 28: Objektno orjentisano programiranje - Klase

1 class Time {2 3 public:4 Time(); // constructor5 void setTime( int, int, int ); // set hour, minute, second6 void printUniversal(); // print universal-time format7 void printStandard(); // print standard-time format8 9 private:10 int hour; // 0 - 23 (24-hour clock format)11 int minute; // 0 - 5912 int second; // 0 - 5913 14 }; // end class Time

Modifikatori prava pristupa

Definicija klase počinje ključnom rečju class.

Tijelo klase počinje otvorenom vitičastom zagradom.

Tijelo klase se završava desnom vitičastom zagradom.

Definicije se završavaju sa tačka-zarez tj ;

Prototip funkcije koja je public.

private podaci kojima mogu da pristupe samo funkcije članice.

Konstruktor ima isto ime kao i klasa, Time, i nema povratnu vrijednost.

Page 29: Objektno orjentisano programiranje - Klase

12 // Declaration of class Time. 3 // Member functions are defined in time1.cpp4 5 // prevent multiple inclusions of header file6 #ifndef TIME1_H7 #define TIME1_H8 9 // Time abstract data type definition10 class Time {11 12 public:13 Time(); // constructor14 void setTime( int, int, int ); // set hour, minute, second15 void printUniversal(); // print universal-time format16 void printStandard(); // print standard-time format17 18 private:19 int hour; // 0 - 23 (24-hour clock format)20 int minute; // 0 - 5921 int second; // 0 - 5922 23 }; // end class Time24 25 #endif

Pretprocesorska direktiva kao zaštita od višestukog uključivanja

Code between these directives not included if name TIME1_H already defined.

“If not defined”Preprocesorska direktiva definiše ime TIME1_H.

Naming convention: ime header fajla sa underscore.

Page 30: Objektno orjentisano programiranje - Klase

12 // Member-function definitions for class Time.3 #include <iostream>4 5 using std::cout;6 7 #include <iomanip>8 9 using std::setfill;10 using std::setw;11 12 // include definition of class Time from time1.h13 #include "time1.h" 14 15 // Time constructor initializes each data member to zero.16 // Ensures all Time objects start in a consistent state.17 Time::Time() 18 { 19 hour = minute = second = 0; 20 21 } // end Time constructor22

Uključivanje header fajla time1.h.

Ime header fajla u duplim navodnicima; uglasti navodnici se koriste za header fajlove iz C++ Standard Library.

Page 31: Objektno orjentisano programiranje - Klase

23 // Set new Time value using universal time. Perform validity24 // checks on the data values. Set invalid values to zero.25 void Time::setTime( int h, int m, int s )26 {27 hour = ( h >= 0 && h < 24 ) ? h : 0;28 minute = ( m >= 0 && m < 60 ) ? m : 0;29 second = ( s >= 0 && s < 60 ) ? s : 0;30 31 } // end function setTime32 33 // print Time in universal format34 void Time::printUniversal()35 {36 cout << setfill( '0' ) << setw( 2 ) << hour << ":"37 << setw( 2 ) << minute << ":"38 << setw( 2 ) << second;39 40 } // end function printUniversal41

Page 32: Objektno orjentisano programiranje - Klase

42 // print Time in standard format43 void Time::printStandard()44 {45 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )46 << ":" << setfill( '0' ) << setw( 2 ) << minute47 << ":" << setw( 2 ) << second 48 << ( hour < 12 ? " AM" : " PM" );49 50 } // end function printStandard

Page 33: Objektno orjentisano programiranje - Klase

Nakon definisanja klase moguće je◦ Definisanje objekata i nizova objekata [ ]◦ Definisanje pokazivača i upućivača na objekte (C+

+)◦ Dodjela vrijednosti jednog objekta drugom◦ Nalaženje adresa objekata i pristup objektima na

osnovu adrese ili indeksiranjem (C++)◦ Pristup članovima objekata neposredno (.) ◦ Pristup članovima objekata posredno (->) (C++)

Objekti klasnih tipova

Page 34: Objektno orjentisano programiranje - Klase

Objekti klasnih tipova su primjerci ili instance klase

Definišu se uobičajenim naredbama za definisanje podataka

Za oznaku tipa uzima se identifikator klase Za svaki objekat kreira se poseban skup svih polja

(atributa) te klase Pripadanje metoda objektu treba shvatiti u

logičkom smislu: pri pozivu metode određenog objekta ona obrađuje polja tog objekta

Pri prevođenju programa se prevod svake metode smješta u memoriju samo jednom, koristi se za poziv metode iz bilo kojeg objekta

Definisanje objekata

Page 35: Objektno orjentisano programiranje - Klase

Dodjela vrijednosti jednog objekta drugom podrazumijeva kopiranje vrijednosti svih polja izvorišnog u odredišni objekat

Za slučaj pokazivačkih polja prenosi se samo vrijednost pokazivača, ne i pokazivani podatak (podobjekat)

Pristup metodama operatorima “.” i “->” podrazumijeva pozivanje metode

Rad sa objektima

Page 36: Objektno orjentisano programiranje - Klase

Objekti mogu biti parametri i povratne vrijednosti funkcija

U slučaju parametara prenos se vrši po vrijednosti

Moguće je koristiti i pokazivače ili upućivače (C++)

Rad sa objektima

Page 37: Objektno orjentisano programiranje - Klase

Mogu se definisati izvan ili unutar klasa (C++)◦ Obično se definišu izvan klasa◦ Inline metode – definisane unutar klasa

Definišu se unutar klasa (C#)

Metode klasa

Page 38: Objektno orjentisano programiranje - Klase

Koristi se binarni resolution operator “::”◦ Određuje kojoj klasi pripada funkcija◦ Jedinstveno identifikuje funkcije konkretne klase◦ Različite klase mogu imati metode istih imena

ReturnType ClassName::MemberFunctionName( ){…

} Ne zavisi da li je funkcija private ili public Za metode definisane unutar klase nije

potrebno navoditi operator “::” niti ime klase

Definisanje metoda van klase (C++)

Page 39: Objektno orjentisano programiranje - Klase

Koristi se ključna riječ inline ispred funkcije Kompajler kopira kod funkcije umjesto

poziva funkcije◦ Umanjuje broj poziva funkcije◦ Kompajler može i da ignoriše inline

Korisno za male funkcije koje se često koriste

inline double cube( const double s ){ return s * s * s; }

Inline funkcije (C++)

Page 40: Objektno orjentisano programiranje - Klase

3 #include <iostream>5 using std::cout;6 using std::endl;8 #include <iomanip>10 using std::setfill;11 using std::setw;13 // Time abstract data type (ADT) definition 14 class Time {

16 public: 17 Time(); // constructor 18 void setTime( int, int, int ); // set hour, minute, second 19 void printUniversal(); // print universal-time format

void printStandard(); // print standard-time format 22 private: 23 int hour; // 0 - 23 (24-hour clock format) 24 int minute; // 0 - 59 25 int second; // 0 - 59

27 }; // end class Time

Definicija klase Time.

Primjer: C++

Page 41: Objektno orjentisano programiranje - Klase

29 // Time constructor initializes each data member to zero and30 // ensures all Time objects start in a consistent state 31 Time::Time() 32 { 33 hour = minute = second = 0; 34 35 } // end Time constructor 36 37 // set new Time value using universal time, perform validity38 // checks on the data values and set invalid values to zero 39 void Time::setTime( int h, int m, int s ) 40 { 41 hour = ( h >= 0 && h < 24 ) ? h : 0; 42 minute = ( m >= 0 && m < 60 ) ? m : 0; 43 second = ( s >= 0 && s < 60 ) ? s : 0; 44 45 } // end function setTime 46

Constructor inicijalizuje private podatak na 0.

public member function proverava vrednost parametara pre setovanja private podataka.

Page 42: Objektno orjentisano programiranje - Klase

47 // print Time in universal format48 void Time::printUniversal()49 {50 cout << setfill( '0' ) << setw( 2 ) << hour << ":"51 << setw( 2 ) << minute << ":"52 << setw( 2 ) << second;53 54 } // end function printUniversal55 56 // print Time in standard format57 void Time::printStandard()58 {59 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )60 << ":" << setfill( '0' ) << setw( 2 ) << minute61 << ":" << setw( 2 ) << second 62 << ( hour < 12 ? " AM" : " PM" );63 64 } // end function printStandard65 66 int main()67 {68 Time t; // instantiate object t of class Time69

Deklaracija promenljive t kao objekta klase Time.

Nema argumenata.

Page 43: Objektno orjentisano programiranje - Klase

70 // output Time object t's initial values71 cout << "The initial universal time is ";72 t.printUniversal(); // 00:00:0073 74 cout << "\nThe initial standard time is ";75 t.printStandard(); // 12:00:00 AM76 77 t.setTime( 13, 27, 6 ); // change time78 79 // output Time object t's new values80 cout << "\n\nUniversal time after setTime is ";81 t.printUniversal(); // 13:27:0682 83 cout << "\nStandard time after setTime is ";84 t.printStandard(); // 1:27:06 PM85 86 t.setTime( 99, 99, 99 ); // attempt invalid settings87 88 // output t's values after specifying invalid values89 cout << "\n\nAfter attempting invalid settings:"90 << "\nUniversal time: ";91 t.printUniversal(); // 00:00:0092

poziv public metode

Postavljanje vrednosti člana klase korišćenjem public funckije članice.

Pokušaj postavljanja vrednosti člana klase na nevalidnu vrednost korišćenjem public funkcije članice.

Page 44: Objektno orjentisano programiranje - Klase

93 cout << "\nStandard time: ";94 t.printStandard(); // 12:00:00 AM95 cout << endl;96 97 return 0; 98 99 } // end mainThe initial universal time is 00:00:00The initial standard time is 12:00:00 AM 

Universal time after setTime is 13:27:06Standard time after setTime is 1:27:06 PM 

After attempting invalid settings:Universal time: 00:00:00Standard time: 12:00:00 AM

Podatak postavljen na 0 nakon pokušaja postavljanja nevalidne vrednosti.

Page 45: Objektno orjentisano programiranje - Klase

Primjer: C#

class BankAccount{ public void Withdraw(decimal amount) { ... } public void Deposit(decimal amount) { ... } private decimal balance; private string name;}

class BankAccount{ public void Withdraw(decimal amount) { ... } public void Deposit(decimal amount) { ... } private decimal balance; private string name;}

Page 46: Objektno orjentisano programiranje - Klase

Deklaracija varijable tipa klase ne kreira novi objekat, potrebno je koristiti operator new

class Program{ static void Main( ) { Time now; now.hour = 11; BankAccount yours = new BankAccount( ); yours.Deposit(999999M); }}

class Program{ static void Main( ) { Time now; now.hour = 11; BankAccount yours = new BankAccount( ); yours.Deposit(999999M); }}

hourminute

now

yours ......

newBankAccountobject

Page 47: Objektno orjentisano programiranje - Klase

Operator this odnosi se na objekat koji se koristi za pristup članu

Operator this

class BankAccount{ ... public void SetName(string name) { this.name = name; } private string name; }

class BankAccount{ ... public void SetName(string name) { this.name = name; } private string name; }

Page 48: Objektno orjentisano programiranje - Klase

Specijalne funkcije članice klase Imaju isto ime kao i klasa Inicijalizuju podatke članove klase Pozivaju se automatski kada se kreira

objekat klase Nemaju povratni tip Može se definisati više konstruktora sa istim

imenom, ali različitim brojem ili tipom parametara (overloading)

Konstruktori

Page 49: Objektno orjentisano programiranje - Klase

Dodjeljuje se memorijski prostor i eventualno inicijalizacija

Memorijski prostor se dodjeljuje automatski za sva polja prema definiciji klase

Inicijalizaciju polja treba da obezbijedi programer

Izuzetak su trajni (statički) objekti čije su početne vrijednosti nule na memorijskim lokacijama svih polja

Stvaranje objekata

Page 50: Objektno orjentisano programiranje - Klase

Jedna klasa može imati više konstruktora - dozvoljeno je preklapanje imena funkcija i za slučaj konstruktora

Konstruktori mogu imati proizvoljan broj parametara, a mogu biti i bez parametara

Parametar konstruktora ne može biti tipa svoje klase, ali može biti pokazivač ili upućivač na primjerke vlastite klase (C++)

Konstruktori mogu imati i podrazumijevane parametre (C++)

Ne vraćaju nikakvu vrijednost, pri definisanju nije dozvoljena čak ni upotreba riječi void za oznaku tipa

Jedina razlika u definiciji konstruktora u odnosu na definiciju obične funkcije klase je u nedostatku oznake tipa

Klase sa konstruktorima

Page 51: Objektno orjentisano programiranje - Klase

Pozivaju se automatski u trenutku stvaranja stalnih ili prolaznih objekata u naredbama za definisanje podataka

Moguće je navesti i inicijalizator opšteg oblika (izraz, izraz, ...), vrijednosti izraza predstavljaju argumente koji se prenose odgovarajućem konstruktoru (C++)

Pozivaju se automatski i pri dodjeli memorije u dinamičkoj zoni pomoću operatora new

Pozivanje konstruktora

Page 52: Objektno orjentisano programiranje - Klase

Definišu se slično kao i obične funkcije, s tim što mogu da se navedu i inicijalizatori za pojedina polja klase, opšti oblik definicije (C++):Klasa (parametri) : inicijalizator, ... , inicijalizator, {tijelo}

U slučaju da nema parametara obavezno je navođenje zagrada ()

U slučaju da je tijelo konstruktora prazno obavezno je navođenje zagrada {}

Ako ne postoje inicijalizatori, ne koristi se ni znak “:”

Ne navodi se povratni tip konstruktora

Definisanje konstruktora

Page 53: Objektno orjentisano programiranje - Klase

Podrazumijevani (default) konstruktor Konstruktor kopije Konstruktor konverzije Privatni konstruktor Statički konstruktor

Konstruktori posebne namjene

Page 54: Objektno orjentisano programiranje - Klase

Konstruktor bez parametara ili čiji svi parametri imaju podrazumijevane vrijednosti

Poziva se automatski kad se stvara objekat bez inicijalizatora

Obezbjeđuje da će svi primjerci klase biti inicijalizovani, čak i kada to programer ne traži eksplicitno

Ako u klasi nije definisan nijedan konstruktor, automatski se generiše podrazumijevani konstruktor sa praznim tijelom, kao javni

Ako je u klasi definisan bar jedan konstruktor, podrazumijevani konstruktor se ne generiše automatski

Nema prepreke da se eksplicitno definiše podrazumijevani konstruktor praznog tijela

Podrazumijevani konstruktor

Page 55: Objektno orjentisano programiranje - Klase

Konstruktor koji može da se poziva sa jednim argumentom tipa svoje klase (koji ima jedan parametar ili kod koga svi parametri osim prvog imaju podrazumijevane vrijednosti)

Parametar mora biti upućivač na primjerke klase Služi za inicijalizaciju primjerka klase kopijom

sadržaja objekta istog tipa Ako u klasi nije definisan konstruktor kopije, on se

kreira automatski kao javan Treba da obezbijedi kopiranje cijelog objekta, ne

samo polja klase Ako postoje pokazivačka polja, automatski

generisan konstruktor kopije nije zadovoljavajući

Konstruktor kopije (C++)

Page 56: Objektno orjentisano programiranje - Klase

Konstruktor koji može da se pozove sa jednim argumentom čiji tip nije jednak posmatranoj klasi

Može da ima i dodatne parametre sa podrazumijevanim vrijednostima

Služe za konverziju tipova Može se vršiti konverzija iz standardnih u klasne

tipove, obrnuto ne može Standardni tipovi nisu klase za koje programer

može definisati konstruktore konverzije

Konstruktor konverzije (C++)

Page 57: Objektno orjentisano programiranje - Klase

Sprečava kreiranje objekata Ne omogućava pristup pojedinačnim

članovima (instance) Omogućava pristup samo statičkim

članovima Jedan od načina za kreiranje funkcija slično

proceduralnom programiranju

Privatni konstruktor

Page 58: Objektno orjentisano programiranje - Klase

Poziva ga class loader u toku rada programa Može se iskoristiti za inicijalizaciju statičkih

podataka Izvršava se prije konstruktora klase pri

kreiranju objekata klase (instanciranju) Ne može se pozivati direktno Nema modifikator prava pristupa Nema parametre

Statički konstruktor (C#)

Page 59: Objektno orjentisano programiranje - Klase

Specijalne funkcije članice klasa Isto ime kao i klasa, sa dodatkom znaka “~”

ispred imena funkcije Nemaju argumente Nema preklapanja Izvršavaju radnje kod uništavanja objekta Pozivaju se automatski kada objekti gube

doseg

Destruktori

Page 60: Objektno orjentisano programiranje - Klase

Konstruktori i destruktori◦ Implicitno se pozivaju - kompajler

Redoslijed poziva◦ Zavisi od redoslijeda izvršavanja◦ Kada u toku izvršavanja objekti dobijaju

odnosno gube doseg◦ Generalno, destruktori se pozivaju u suprotnom

redoslijedu od redoslijeda poziva konstruktora

Pozivanje konstruktora i destruktora

Page 61: Objektno orjentisano programiranje - Klase

Kreiranje objekta◦ Korišćenjem ključne riječi new◦ Inicijalizacija objekta pomoću konstruktora

Korišćenje objekta◦ Pozivanje metoda, pristup atributima

Uništavanje objekta◦ Oslobađanje memorije

Životni ciklus objekata

Page 62: Objektno orjentisano programiranje - Klase

Varijable prostih tipova◦ Životni ciklus je vezan za opseg važenja◦ Determinističko vrijeme nastajanja i nestajanja

Varijable klasnih tipova◦ Životni ciklus nije striktno vezan za opseg važenja◦ Imaju duži životni ciklus◦ Nedeterministričko vrijeme uništavanja

Životni ciklus varijabli prostih i klasnih tipova

Page 63: Objektno orjentisano programiranje - Klase

Nije moguće eksplicitno uništavanje objekata

C# nema naredbu suprotnu naredbi new◦ Razlog je veliki broj grešaka povezanih sa

uništavanjem objekata u drugim programskim jezicima

Za uništavanje objekata koristi se Garbage Collection◦ Pronalazi nekorišćene objekte i uništava ih◦ Oslobađa memoriju zauzetu objektima◦ Oslobađanje memorije vrši se kada je slobodni

memorijski prostor na niskom nivou

Garbage Collection (C#)

Page 64: Objektno orjentisano programiranje - Klase

Garbage collection poziva destruktor prije oslobađanja memorijskog prostora zauzetog objektom

Potrebno je definisati destruktor koji izvršava odgovarajuće radnje kod uništavanja objekta

Redoslijed i vrijeme izvršavanja destruktora je neodređeno

Destruktor će sigurno biti pozvan, samo se ne zna tačno kada

Preporučuje se da se ne koristi destruktor

Oslobađanje memorije (C#)

Page 65: Objektno orjentisano programiranje - Klase

Automatsko oslobađanje resursa po izlasku iz bloka using

Naredba using (C#)

using (Resource r1 = new Resource( )){

r1.Method( );}

using (Resource r1 = new Resource( )){

r1.Method( );}

Page 66: Objektno orjentisano programiranje - Klase

Modifikator static na početku definicije ili deklaracije člana klase

Član je zajednički za sve objekte te klase Članovi koji nisu zajednički nazivaju se

pojedinačni Bez eksplicitnog navođenja svi članovi klase

su pojedinačni Koriste se u slučajevima kada svi primjerci

klase čine neku logičku cjelinu

Zajednički članovi klasa

Page 67: Objektno orjentisano programiranje - Klase

Postoji samo jedan primjerak člana, bez obzira na broj objekata koji se kreiraju

Pristup polju u sastavu bilo kog objekta predstavlja pristup istoj memorijskoj lokaciji

Promjenom vrijednosti zajedničkih polja utiče se na stanje svih objekata

Zajednička polja su specijalni globalni podaci

Zajednički članovi - polja

Page 68: Objektno orjentisano programiranje - Klase

Definisanje primjerka klase podrazumijeva definisanje svih pojedinačnih polja i dodjelu memorijskog prostora

Ovo ne važi za zajednička polja, koja se smatraju posebnim trajnim podacima

Opis zajedničkih polja u klasi smatra se deklaracijom

Definišu se posebnim naredbama za definisanje podataka koja se pišu izvan klase (C++)

Mora se koristiti operator za razrješenje dosega (C++)

Zajednički članovi - polja

Page 69: Objektno orjentisano programiranje - Klase

Ne posjeduju pokazivač this Navođenjem samo identifikatora člana

mogu da pristupaju samo zajedničkim članovima svoje klase

Pojedinačnim članovima mogu da pristupaju samo za konkretne objekte

Objekti mogu biti parametri zajedničkih metoda, lokalni objekti u njima ili globalni objekti

Zajednički članovi - metode

Page 70: Objektno orjentisano programiranje - Klase

Pristup iz svih vrsta funkcija vrši se◦ navođenjem konkretnog objekta (objekat.clan ili

pokazivac->clan)◦ bez navođenja objekta (Klasa::clan)

U metodama iste klase može da se koristi samo identifikator člana (clan)

Preporučuje se pristup Klasa::clan (Klasa.clan) jer se time naglašava da se pristupa klasi u cjelini, a ne samo navedenom objektu

Pristup zajedničkim članovima

Page 71: Objektno orjentisano programiranje - Klase

Nisu članice klase Imaju pravo pristupa do privatnih članova klase Mogu biti obične funkcije ili metode drugih klasa U definiciji klase navodi se prototip ili definicija

prijateljske funkcije sa modifikatorom friend◦ friend tip funkcija(parametri);◦ friend tip funkcija(parametri) blok

Nevažno je da li se funkcija proglašava prijateljskom u privatnom ili javnom dijelu

Ako se navede definicija, podrazumijeva se modifikator inline, kao za članice klase

Identifikator funkcije neće imati klasni doseg, nego doseg identifikatora cijele klase (obično datotečki doseg)

Prijateljske funkcije klasa (C++)

Page 72: Objektno orjentisano programiranje - Klase

Prijateljska funkcija nema pokazivač this na objekat klase kojoj je prijatelj

Prijateljstvo je relacija koja reguliše pravo pristupa, a ne oblast važenja i vidljivost identifikatora

Funkcija može da bude prijatelj većem broju klasa istovremeno

U nekim situacijama su globalne prijateljske funkcije pogodnije od funkcija članica

Prijateljske funkcije klasa (C++)

Page 73: Objektno orjentisano programiranje - Klase

Prijateljske funkcije klasa (C++)class X { friend void g (int X&); // prijateljska globalna funkcija friend void Y::h (); // prijateljska clanica h druge klase Y int i; public: void f(int ip) {i=ip;} }; void g (int k, X &x) { x.i=k; // prijateljska funkcija moze da pristupa } // privatnim clanovima klase void main () { X x; x.f(5); // postavljanje preko clanice g(6,x); // postavljanje preko prijatelja }

Page 74: Objektno orjentisano programiranje - Klase

Sve metode neke klase treba da budu prijateljske funkcije drugoj klasi

Pogodnije je definisanje prijateljske klase◦ friend identifikator_klase;◦ friend class identifikator_klase;

Prijateljske klase (C++)