Einzelnen Beitrag anzeigen

Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

von TCustomIniFile ableiten und auf alle Ini-Typen anwenden

  Alt 15. Dez 2007, 02:01
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?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat