Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dynamisches Package & Interface Typecast

  Alt 10. Mai 2016, 17:22
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat