Thema: Delphi virtual / override ??

Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#32

Re: virtual / override ??

  Alt 20. Aug 2004, 02:46
Lies bitte nochmal meinen Post Hansa - dort ging ich auf alle Deine Fragen ein.
Noch ein Beispiel für Override (Konstruktoren etc. weggelassen):
Delphi-Quellcode:
TMensch = Class(TObject)
  FGroesse : Integer;
  FGeburtstag : TDateTime;
  FAugenfarbe : TColor;
  FVorname : String;
  FName : String;
public
  procedure Assign(Value: TMensch); virtual; // nicht abstrakt, da echte Funktionalität
                                             // darin steckt
  property Groesse : Integer read FGroesse write FGroesse;
  property Geburtstag : TDateTime read FGeburtstag write FGeburtstag;
  property Augenfarbe : TColor read FAugenfarbe write FAugenfarbe;
  property Vorname : String read FVorname write FVorname;
  property Name : String read FName write FName;
end;

TFrau = class(TMensch)
FAnzahlSchuhe : LongInt; // :-)
FGeburtsName : String;
public
  procedure Assign(Value: TMensch); override; // damit wir die in TMensch erledigte
                                              // Arbeit hier wiederverwenden können
  property AnzahlSchuhe : LongInt read FAnzahlSchuhe write FAnzahlSchuhe;
  property GeburtsName : String read FGeburtsName write FGeburtsName;
end;

TMann = class(TMensch)
FAlimenteZahler : Boolean;
public
  procedure Assign(Value: TMensch); reintroduce; // kein "override" (!), löscht bzw. verdeckt
                                                 // die ererbte Methode. Um CompilerWarnung
                                                 // zu unterdrücken, Angabe von "reintroduce"
  property AlimenteZahler:Boolean read FAlimenteZahler write FAlimenteZahler;
end;

implementation

procedure TMensch.Assign(Value:TMensch);
begin
  FGroesse := Value.Groesse;
  FGeburtstag := Value.Geburtstag;
  FAugenfarbe := Value.Augenfarbe;
  FVorname := Value.Vorname;
  FName := Value.Name;
end;

procedure TFrau.Assign(Value: TMensch);
begin
  inherited Assign(Value); // Groesse etc. wird abgelegt
                           // geringer Aufwand hier, da Vorfahrklasse die Arbeit erledigt
  if (Value is TFrau) then begin
    FAnzahlSchuhe := TFrau(Value).AnzahlSchuhe;
  end else raise Exception.Create('Dieser Mensch ist keine Frau!');
end;

procedure TMann.Assign(Value: TMensch);
begin
  // wir können die ererbte Methode TMensch.Assign nicht aufrufen,
  // da die TMann.Assign-Methode diese verdeckt! Also müssen wir uns
  // hier erneut um den Kram kümmern:
  FGroesse := Value.Groesse;
  FGeburtstag := Value.Geburtstag;
  FAugenfarbe := Value.Augenfarbe;
  FVorname := Value.Vorname;
  FName := Value.Name;
  if (Value is TMann) then begin
    FAlimenteZahler := TMann(Value).AlimenteZahler;
  end else raise Exception.Create('Dieser Mensch ist kein Mann!');
end;
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat