Tehnika Krstarice > Programiranje > Delphi - OOP detaljno

Delphi - OOP detaljno

18.10.2000.

Objekti mogu da nasleđuju metode od svojih objekata-roditelja. Ali šta se dešava ako vi želite da promenite ponašanje jednog objekta? Na primer, recimo pišete novi program koji radi sa grafikom i imate sledeće objekte:

  TNekiObjekt = Object
    // ...
    procedure crtaj;
  end;
 
  TKvadrat = Object(TNekiObjekt)
    // ...
    procedure crtaj;
  end;

  TKrug = Object(TNekiObjekt)
    // ...
    procedure crtaj;
  end;

Objekti TKvadrat i TKrug su naslednici objekta TNekiObjekt koji olakšavaju crtanje vaše grafike. Možete pozvati proceduru ANekiObjekt.Crtaj bez znanja o tome da li je to TKvadrat ili TKrug. Svejedno, nikada nećete pozvati metod "crtaj" objekta NekiObjekt - šta on crta?

Sve dok se pretpostavlja da metod ANekiObjekt.Crtaj neće biti pozvan, deklarisaćete ga kao abstract metod. Kada je abstract metod pozvan u programu postoji izuzetak. Ovim će te saznati da je poziv ovog metoda besmislen. Sama funkcionalnost "Crtaj" metoda je jedino implementirana u objektima naslednicima. Oni "znaju" kako izgledaju i šta treba da nacrtaju na ekranu.

Kako Delphi zna koji ste metod pozvali kada navedete ANekiObjekt.Crtaj (a ANekiObjekt je TKvadrat)? Odgovor leži u upotrebi deklaracije virtual. Jednostavno koristite ovu ključnu reč (virtual) iza deklaracije metoda. Da biste rekli Delphi-ju da "prepiše" metod u objektu nasledniku koristite ključnu reč override. Sada će naši objekti izgledati ovako:

TNekiObjekt = Object
    // ...
    procedure crtaj; virtual; abstract;
  end;
 
  TKvadrat = Object(TnekiObjekt)
    // ...
    procedure crtaj; override;
  end;

  TKrug = Object(TNekiObjekt)
    // ...
    procedure crtaj; override;
  end; 

Kako će Delphi uzeti u obzir pravi metod u runtime-u? Odgovor leži u VMT (Virtual Method Table) - virtuelnoj tabeli metoda. Kao što se i iz imena vidi, to je tabela sa svim virtuelnim metodama objekta. Svaki put kada imate nasleđivanje kreira se kopija VMT. Kada pozovete virtuelni metod, Delphi će pogledati u VMT i automatski će biti implementiran pravi, korektan metod.

Dynamic metode su slične virtuelnim. Razlika je u tome što DMT (Dynamic Method Table) tabela se ne kopira potpuno svaki put kada nasleđujete objekte. Kada je pozvan Dynamic metod, prvo se gleda u DMT samog objekta. Ako se ne pronađe traži se dalje u objektima-roditeljima. Na ovaj način se štedi memorija, jer nije potrebno kopirati celu VMT svaki put kod nasleđivanja. Korišćenje Dynamic metoda ima smisla samo u specijalnim slučajevima (objekti sa puno dynamic/virtual metoda ili kada imate puno koraka nasleđivanja).

Preporučite ovaj članak

Članak još uvek nije ocenjen.