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