a) wieso ist das "with... as...do" nicht brauchbar? ich dachte, das sei besser als hardcast (iexample(i)
)
Das
as
ist in Ordnung aber
with
nicht:
http://hallvards.blogspot.de/2004/08...d-harmful.html
b)Einbindung der Interfaces in die Hauptanwendung
Dann solltest du die Interfaces deklarieren, die alle Methoden enthalten, mit denen die Hauptanwendung etwas anfangen kann. Ob du dann diese Interfaces in den Packages ableitest oder separate deklarierst, ist nebensächlich. Über Supports kannst du überprüfen, ob die Klasse das jeweilige Interface implementiert und dir gleichzeitig auch eine Instanz dieses Interfaces zurückgeben lassen.
Delphi-Quellcode:
type itest=interface
function GetDescription: string;
procedure DoTest;
end;
type imachwas=interface
function GetName: string;
procedure Execute;
end;
var
myTestIntf: ITest;
myMachWasIntf: IMachWas;
begin
if Supports(myClass, ITest, myTestIntf) then begin
myTestIntf.DoTest;
end;
if Supports(myClass, IMachWas, myMachWasIntf) then begin
myMachWasIntf.Execute;
end;
end;
Im
Package kannst du dann z.B. über abgeleitete Interfaces die speziellen Dinge realisieren.
Delphi-Quellcode:
type
ITestExt = interface(ITest)
procedure TestFall1;
end;
IMachWasAnderes = interface(IMachWas)
procedure DasSollKeinerWissen;
end;
Der
AS
-Cast auf
TInterfacedPersistent
ist auch überflüssig, da
Supports
bereits für
TObject
funktioniert.
habe ich da keine möglichkeit, quasi die funktionalitäten aus den einzelenen packages anhand der interfaces zu "erkennen", ohne dass beide unbedingt in der hauptanwendung deklariert sind?
Nein, nicht ohne erheblichen und völlig unnötigen Aufwand.
oder ist das ein genereller design fehler des systems?
Offensichtlich.
Edit: Was Sinn machte wäre zb ein gemeinsames Interface, um der hauptanwendung informationen zu den einzelen Packages zu liefern. Nur wie kann ich dann am einfachsten auf die restlichen inhalte zugreifen (dynamisches laden und aufrufen von methoden mithilfe von method pointers ist mir bekannt).
Method Pointer sind hier völlig fehl am Platze. Du machst es dir damit eindeutig zu schwer. Compiliere die Interface-Deklarationen (sinnvollerweise in einer eigenen
Unit von den implementierenden Klassen getrennt) in die Haup0tanwendung ein und die Sache ist geritzt.
Kann ich dann auch auf Properties zugreifen?
Wenn das Interface diese deklariert, sicher.