@jaenicke
Zitat:
Man muss zur Initialisierung ja keinen Konstruktor nehmen. Im Gegenteil, das hat z.B. den Nachteil, dass man die Intialisierungsdaten schon beim Erstellen des Objekts kennen muss.
Bei einfachen Datentypen ja. Aber was wenn der DatenTyp eine Klasse mit Objekt members ist, z.b.:
Delphi-Quellcode:
uses
Classes, UDataTypes;
type
TPerson=class(TInterfacedObject, IDataIO)
private
FName : TStringClass;
FAge : TIntegerClass;
function GetAge: TIntegerClass;
function GetName: TStringClass;
function GetVString: string;
public
constructor Create;reintroduce;
destructor Destroy;reintroduce;
procedure LoadFromStream(AStream: TFileStream);
procedure SaveToStream(AStream: TFileStream);
property Name : TStringClass read GetName;
property Age : TIntegerClass read GetAge;
property VString : string read GetVString;
end;
{ TPerson }
constructor TPerson.Create;
begin
inherited;
FName := TStringClass.Create;
FAge := TIntegerClass.Create;
end;
destructor TPerson.Destroy;
begin
FName.Free;
FAge.Free;
inherited;
end;
Hier waere es schon gut wenn der Konstruktor laeuft und FName uund FAge erzeugt werden.
Wenn ich jetzt noch nach aehnlichem Muster THund, TKatze, TMaus erstelle und eine generische Objektliste haben will mit einer AddElement() Methode die ein Objekt dieses Typs erzeugt, zur Liste hinzufuegt und zurueckgibt:
Delphi-Quellcode:
type
TMyObjectList<TObjType:class,constructor,IDataIO> = class(TObjectList<TObjType>)
private
public
function AddNewElement : TObjType;
end;
TPersonList = TMyObjectList<TPerson>;
{ TMyObjectList<TObjType> }
function TMyObjectList<TObjType>.AddNewElement: TObjType;
begin
Result := TObjType.Create;
Add(Result);
end;
Neue Listenelemente werden (so ist es gedacht) immer nur von der Liste erzeugt. Es ist nicht vorgesehen das ein TPerson erzeugt wird und dann er Klasse zugewiesen wird (normale Add() Methode).
Deswegen meine Frage nache dem Verhalten des Konstruktors. In der Doku hatte ich naemlich gelesen das der 'constructor' constraint nur den parameterlosen Create() Konstruktor von TObject bereitstellt....