09 - Objektno orijentisano programiranje

Osnovni principi OOP

  • Enkapsulacija
    • podaci i funkcije/procedure za rad sa tim podacima
    • novi tip podataka – klasa
    • ograničavanje pristupa
  • Nasleđivanje
    • hijerarhija klasa
  • Polimorfizam
    • isti metod deluje na sve klase u hijerarhiji, ali različito

Klase – osnovni pojmovi

  • Klasa
    • podaci različitih tipova
    • funkcije/procedure za rad sa tim podacima
    • rezervisana reč – class
    • naziv tipa počinje slovom T
  • Podaci
    • polja
  • Funkcije / procedure
    • metode

Opis klasnog tipa

type
  TImeKlase=class
                     PoljaPodataka;
                     ZaglavljaMetoda;
                   end;
  • Potpuni opisi metoda dođu kasnije.
type
  TTacka=class
                x,y:real; {polje podataka klase}
                {metode klase}
                procedure Postavi(PosX,PosY:real);
                procedure Translacija(dx,dy:real);
                procedure Simetrija;
                procedure Rotacija(a:real);
                procedure Zaglavlje;
                procedure Pozicija;
                procedure Izvestaj;
              end;

Tačka – primer programa

program TackaTest;

type
  TTacka=class
           x,y:real; {polje podataka klase}
           {metode klase}
           procedure Postavi(PosX,PosY:real);
           procedure Translacija(dx,dy:real);
           procedure Simetrija;
           procedure Rotacija(a:real);
           procedure Zaglavlje;
           procedure Pozicija;
           procedure Izvestaj;
         end;

procedure TTacka.Postavi(PosX,PosY:real);
begin
  x:=PosX;
  y:=PosY;
end;

procedure TTacka.Translacija(dx,dy:real);
begin
  x:=x+dx;
  y:=y+dy;
end;

procedure TTacka.Simetrija;
begin
  x:=-x;
  y:=-y;
end;

procedure TTacka.Rotacija(a:real);
var
  xr,yr:real;
begin
  xr:=x*cos(a)-y*sin(a);
  yr:=y*cos(a)+x*sin(a);
  x:=xr;
  y:=yr;
end;

procedure TTacka.Zaglavlje;
begin
  writeln('Tacka se nalazi na poziciji:');
end;

procedure TTacka.Pozicija;
begin
  Writeln('x=',x:10:2,' y=',y:10:2);
end;

procedure TTacka.Izvestaj;
begin
  Zaglavlje;
  Pozicija;
end;

procedure TestObjekt(Obj:TTacka;StartX,StartY,dx,dy,Ugao:real);
var
  ch:char;
begin
  Obj.Postavi(StartX,StartY);
  writeln('Kontrolisi kretanje objekta sa pozicije: ',StartX:0:2,',',StartY:0:2);
  writeln('Pritisni T - translaciju za: ',dx:0:2,',',dy:0:2);
  writeln('   S - simetriju');
  writeln('   R - rotaciju za: ',Ugao:0:2);
  writeln('   K - kraj');
  repeat
    with Obj do
      begin
        readln(ch);
        if upcase(ch) in ['T','R','S'] then begin
          case upcase(ch) of
            'T':Translacija(dx,dy);
            'R':Rotacija(Ugao);
            'S':Simetrija
          end;
          Izvestaj;
        end;
      end;
  until Upcase(ch)='K';
end;

var
  Tacka:TTacka;                                // primerak klase, objekt

begin
  Tacka:=TTacka.Create;                   // dodeljivanje memorije
  TestObjekt(Tacka,0,0,10,10,Pi/2);
  Tacka.Free;                                    // oslobađanje memorije
end.

Rad sa objektom

  • Tacka.Postavi(5,5);
  • Tacka.Izvestaj;
  • Tacka.Simetrija;
  • Tacka.Izvestaj;
  • with Tacka do begin
      Rotacija(Pi/2);
      Izvestaj;
    end;
  • Tacka.x:=20; !!!

Napomene

  • Opis tipa class samo u type sekciji glavnog programa
  • Ne mogu lokalne klase u funkcijama/procedurama
  • U opisu klase podaci moraju biti ispred zaglavlja metoda
  • Ne mogu se kombinovati klase i datoteke

Parametar Self

  • Domen polja/podataka objekta pokriva sve metode tog objekta
  • Formalni argument metode ne može imati isto ime kao polje objekta
  • Da bi se rešio konflikt imena koristi se parametar Self
    • Self.imepoljaobjekta

Nasleđivanje i preklapanje

  • Definiše se nova klasa koja je potomak postojeće
  • Nova klasa raspolaže svim poljima i metodama roditeljske klase
  • Klasa može biti predak proizvoljnom broju klasa potomaka
  • Klasa može naslediti samo jednu klasu pretka
type
  TImeKlaseNaslednika=class(TImeKlasePretka)
                                    NovaPoljaKlaseNaslednika;
                                    NoveMetodeKlaseNaslednika;
                                  end;
type
  TKrug=class(TTacka)
              r:real; 
              procedure Postavi(PosX,PosY,AR:real);
              procedure Zaglavlje;
              procedure Izvestaj;
	end;
procedure TKrug.Postavi(PosX,PosY,AR:real);
begin
  x:=PosX;
  y:=PosY;
  r:=AR;
end;
procedure TKrug.Zaglavlje;
begin
  writeln('Centar kruga poluprecnika:',r:10:2,' se nalazi na poziciji:');
end;
procedure TKrug.Izvestaj;
begin
  Zaglavlje;
  Pozicija;
end;
  • Preklapanje je definisanje novog metoda u klasi potomku sa starim imenom iz roditeljske klase
  • Novi metod može imati različite argumente od istoimenog metoda iz roditeljske klase
  • Novi metod može koristiti istoimeni nasleđeni metod navođenjem ključne reči inherited
procedure TKrug.Postavi(PosX,PosY,AR:real);
begin
  inherited Postavi(PosX,PosY;)
  r:=AR;
end;

Statičke metode i statičko (rano) povezivanje

  • Metode koje se povezuju u toku kompilacije
    • Kompajler utvrđuje tip objekta koji poziva metod
    • Ako metod postoji u tom tipu on ga poziva
    • Ako ne postoji gleda roditelja i ako ga tu nađe poziva ga
    • Ako ne postoji kod roditelja gleda kod njegovog roditelja...
    • Ako metod ne postoji ni u tipu koji nema roditelja onda javlja grešku

Dodeljivanje klasa

  • Promenljive klasnog tipa mogu dobiti vrednost istog tipa ili nekog iz njega izvedenog tipa
  • Predak <- Potomak

Virtuelne metode i dinamičko (kasno) povezivanje

  • Koriste se virtuelne ili dinamičke metode
  • U zaglavlju klase iza metode se navodi virtual ili dynamic
    • procedure ImeMetode(argumenti);virtual;
  • Ako je neki metod opisan kao virtuelni kod svih potomaka njegove klase iza istoimenog metoda mora da ima navedeno override
  • Svi potomci moraju da imaju iste nazive, tipove i redosled formalnih argumenata, a ako je funkcija i isti tip rezultata

Konstruktori i destruktori

  • Konstruktor je metod koji se koristi za kreiranje objekta
  • Definiše se korišćenjem rezervisane reči constructor
    • constructor Postavi(PosX,PosY:real);
  • Konstruktor kao funkcija koja vraća pokazivač na novi objekt
    • Tacka:=TTacka.Postavi(5,5);
  • Konstruktor kao procedura
    • Tacka.Postavi(5,5);
  • Konstruktor se može kreirati i bez naredbi u telu
  • Destruktor je metod koji se koristi da bi se oslobodila zauzeta memorija kada su polja objekta dinamička
  • Definiše se korišćenjem rezervisane reči destructor
  • Uobičajeno ime za destruktor je Destroy
  • Podrazumevani destruktor je Free iz TObject
    • Tacka.Free

Pristup članovima klase

  • Nivoi zaštite pristupa:
    • public (javni) – vide se iz svih modula
    • private (privatni) – vide se iz klase i iz klasa u istom modulu
    • protected (zaštićeni) – vide se iz klase i iz njenih potklasa
    • published (publikovani) – početne vrednosti mogu da im se postave u Object Inspector-u u Delphi-ju
  • Uobičajeno je da su polja privatna, a metode javne
Vi ste ovde: Home Predavanja Treća godina Informatički smer - Programski jezici 09 - Objektno orijentisano programiranje