Danke, du hast den Problemkreis sehr anschaulich beschrieben.
Der Delphicompiler müsste nur zwei Dinge zusätzliche beherschen:
Delphi-Quellcode:
TFoo = class(TInterfacedObject, IFoo) // IBar, IBaz, alle Eltern durch den Compiler versteckt mit angelegt}
DoSomething(foo); // (foo as IBar) duch den Compiler automatische Abfrage des passenden Elter
Das vermisse ich eigentlich schon fast so lange, wie ich mit Interfaces in Delphi arbeite.
Es geht ja mit Delphi schon so:
Delphi-Quellcode:
procedure DoSomethingWithBar( ABar : IBar );
procedure DoSomethingWithBaz( ABaz : IBaz );
TFoo = class( TInterfacedObject, IBar, IBaz, IFoo )
...
end;
var
Foo : TFoo;
begin
Foo := TFoo.Create;
DoSomethingWithBar( Foo );
DoSomethingWithBaz( Foo );
end;
Das Hauptproblem ist aber hierbei, dass nach dem Aufruf von
DoSomethingWithBar( Foo );
die Foo-Instanz sich in Rauch auflöst. Somit müsste man entweder
TFoo
von
TPersistentInterface
ableiten und explizit freigeben
Delphi-Quellcode:
TFoo = class( TInterfacedPersistent, IBar, IBaz, IFoo )
end;
var
Foo : TFoo;
begin
Foo := TFoo.Create;
try
DoSomethingWithBar( Foo );
DoSomethingWithBaz( Foo );
finally
Foo.Free;
end;
end;
oder sich eben zusätzlich eine
IFoo
Referenz merken.
Delphi-Quellcode:
var
Foo : TFoo;
FooIntf : IFoo;
begin
Foo := TFoo.Create;
FooIntf := Foo;
DoSomethingWithBar( Foo );
DoSomethingWithBaz( Foo );
end;
oder man hat
ARC und dann klappt es einfach so ohne dieses Gedöns.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)