abgesehen von dem problem geht es auch noch eleganter, wenn man eine veralgemeinerung einführt:
Delphi-Quellcode:
type
TFigurBasis = class...// klasse von der die anderen alle abstammen!
public
Constructor Create(...); virtual; abstract;
end;
TFigurBasisClass = class of TFigurBasis; // meta klasse deklarieren
TRechtek = class(TFigurBasis)
Constructor Create(...); override;
end;
...
procedure TFigurenContainer.OpenFile(Filename: string);
{Figuren aus einer Datei auslesen und zeichnen}
var Dat: TFilestream;
Figur: TFigur;
Typ : TFigurTyp;
const
cClassReg:array[TFigur] of TFigurBasisClass =
(TStrecke, TRechteck, TEllips, TPoly);
begin
clear;
Dat := TFilestream.Create(Filename, fmOpenRead);
while dat.Position < (dat.Size) do begin
Dat.Read(Typ, sizeof(TFigurTyp));
// und hier der trick !!!
// Aus der dem typ, über die classReg, die metaKlasse holen
// und mit ihr das objekt instanzieren
figur := cClassReg[typ].Create(zeichenfläche);
Figur.SetFTyp(typ);
Figur.ReadObject(dat);
If Typ<>Strecke then
TFlaechenfigur(Figur).SetRegion;
add(Figur);
end;
Dat.Free;
end;
MetaKlassen sind in delphi einfach nur praktisch
Und wichtig ist der virtuelle, bzw. abstrakte konstructor, damit die objekte vereinheitlicht erzeugt werden können.
mâxîmôv.
{KDT}