1 / 74

Objektno orijentisano programiranje

Objektno orijentisano programiranje. Klase. Klase. Definisanje i deklarisanje klasa Objekti klasnih tipova Metode klasa Konstruktori i destruktori Zajednički članovi klasa Prijateljske funkcije i klase. Pojam klase. Za filozofe Predmet klasifikacije ljudi

pavel
Télécharger la présentation

Objektno orijentisano programiranje

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektno orijentisano programiranje Klase

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

  3. Pojam 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

  4. Pojam objekta • 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)

  5. Apstrakcija • 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

  6. Enkapsulacija • Kombinovanje podataka i metoda (data and methods) u jednoj “kapsuli” • Kontrola pristupa/vidljivosti

  7. Kombinacija podataka i metoda • Zatvaranje podataka i metoda u isti kontejner • Granica kontejnera razdvaja unutrašnjost od okoline Withdraw( ) Withdraw( ) balance balance Deposit( ) Deposit( ) BankAccount ? BankAccount ?

  8. Kontrola pristupa • Metode su obično javne (public), dostupne izvana • Podaci su obično privatni (private), nedostupni izvana Withdraw( ) Withdraw( ) û balance balance Deposit( ) Deposit( ) BankAccount ? BankAccount ?

  9. Zašto koristiti enkapsulaciju? • Omogućava kontrolu • Korišćenje objekta vršise samo posredstvomjavnih metoda • Omogućava izmjene • Korišćenje objektaizvana ostaje istou slučaju promjeneinternih tipova • podataka Withdraw( ) Deposit( ) û balance 12.56 Withdraw( ) Deposit( ) dollars 12 cents 56

  10. 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( ) Withdraw( ) Deposit( ) Deposit( ) balance 12.56 balance 12.56 owner "Fred" owner "Bert"

  11. 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( ) Withdraw( ) Deposit( ) Deposit( ) balance 12.56 balance 99.12 û û interest 7% interest 7%

  12. Zajedničke (statičke) metode • Zajedničke metode pristupaju zajedničkim podacima, pozivaju se za klasu, ne za objekat The account class An account object Withdraw( ) û InterestRate( ) Deposit( )  balance 99.12 û interest 7% owner "Fred" Classes contain static data and static methods Objects contain object data and object methods

  13. 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

  14. Klase kao tipovi podataka • 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

  15. Definisanje i deklarisanje klasa • 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

  16. Definicija klase: C++ class Time { public: Time(); void setTime( int, int, int ); void printUniversal(); void printStandard(); private: int hour; int minute; int second; };

  17. Definicija klase: C# class Time { public Time() {...} publicvoid setTime(int x,int y,int z) {...} public printUniversal() {...} private int hour; private int minute; private int second; };

  18. Hello World: C++ #include <iostream> using namespace std; int main () { cout << "Hello World!"; return 0; }

  19. Hello World: C# using System; class Hello { public static int Main( ) { Console.WriteLine("Hello, World"); return 0; } }

  20. Definisanje atributa (polja) • 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++)

  21. Definisanje metoda • 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

  22. Deklarisanje metoda • 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++)

  23. Prava pristupa i vidljivost članova • 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

  24. Opseg važenja - doseg • 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++)

  25. Opseg važenja - doseg • Klasni doseg (class scope) • Podaci članovi, funkcije članice • U okviruklasnog dosega članovi klase • Direktno dostupni svim funkcijama članicama • Referenciranje navođenjem imena • Van klasnog dosega • Referenciranje na osnovuimena objekta, reference objekta, pokazivačana objekat

  26. Opseg važenja - doseg • 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

  27. Razdvajanje interfejsa od implementacije (C++) • 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

  28. Prototip funkcije koja je public. Definicija klase počinje ključnom rečju class. Tijelo klase počinje otvorenom vitičastom zagradom. Modifikatori prava pristupa privatepodaci kojima mogu da pristupe samo funkcije članice. Tijelo klase se završava desnom vitičastom zagradom. Definicije se završavaju sa tačka-zarez tj ; Konstruktor ima isto ime kao i klasa, Time, i nema povratnu vrijednost. 1 class Time { 2 3 public: 4 Time(); // constructor 5 void setTime( int, int, int ); // set hour, minute, second 6 void printUniversal(); // print universal-time format 7 void printStandard(); // print standard-time format 8 9 private: 10 int hour; // 0 - 23 (24-hour clock format) 11 int minute; // 0 - 59 12 int second; // 0 - 59 13 14 }; // end class Time

  29. 1 2 // Declaration of class Time. 3 // Member functions are defined in time1.cpp 4 5 // prevent multiple inclusions of header file 6 #ifndefTIME1_H 7 #defineTIME1_H 8 9 // Time abstract data type definition 10 class Time { 11 12 public: 13 Time(); // constructor 14 void setTime( int, int, int ); // set hour, minute, second 15 void printUniversal(); // print universal-time format 16 void printStandard(); // print standard-time format 17 18 private: 19 int hour; // 0 - 23 (24-hour clock format) 20 int minute; // 0 - 59 21 int second; // 0 - 59 22 23 }; // end class Time 24 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 imeTIME1_H. Naming convention: ime header fajla sa underscore.

  30. 1 2 // 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.h 13 #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 constructor 22 Uključivanje header fajlatime1.h. Ime header fajla u duplim navodnicima; uglasti navodnici se koriste za header fajlove iz C++ Standard Library.

  31. 23 // Set new Time value using universal time. Perform validity 24 // 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 setTime 32 33 // print Time in universal format 34 void Time::printUniversal() 35 { 36 cout << setfill( '0' ) << setw( 2 ) << hour << ":" 37 << setw( 2 ) << minute << ":" 38 << setw( 2 ) << second; 39 40 } // end function printUniversal 41

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

  33. Objekti klasnih tipova • 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++)

  34. Definisanje objekata • 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

  35. Rad sa objektima • 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

  36. Rad sa objektima • 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++)

  37. Metode klasa • 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#)

  38. Definisanje metoda van klase (C++) • 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

  39. Inline funkcije (C++) • 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; }

  40. Definicija klaseTime. Primjer: C++ 3 #include <iostream> 5 usingstd::cout; 6 usingstd::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 • voidprintStandard(); // 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

  41. Constructor inicijalizujeprivatepodatak na 0. public member function proverava vrednost parametara pre setovanja privatepodataka. 29 // Time constructor initializes each data member to zero and 30 // 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 validity 38 // 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

  42. Nema argumenata. Deklaracija promenljive t kao objekta klase Time. 47 // print Time in universal format 48 void Time::printUniversal() 49 { 50 cout << setfill( '0' ) << setw( 2 ) << hour << ":" 51 << setw( 2 ) << minute << ":" 52 << setw( 2 ) << second; 53 54 } // end function printUniversal 55 56 // print Time in standard format 57 void Time::printStandard() 58 { 59 cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) 60 << ":" << setfill( '0' ) << setw( 2 ) << minute 61 << ":" << setw( 2 ) << second 62 << ( hour < 12 ? " AM" : " PM" ); 63 64 } // end function printStandard 65 66 int main() 67 { 68 Time t; // instantiate object t of class Time 69

  43. 70 // output Time object t's initial values 71 cout << "The initial universal time is "; 72 t.printUniversal(); // 00:00:00 73 74 cout << "\nThe initial standard time is "; 75 t.printStandard(); // 12:00:00 AM 76 77 t.setTime( 13, 27, 6 ); // change time 78 79 // output Time object t's new values 80 cout << "\n\nUniversal time after setTime is "; 81 t.printUniversal(); // 13:27:06 82 83 cout << "\nStandard time after setTime is "; 84 t.printStandard(); // 1:27:06 PM 85 86 t.setTime( 99, 99, 99 ); // attempt invalid settings 87 88 // output t's values after specifying invalid values 89 cout << "\n\nAfter attempting invalid settings:" 90 << "\nUniversal time: "; 91 t.printUniversal(); // 00:00:00 92 poziv public metode Postavljanje vrednosti člana klase korišćenjem publicfunckije članice. Pokušaj postavljanja vrednosti člana klase na nevalidnu vrednost korišćenjem publicfunkcije članice.

  44. Podatak postavljen na 0nakon pokušaja postavljanja nevalidne vrednosti. 93 cout << "\nStandard time: "; 94 t.printStandard(); // 12:00:00 AM 95 cout << endl; 96 97 return0; 98 99 } // end main The initial universal time is 00:00:00 The initial standard time is 12:00:00 AM Universal time after setTime is 13:27:06 Standard time after setTime is 1:27:06 PM After attempting invalid settings: Universal time: 00:00:00 Standard time: 12:00:00 AM

  45. Primjer: C# class BankAccount {public void Withdraw(decimal amount) { ... } public void Deposit(decimal amount) { ... } private decimal balance; private string name; }

  46. 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); } } now hour minute yours new BankAccount object ... ...

  47. Operator this • Operator this odnosi se na objekat koji se koristi za pristup članu class BankAccount { ... public void SetName(string name) {this.name = name; } private string name; }

  48. Konstruktori • 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)

  49. Stvaranje objekata • 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

  50. Klase sa konstruktorima • 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

More Related