|
Začnime novú aplikáciu a otvorme si do nej súbor z minulej aktivity File --> Open -- odtiaľ budeme kopírovať a porovnávať jednotlivé metódy.
Do časti uses doplňte jednotku KorUnit.
V našej novej aktivite zadefinujme triedu MyKor, ktorá má navyše len metódu Stvorec -- z minulej aktivity.
Ďalej zadefinujme dve nové triedy -- potomkov triedy MyKor:
! Skopírujte definície tiel procedúr z minulej aktivity.
Do formuláru dajte Image a Button. Pri vytváraní formuláru inicializujte túto plochu.
Na stlačenie Buttonu vytvorte dve korytnačky, kC typu KorCikCak, a kB ako inštanciu triedy KorBodkov. Nech obe na stlačenie tohto tlačidla nakreslia štvorec.
Očakávame, že inštancia triedy KorCikCak nakreslí cikcakový štvorec a inštancia triedy KorBodkov ho nakreslí bodkovaný. Ako to je naozaj? Obe zatiaľ nakreslili štvorec pomocou štandardnej metódy Dopredu.
Prečo?
Statické metódy
ak zavoláme kC.stvorec, ten zistí, že nemá metódu Stvorec a musí volať metódu predka, ten ju má takže sa začne vykonávať, lenže pri vyvolaní sa nezistí, že metóda bola vyvolaná potomkom, ktorý má predefinované Dopredu:
MyKor.Stvorec
----> Kor.Dopredu
^
|
KorCikCak.Stvorec
KorCikCak.Dopredu
Virtuálne metódy
potrebovali by sme, aby KorCikCak "pochopil",
že bol zavolaný z potomka a teda nebude volať Kor.Dopredu, ale
potomkovu metódu Dopredu:
MyKor.Stvorec ----> Kor.Dopredu
// virtuálna
^
\
|
\
KorCikCak.Stvorec
KorCikCak.Dopredu // virtuálna
Polymorfizmus
metóda sa zdiela v rôznych stupňoch objektovej
hierarchie ->
napr. ak rôzne
triedy zdedia "spoločnú" metódu (napr. metódu Stvorec), detaily
pre rôzne objekty zodpovedajú
ich zvláštnostiam
(napr. metóda Dopredu)
Včasná a neskorá väzba
Virtuálne metódy
constructor Create;
// ľubovoľné meno - môže mať aj parametre
destructor Destroy; override;
// v TObject je Destroy virtual
Spôsob (metóda) návrhu hierarchie objektov
! Vyskúšajte projekt -- mali by sa nakresliť 2 štvorce, jeden bodkovaný, druhý cikcakový, tak ako sme si to predstavovali.
Chceme vytvoriť niekoľko objektov-grafických pier, z ktorých niektoré
nakreslia bodkované a iné cikcakové štvorce.
Kompatibilita tried (objektových typov)
kompatibilita je jednosmerná => odvodený typ dedí kompatibilitu so svojimi
predkami (kompatibilita s predkami nie
potomkami)
medzi inštanciami
medzi formálnymi a skutočnými parametrami
Vďaka tejto kompatibilite si môžeme vytvoriť pole korytnačiek a vytvárať
raz inštancie triedy KorCikCak a inokedy KorBodkov. a tie
nakreslia štvorec -- vďaka predefinovaniu svojej metódy Dopredu bude niekedy
bodkovaný, inokedy cikcakový:
procedure TForm1.Button2Click(Sender: TObject);
var k:array[1..10] of MyKor; i:integer; begin for i:=1 to 10 do begin if random(2)=0 then k[i]:=KorCikCak.Create(-100+random(200),-100+random(200),random(360)) else k[i]:=KorBodkov.Create(-100+random(200),-100+random(100),random(360)); k[i].stvorec(20+random(50)); end; end; |