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