|
! Pokračujme v predchádzajúcom projekte. Zatiaľ sme zadefinovali triedu MyKor, potomka triedy Kor a jednu jeho novú metódu Stvorec.
Aj niektorý z ostatných obrázkov, ktoré sme predtým kreslili pre jednu korytnačku, zadefinujte ako metódy triedy MyKor.
! Vyskúšajte funkčnosť projektu a oboma korytnačkami nakreslite touto metódou vybraný obrázok.
Ďalšie metódy
! Pokračujme v tomto projekte -- zadefinujme nové metódy triedy MyKor:
Bodkovano, ktorá namiesto toho, aby sa čiara nakreslila súvislá, nakreslí ju bodkovano, napr. tak, že sa nakreslí iba každá tretia bodka z nej. Použitím tejto metódy nadefinujte na komponent Button kreslenie štvorca.
CikCak, ktorá namiesto toho, aby sa čiara kreslila rovno, úsek
veľkosti napr. 5 bodiek nakreslí ako dve strany rovnostranného trojuholníka.
Nakreslite napr. kružnicu
! Vymyslite ešte nejakú náhradu kreslenia celej čiary a naprogramujte to ako novú metódu našej triedty MyKor. Napr. namiesto trojuholníkov kreslite štvorčeky, bodkočiarky...
Prekrývanie metód predka
Čo keby sme chceli, aby grafické pero používalo namiesto štandardného príkazu Dopredu, ktorý je naprogramovaný v UnitKor, niektorý náš príkaz, t.j. vždy, keď sa bude vykonávať príkaz Dopredu, vykoná sa ten náš. Takýto efekt sa dá objektoch dosiahnuť tým, že pôvodný príkaz predka, teda triedy Kor, predefinujeme príkazom rovnakého meno v našej definícii potomka -- to sa dá iba ak je to v samotnej definícii predka dovolené slovíčkom virtual v deklaráciách danej metódy (presvedčte sa, že v KorUnit.pas to tak je pri deklaráciách metódy Dopredu)
! Niektorý z doteraz navrhnutých metód, napr. CikCak, premenujme na Dopredu. Pozrime si teraz samotnú definíciu príkazu a pouvažujme nad použitými príkazmi:
|
Vidíme, že v samotnej definícii príkazu Dopredu používame znovu jej volanie -- to je rekurzívne volanie, lenže to sme nechceli! Predým, kým sa táto metóda nevolala Dopredu, ale CikCak sme mysleli na to, že použijeme štandarný príkaz z pôvodnej triedy Kor. Ak to však chceme zapísať teraz, musíme pred takýto príkaz zapísať slovíčko inherited t.j. vnútro for cyklu potom bude:
...
for i:=1 to p do begin Vpravo(60); inherited Dopredu(5); Vlavo(120); inherited Dopredu(5); Vpravo(60); end; ... |
! Vyskúšajte teraz použiť metódu Stvorec.
Keďže sa v tejto metóde volá metóda Dopredu, zrejme sa nakreslí:
! Vyskúšajte aj tlačidlo, ktoré kreslilo obrázok bodkovano. Ako sa obrázok nakreslil teraz? Prečo?
Obrázok sa zrejme vôbec
nenakreslil, lebo pri vyvolaní príkazu Dopredu(1), t.j. nakresli
1 bodku, sa použil príkaz Dopredu z triedy MyKor, ktorý sa
snaží namiesto jednej bodky nakresliť dve strany rovnostranného trojuholníka
veľkosti 5, lenže po výpočte vyjde, že takýto trojuholník vôbec netreba
kresliť (príkaz je trochu nedokonalý)...
Nastáva znovu problém, že v príkaze sme chceli zrejme využiť pôvodnú
metódu Dopredu triedy Kor. Opravte teda pomocou príkazu inherited
aj metódu Bodkovano.