Hallo Luckie,
schön, dass Du Dir die Mühe machen willst. Vielleicht kannst Du bei der Gelegenheit auch gleich den Begriff der abstrakten Klasse einführen? Oft wird die Eleganz von Lösungen dieser Art verkannt, obgleich mit ihnen etwas verwirrende Zuweisungen der Art
Delphi-Quellcode:
var
myParent: TParent;
begin
myParent:= TChild.Create;
vermieden werden können...
Ich dachte an eine Klassifizierungslösung (ala Aristoteles), also eine Form der Spezialisierung, wobei ich aus Vereinfachungsgründen die Spezialisierung selbst (zB in Form neuer Operationen) nur geringfügig (Im Fall der Zitrusfrucht) beachte:
Delphi-Quellcode:
type
TFruit = class //pure abstract class
public
function GetTaste: string; virtual; abstract;
end;
TCitrusFruit = class(TFruit) //pure abstract class introduces new ops
public
procedure Squeeze; virtual; abstract;
end;
TLemon = class(TCitrusFruit) // same taste as citrus fruit
public
function GetTaste: string; override; // acerbic
procedure Squeeze; override;
end;
TGrapefruit(TCitrusFruit) = class
public
function GetTaste: string; override; // disgustful ;)
procedure Squeeze; override;
end;
TBanana(TFruit) = class
public
function GetTaste: string; override; // sugary
end;
Mit einer Hierarchie dieser Art ist die Verwendung etwas "natürlicher"
Delphi-Quellcode:
type
myFruit: TFruit;
begin
myFruit:= TBanana.Create;
myFruit.GetTaste;
und lässt ebenfalls "natürliche" Casts etc zu
Delphi-Quellcode:
if myFruit is TCitrusFruit then
with myFruit as TCitrusFruit do
Squeeze;
Edit: Vorfahren der Klassen angegeben