Zur Themenübersicht     

Vererbung in Delphi

Nach dem Grundsatz, dass jede Klasse in einer eigenen Unit unterzubringen ist, schreiben wir eine eignene Unit UBuntturtle :

Die Vorgängerklasse TTurtle ist in der
Unit UTurtle deklariert worden. Deswegen 
muss die Unit UTurtle in der uses-Liste
aufgeführt werden.
unit UBuntTurtle;
interface
uses
  Graphics, UTurtle;
Auf die zusätzliche Eigenschaft h_farbe 
  soll nur von Nachfolgeklassen von
  TBuntTurtle zugegriffen werden können.

Die Methoden setzeFarbe und liesFarbe 
  werden wie üblich bekannt gegeben.
Die Methode vorwaerts muss aber neu defi-
  niert (eben überschrieben) werden. Daher 
  der Zusatz override am Ende der Bekannt-
  gabe im implementation-Teil.
Dies ist allerdings nur möglich, wenn in 
  der Vorgängerklasse die Methode den
  Zusatz virtual(=überschreibbar) erhalten
  hat. (Siehe unten)   
type
  TBuntTurtle = class(TTurtle)
  protected
    h_farbe : TColor;
  public
    procedure setzeFarbe (neueFarbe : TColor);
    procedure vorwaerts (length:Real); override;
    function liesFarbe : TColor;
  end;
Die Methoden setzeFarbe und liesFarbe 
  werden wie üblich deklariert.

implementation

procedure TBuntTurtle.setzeFarbe(neueFarbe:TColor);
begin
   h_farbe := neueFarbe
end;

function TBuntTurtle.liesFarbe:TColor;
begin
   result := h_farbe
end;
Hier darf der Zusatz override nicht mehr
  stehen.

Nachdem die Stiftfarbe festgelegt wurde, 
  soll eine Buntturtle den vorwaerts Befehl
  der Vorgängerklasse benutzen. Dies 
  kennzeichnen wir durch den Vorsatz
  inherited (Deutsch: geerbt).
Beachte, dass eine BuntTurtle hier auf die
  Eigenschaft k_Leinwand der Turtle 
  zugreift.   
procedure TBuntTurtle.vorwaerts(length:Real);
var alteFarbe : TColor;
begin
   alteFarbe := k_Leinwand.pen.color;
   k_Leinwand.pen.color := h_farbe;
   inherited vorwaerts(length);
   k_Leinwand.pen.color := alteFarbe;
end;

end.(* of implementation *)

Die Vorgängerklasse

In der Vorgängerklasse müssen einige kleine Änderungen im Interface-Teil vorgenommen werden. Sie werden im Folgenden erläutert:





Die Eigenschaften sind nun als protected
  deklariert. Das heißt, dass Nachfolge-
  klassen (aber nur diese !) auf diese
  Eigenschaften zugreifen können. 

Die Schutzklasse protected ist in Delphi 
  extra für die Vererbung geschaffen 
  worden und sollte daher auch genutzt
  werden! 
unit UTurtle;

interface

uses
  Graphics;

type
  TTurtle = class(TObject)
  protected 
    h_xpos,h_ypos:Real;
    h_winkel:Real;
    h_gesenkt:Boolean;
    k_Leinwand:TCanvas;






Die Methode vorwaerts soll überschreibbar
  sein und wird daher mit dem Zusatz
  virtual versehen.
  public
    constructor createturtle(x_p,y_p,winkel_p : Real;
                             gesenkt_p : Boolean;
                             Leinwand_p : TCanvas);
    procedure links (winkel : Real);
    procedure rechts(winkel : Real);
    procedure hoch;
    procedure runter;
    procedure vorwaerts (length:Real); virtual;
  end;(* if type *)