Hallo,
ich möchte gerne IniDateien um ein paar Methoden erweitern.
Dies soll dann allgemein für alle von TCustomIniFile abgeleiteten IniFiles-Klassen möglich sein (TIniFile, TMemIniFile, TRegistryIniFile, ...).
Nun weiß ich aber leider nicht so ganz, wie ich das anstellen soll.
Folgender Beispielcode soll das verdeutlichen, was ich umsetzen will:
Delphi-Quellcode:
type
TMyCustomIniFile = class(TCustomIniFile)
public
procedure WriteMyString;
end;
// nun sollen die Erweiterungen z.B. auf TIniFile, TMemIniFile etc. angewendet werden
TMyIniFile = class(TIniFile, TMyCustomIniFile); // geht leider nicht
implementation
procedure TMyCustomIniFile.WriteMyString;
begin
WriteString('My', 'String', 'Hello world!');
end;
Oder auch so etwas funktioniert leider nicht:
Delphi-Quellcode:
var ini: TMyCustomIniFile;
begin
ini := TMemIniFile.Create('test.ini');
// ...
end;
Nun habe ich mir überlegt, dass meine TMyCustomIniFile einfach im Konstruktor eine Instanz von einer von TCustomIniFile abgeleiteten Klasse übergeben bekommt und auf diese alle abstrakten Methoden anwendet, etwa so:
Delphi-Quellcode:
type
TMyCustomIniFile = class(TCustomIniFile)
private
FIniFile: TCustomIniFile;
public
constructor Create(IniFile: TCustomIniFile);
procedure WriteString(const Section, Ident, Value: String); override;
// und für alle weiteren abstrakten Methoden
procedure WriteMyString;
end;
implementation
constructor TMyCustomIniFile.Create(IniFile: TCustomIniFile);
begin
inherited Create(IniFile.FileName);
FIniFile := IniFile;
end;
// das ganze für alle abstrakten Methoden
procedure TMyCustomIniFile.WriteString(const Section, Ident, Value: String);
begin
FIniFile.WriteString(Section, Ident, Value);
end;
procedure TMyCustomIniFile.WriteMyString;
begin
WriteString('My', 'String', 'Hello world!');
end;
Hier gibt es nur das Problem, wenn in der von TCustomIniFile abgeleiteten Klasse, von der im Konstruktor eine Instanz übergeben wurde, eine Methode überschrieben wurde (z.B. WriteInteger bei TRegistryIniFile).
Eine letzte Möglichkeit die mir einfällt:
TMyCustomIniFile nicht von TCustomIniFile abzuleiten (einfach nur von TObject) und eben nur die neuen Methoden implementieren, evtl. dann noch eine Methode GetIniFile um auf die "normalen" Methoden einer (der übergebenen) IniDatei zuzugreifen.
Nun die eigentliche Frage:
Gibt es hier möglicherweise eine ganz einfache Lösung, die ich übersehen habe?
Wie würdet ihr so etwas lösen?