Delphi – OOP detaljno

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

Pratite Krstaricu na www.krstarica.com