Polymorfizmus

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

     včasná väzba = early binding - pri statických
     neskorá väzba = late binding - pri virtuálnych

Virtuálne metódy

Konštruktory a deštruktory

     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



Podľa predchádzajúcich teoretických vedomostí doplníme zrejme slovíčko override k metódam Dopredu oboch objektov -- stačí k ich definícii.

! Vyskúšajte projekt -- mali by sa nakresliť 2 štvorce, jeden bodkovaný, druhý cikcakový, tak ako sme si to predstavovali.



Pole objektov

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;



Úloha
Triede MyKor zadefinujte metódu kreslenia rovnostranného trojuholníka a nakreslite niekoľko bodkovaných a cikcakovaných trojuholníkov.
 


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