Objektno orijentisano programiranje (OOP) predstavlja način programiranja pri čemu se definišu objekti koji poprimaju osobine objekata iz realnog svijeta. Nastao na ovom konceptu, OOP s jedne strane proširuje funkcionalnosti osnovnih i izvedenih tipova na način da implementaciju enkapsulira (ugrađuje) u sami tip, dok s druge strane uvodi nove osobine tipova poput nasljeđivanja i polimorfizma koji daju nove funkcionalnosti i način implementacije. Sve tri paradigme OOP (enkapsulacija, nasljeđivanje i polimorfizam) čine objektno orjentisano programiranje efikasnije, lakše za kolaboraciju i održavanje te u većem dijelu rješava probleme proceduralnog programiranja.
Klase
Tipovi podataka u čistom OO jeziku poput C# označavaju se klasama, koje se mogu podijeliti na osnovne i izvedene tipove. Programski jezik poput C++, osnovne tipove ne tretira kao klase, dok klasama označava samo izvedene odnosno apstraktne tipove. Osnovne tipove poput integer, double, float, bool, char u čisto OOP jeziku zovemo klasama jer u sebi enkapsuliraju metode koje nam omogućuju rad nad samim tipovima, na isti način kako to radimo i sa izvedenim tipovima. Izvedeni tipovi su svi tipovi koji su definisani od strane programera.
U čistom objektno orijentisanom programskom jeziku ne postoji mogućnost izvršavanja koda koji nije dio neke klase, odnosno koji nije definisan unutar određene metode kao članice klase. S druge strane ovo implicira da se u objektno orijentisanom programiranju može izvršiti samo onaj kod koji je definisan unutar određene klase, odnosno instanciranjem objekta i poziva neke metode članice. Ovom činjenicom se shvata naziv objektno orijentisano programiranje, kao programirnje objekata.
Naravno, programski jezici nužno ne poštuju ovu strogu činjenicu, a pored toga imaju mogućnost izvršavanja koda izvan objekata klase. Kako je ranije naglađeno programski jezik koji ima ovakvu dualnu osobinu jeste C++. C++ programski jezik je objektno orijentisani jezik koji podržava sve osobine OO koncepta, dok istovremeno predstavlja klasični proceduralno orjentisani jezik. Zbog te činjenice danas C++ jezik predstavlja najrasprostranjeniji i najviše korišten programski jezik. Pogodan je kako za programiranje sistemskih komponenti operativnih sistema i drivera za uređaje, tako i za projekte zasnovane na poslovnoj logici. Deklaracija klase u C++ sa pripadajućim članovima možemo predstaviti u obliku prijera tipa Osoba.
class Osoba { //konstruktori/destruktor klase public: Osoba(); ~Osoba(); //clanovi klase /atributi private: string imePrezime; time_t datumRodjenja; string mjestoRodjenja; //javne metode clanica public: void Init (string ime, string datum); //javne virtualne metode clanice public: virtual string Status(); };
Prethodni listing predstavlja deklaraciju klase Osoba. Implementacija klase u smislu implementacije konstruktora, destruktora i metoda Init i Status nalazi se izvan tijela klase, a često u posebnoj cpp datoteci. Primjer implementacije klase Osoba vidimo na sljedećem listingu.
//defoltni konstruktor Osoba::Osoba() { imePrezime = "n/a"; } //destruktor klase Osoba::~Osoba() { } //virtuelna metoda koja vraca status osobe string Osoba::Status() { return "Osoba"; } //postavljanje imena i datuma rodjenja osobe void Osoba::Init(string ime, string datum) { imePrezime = ime; //konverzija string u datum struct tm tm = {0}; strptime(datum.c_str(), "%d/%m/%Y", &tm); datumRodjenja = mktime(&tm); }
Prethodni listing čini implementacija kontsruktora koji se poziva prilikom formiranja objekta Osoba, dok se implementacija dstruktora nalazi odmah iza. Metoda Init postavlja ime i datum rođenja za osobu, dok metoda Status vraća string sa nazivom vrste osobe.
C# i Java predstavljaju najpopularnije OO programske jezike pored C++, u kojima sve počinje sa objektima, i nije dozvoljeno definisanje metode izvan klasa. Specijalna metoda koja označava ulaznu ili početnu tačku zove se main metoda. Ovu metodu je dovoljno definisati u bilo kojoj klasi, a kompajler će je prepoznati kao početnu metodu i označiti je kao ulaznu tačku programa. Primjer listing 1 i 2 u C# izgledaju na slijedeći način:
public class Osoba { //konstruktori/destruktor klase public Osoba() { imePrezime = "n/a"; } ~Osoba() { } //clanovi klase /atributi private string imePrezime; private DateTime datumRodjenja; private string mjestoRodjenja; //javne metode public void Init(string ime, string datum) { imePrezime = ime; DateTime dat; if(DateTime.TryParse(datum, out dat)) datumRodjenja= dat; } //javne virtualne metode clanice public virtual string Status() { return "Osoba"; } };
Iz prethodnih listinga možemo vidjeti određenu razliku u deklarisanju i implementaciji klase i njenih članova. U C++ vidimo da je deklaracija i implementacija metoda članica klase razdvojena. Za razliku od C++ u C# deklaracija i implementacija klase u C# se ne razdvajaju, tako da se svaka metoda članica deklariše i implementira na jednom mjestu.