| Posledná zmena: 26.11.2002

polymorfizmus

## Polymorfizmus

súkromná korytnačka:
Zadefinujte TMojaKor, ktorá bude obsahovať svoju súkromnú korytnačku. Táto sa bude pohybovať súčasne s pôvodnou, ale bude mať nastavené hrubé šedé pero (10). Treba si dávať pozor na PH a PD. |
    type
      TMojaKor = class(TKor)
      private
        kk:TKor;
      public
        constructor Create(xx,yy:real; uu:real=0);
        destructor Destroy; override;
        procedure ZmenXY(xx,yy:real); override;
      end;

    constructor TMojaKor.Create(xx,yy,uu:real);
    begin
      inherited;
      kk:=TKor.Create(xx,yy,uu);
      kk.HP:=10; kk.FP:=clLtGray;
    end;

    destructor TMojaKor.Destroy;
    begin
      kk.Free;
      inherited;
    end;

    procedure TMojaKor.ZmenXY(xx, yy: real);
    begin
      if Dole then kk.ZmenXY(xx,yy)
      else kk.PresunXY(xx,yy);
      inherited;
    end;
zistenie dĺžky cesty:
Korytnačka bude mať svoju súkromnú premennú, v ktorej si bude počítať prejdenú dĺžku. Najprv to vyriešte pomocou Dopredu a potom ZmenXY. Momentálne prejdená dĺžka bude prístupná pomocou property dlzka - umožní prístup len na čítanie Treba si dávať pozor na to, či je pero hore alebo dole. |
    type
      TMojaKor1 = class(TKor)    // alebo TMojaKor
      private
        dlz:real;  // netreba inicializova5 na 0
      public
        procedure Dopredu(d:real); override;     // buď
        procedure ZmenXY(xx,yy:real); override;  // alebo
        property dlzka:real read dlz;
      end;

    procedure TMojaKor1.Dopredu(d: real);
    begin
      inherited;
      if Dole then dlz:=dlz+d;
    end;

    /////////// alebo

    procedure TMojaKor1.ZmenXY(xx, yy: real);
    begin
      if Dole then dlz:=dlz+vzd(xx,yy);
      inherited;
    end;
použitie zisťovania dĺžky cesty:
Korytnačku zadefinujte pomocou premennej triedy TKor - aby bolo treba pretypovávať. |
    var
      k:TKor;
    begin
      k:=TMojaKor1.Create(200,400);
      ...
      Label1.Caption:=FloatToStr(TMojaKor1(k).dlzka);
      k.Free;
    end;

### Hierarchia korytnačiek

štvorlístok:
Trieda TKor0 má definovanú metódu stvorlistok na kreslenie štvorlístka veľkosti d - 4 rovnostranné trojuholníky. |
    type
      TKor0 = class(TKor)
        procedure stvorlistok(d:real);
      end;

    procedure TKor0.stvorlistok(d: real);
    var
      i:integer;
    begin
      for i:=1 to 12 do begin
        Dopredu(d);
        if i mod 3=0 then Vpravo(210)
        else Vpravo(120);
      end;
    end;
prerušované Dopredu:
Trieda TKor1 - potomok TKor0 - kreslí prerušované Dopredu - prejdená dĺžka sa rozdelí na tretiny a strednú prejde so zdvihnutým perom. |
    type
      TKor1 = class(TKor0)
        procedure Dopredu(d:real); override;
      end;

    procedure TKor1.Dopredu(d: real);
    var
      b:boolean;
    begin
      b:=Dole;
      inherited Dopredu(d/3);
      PH;
      inherited Dopredu(d/3);
      if b then PD;
      inherited Dopredu(d/3);
    end;
tieňované Dopredu:
    type
      TKor2 = class(TKor1)
        procedure Dopredu(d:real); override;
      end;

    procedure TKor2.Dopredu(d: real);
    var
      f:Tcolor;
    begin
      f:=FP; FP:=clLtGray; HP:=HP+3;
      inherited;  // Dopredu(d);
      inherited Dopredu(-d);
      FP:=f; HP:=HP-3;
      inherited;  // Dopredu(d);
    end;
použitie:
Po zatlačení tlačidla sa na náhodnom mieste s náhodným uhlom vygeneruje korytnačka - náhodne sa zvolí jedna z TKor0, TKor1 a TKor2. Potom táto korytnačka nakreslí náhodne veľký (20..40) štvorlístok. |
    procedure TForm1.Button1Click(Sender: TObject);
    var
      k:TKor;
      x,y,u:integer;
    begin
      randomize;
      x:=random(400); y:=random(400); u:=random(360);
      case random(3) of
        0: k:=TKor0.Create(x,y,u);
        1: k:=TKor1.Create(x,y,u);
        2: k:=TKor2.Create(x,y,u);
      end;
      k.FP:=clGreen;
      TKor0(k).stvorlistok(20+random(21));
      k.Free;
    end;

### Kreslenie korytnačkou

zrkadlová korytnačka:
Trieda TMojaKor1 bude preklápať súradnice tak, aby pohyb korytnačky bol symetrický podľa myslenej y-ovej osi prechádzajúcej stredom plochy. |
    type
      TMojaKor1 = class(TKor)
        procedure ZmenXY(xx,yy:real); override;
      end;

    procedure TMojaKor1.ZmenXY(xx, yy: real);
    begin
      inherited ZmenXY(sirka-xx,yy);
    end;
kreslenie rukou:
Časť programu využije TMojaKor1 a zabezpečí kreslenie dvomi korytnačkami (obyčajnou a zrkadlovou). Zamyslite sa prečo v Image1MousDown korytnačka k1 nemôže robiť PresunXY ako korytnačka k, ale musí použiť ZmenXY so zdvihnutým perom. |
    var
      k,k1:TKor;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      k:=TKor.Create;
      k1:=TMojaKor1.Create;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      k.Free; k1.Free;
    end;

    procedure TForm1.Image1MouseDown(...);
    begin
      k.PresunXY(X,Y);
      k1.PH; k1.ZmenXY(X,Y); k1.PD;
    end;

    procedure TForm1.Image1MouseMove(...);
    begin
      if Shift=[ssLeft] then begin
        k.ZmenXY(X,Y);
        k1.ZmenXY(X,Y);
      end;
    end;
ndú:
Doplňte riešenie o ďalšie dve zrkadlové korytnačky: podľa osi x a podľa oboch. |

© 2002 AB, KVI
blaho@fmph.uniba.sk