17. príklady


Posledná zmena: 26.11.2002

Banner Text 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