Potomok triedy Kor

! 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:
procedure MyKor.Dopredu(d:integer);
var p,i:integer;
begin
  p:=trunc(d/5); // zistíme, koľkokrát budeme rovnostranný trojuholník kresliť
  for i:=1 to p do
    begin
      Vpravo(60);
      Dopredu(5);
      Vlavo(120);
      Dopredu(5);
      Vpravo(60);
    end;
end;

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.
 



Súbor vznikol na základe prednášok Andreja Blaha