Du könntest "Inhalt" in TSnack deklarieren und so belassen. In den abgeleiteten Klassen könntest Du dann dessen Items (TFood) in TErdnuss casten und mit dem Cast weiter artbeiten. Allerdings könntest Du dann auch einfach mit TObjectList statt mit generischen Listen arbeiten.
Klingt verlockend: Ich erstelle diese TArray<TFood>'s nur als TArray<TErdnuss> oder TArray<TZitrone>, nie als TArray<TFood>; ausserdem immer ueber TErdnussSnack oder TZitronenSnack. Ist es bei den Casts dennoch sichergestellt, dass die zusaetzlichen spezifischen Eigenschaften nie verloren gehen, solange ich Create nie ueber TFood laufen lasse?
Mhh, das verstehe ich jetzt nicht. Casten musst du eigentlich gar nicht, wenn du deine Klasse so deklarierst:
Delphi-Quellcode:
type
TFood = class
Breite: Integer;
end;
TZitrone = class(TFood)
Saeuerlichkeit: Double;
end;
TErdnuss = class(TFood)
Schale: Boolean;
Geschmack: string;
end;
TSnack<T: TFood> = class
private
FInhalt: TArray<T>;
public
GegessenVon: string;
property Inhalt: TArray<T> read FInhalt write FInhalt;
procedure NulleBreiten; // allg. gueltig fuer TZitrone und TErdnuss
end;
TZitronenSnack = class(TSnack<TZitrone>);
TErdnussSnack = class(TSnack<TErdnuss>);
Die beiden spezialisierten Klassen können jetzt jeweils nur entweder 0..n Zitronen oder 0..n Erdnüsse enthalten.
TMixedSnack = TSnack<TFood>
wäre weiterhin eine Möglichkeit, die beide Speisen enthalten kann.
Edit:
Achso du meinst vermutlich beim Erstellen. Wenn die Klasseninstanz konkret als z.B.
TZitrone.Create
erstellt wurde, hast du selbstverständlich weiterhin immer alle spezifischen Eigenschaften. Falls benötigt, könntest du auch den Constructor von
TFood
als
virtual
deklarieren. Das würde dir erlauben Objekte auch über die Meta-Klasse
TFoodClass = class of TFood
zu erzeugen.