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;