@Rudy Velthuis
Zitat:
Das tust du ja gar nicht. Deine einzige typ-abhängige Methode wird für jeden Typ neu geschrieben
Hmm.. Das ist der Teil der nur einmal geschrieben ist:
Delphi-Quellcode:
{ TDataTypeGeneric<TDataType> }
function TDataTypeGeneric<TDataType>.GetData: TDataType;
begin
Result := FData;
end;
procedure TDataTypeGeneric<TDataType>.LoadFromStream(AStream: TFileStream);
begin
AStream.Read(FData,SizeOf(FData));
end;
procedure TDataTypeGeneric<TDataType>.SaveToStream(AStream: TFileStream);
begin
AStream.Write(FData,SizeOf(FData));
end;
procedure TDataTypeGeneric<TDataType>.SetData(const Value: TDataType);
begin
FData := Value;
end;
Lediglich eine Methode fuer die Stringumwandlung ist ueberschrieben, weil das eben fuer jeden Typ unterschiedlich ist.
Delphi-Quellcode:
{ TIntegerClass }
function TIntegerClass.GetVString: string;
begin
Result := IntToStr(FData);
end;
{ TFloatClass }
function TFloatClass.GetVString: string;
begin
Result := FloatToStr(FData);
end;
{ TBooleanClass }
function TBooleanClass.GetVString: string;
begin
Result := BoolToStr(FData,true);
end;
Bei der StringKlasse musste ich noch die Stream Methoden ueberschreiben wegen dem "PChar()^" anstelle von einfach nur "FData"..
Delphi-Quellcode:
{ TStringClass }
function TStringClass.GetVString: string;
begin
Result := FData;
end;
procedure TStringClass.LoadFromStream(AStream: TFileStream);
var
size : longint;
begin
AStream.Read(size,SizeOf(size));
setlength(FData,size div SizeOf(char));
AStream.Read(PChar(FData)^,size);
end;
procedure TStringClass.SaveToStream(AStream: TFileStream);
var
size : longint;
begin
size := length(FData) * SizeOf(char);
AStream.Write(size,SizeOf(size));
AStream.Write(PChar(FData)^,size);
end;
Wie wolltest du denn den Data property getter und setter fuer beliebige Typen ohne Generics implementieren??