Delphis XMLDocument ist bereits interface-basiert: IXmlDocument.
Was du beachten musst ist, dass die Lebensdauer von Interfaces durch Referenzzählung verwaltet wird.
Wenn du einer Interface variable ein Objekt zuweist, dann wird dessen Zähler erhöht, aber wenn du aus den Scope rennst, dann wird er wieder um 1 reduziert.
Erreicht er 0 wird die Instanz vernichtet.
IOW: Wenn du ein Objekt überall als Klasse, nicht Interface, nutzt, dann könnte eine einmalige Zuweisung zu einer Interface instanz dieses Objekt zerstören wenn du die Methode verlässt.
Ein Trick wäre den Referenzzähler künstlich um 1 zu erhöhen. (_AddRef)
Wenn du es nur als Parameter übergibst, kannst du diesen auch als "const" deklarieren. Genau wie bei AnsiString wird dabei die Referenzzählung ignoriert.
Hier passiert nix:
Delphi-Quellcode:
procedure Miep.DoSomething(const instance : ISomeInterface);
begin
instance.SomeMethod();
end;
Das hier ist aber GANZ böse:
Delphi-Quellcode:
procedure Miep.DoSomething(const instance : ISomeInterface);
var
tmp : ISomeInterface;
begin
tmp : instance;
end;
Wenn du in DoSomething ein Objekt wirfst, dann wird beim Zuweisen zu tmp der Referenzzähler auf 1 erhöht. Beim Verlassen der Methode aber reduziert und dadurch wird das Objekt zerstört.
Du kannst dem generell entgegenwirken, wenn du dafür sorgst, dass der Zäher immer mindestens 1 ist. Das erreichst du wenn du einmal _AddRef auf die Instanz ausführst.
Die coolste Lösung ist gar keine Objektreferenzen von diesen Instanzen zu benutzen. Weder in der Exe noch in ener
DLL. Dadurch funktioniert die Referenziertzählung überall und Objekte werden autom. freigegeben.