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.