Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Properties in Interfaces (https://www.delphipraxis.net/194007-properties-interfaces.html)

Helmi 5. Okt 2017 10:23

Properties in Interfaces
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

bezugnehmend auf diesen Thread hab ich noch eine Frage, diesmal aber bzgl. Properties in Interfaces.

Ich hab mein Interface um eine Property erweitert:
Delphi-Quellcode:
unit Unit2;

interface

type
  IMyInterfaceInternal = Interface
    function GetOnOffTimer: Boolean;
    procedure SetOnOffTimer(b: Boolean);
  end;

  IHostInterface = interface(IMyInterfaceInternal)
    procedure TimerEvent;
    property OnOffTimer: Boolean read GetOnOffTimer write SetOnOffTimer;
  end;
In meinem Host hab ich die Klasse dementsprechend erweitert:
Delphi-Quellcode:
type
  THostInterface = class(TInterfacedObject, IHostInterface)
  private
    function get_Feld: Boolean;
    procedure set_Feld(b: Boolean);

  public
    procedure TimerEvent;
    property OnOffTimer: Boolean read get_Feld write set_Feld;
  end;
Wobei ich dort ja eigentlich nicht die Property und den Getter und Setter brauch, weil ich dort ja die Property versorgen möchte um in meiner BPL etwas auszuführen.

In meiner BPL wird das Interface "nur" als Variable übergeben, so dass ich dort keine Klasse habe, um auf das Event zu reagieren.
Delphi-Quellcode:
uses
  Vcl.ExtCtrls, System.Classes, Unit2;

type
  TSPS = class(TObject)
  private
    { Private-Deklarationen }
    Timer: TTimer;
    procedure TimerEvent(Sender: TObject);
  public
    { Public-Deklarationen }
    Host: IHostInterface;
    constructor Create;
    destructor Destroy; override;
  end;

var
  SPS: TSPS;

implementation

procedure InitBPL(const AHost: IHostInterface);
begin
  SPS.Host := AHost;
end;
Wie kann ich nun richtig eine Property anlegen um von meiner Hostanwendung in der BPL, wie jetzt in diesem Testprojekt, den Timer ein- und ausschalten?

TBx 5. Okt 2017 10:58

AW: Properties in Interfaces
 
gar nicht.
Interfaces sind eine Vereinbarung von Öffentlichen Funktionen und Procedures.
Die Möglichkeit, in einer Interfacedeklaration Properties anzulegen, ist ein 'Goodie'.
Leg einfach den Getter und den Setter, den Du im Interface refernzierst, in der entsprechenden Klasse public an. Die Property muss in der Klasse nicht implementiert werden.

Der schöne Günther 5. Okt 2017 11:04

AW: Properties in Interfaces
 
Properties sind eh nur Syntax-Zucker. Du kannst Sie nicht als Var-Parameter übergeben, ich mache nie Properties. Getter und Setter reichen dicke 8-)

Uwe Raabe 5. Okt 2017 11:07

AW: Properties in Interfaces
 
Zitat:

Zitat von TBx (Beitrag 1382667)
Leg einfach den Getter und den Setter, den Du im Interface refernzierst, in der entsprechenden Klasse public an.

Warum jetzt gerade public?

Implementierungen von Interfaces können sogar private sein, solange sie nicht auch in abgeleiteten Klassen benötigt werden. Eigentlich ist das auch vorzuziehen, da diese Methoden von außen in der Regel nur über das Interface angesprochen werden sollen und nicht über die Klasseninstanz.

Helmi 5. Okt 2017 11:12

AW: Properties in Interfaces
 
Hallo,

also einfach functions und procedures anlegen und die dann im Host aufrufen?
Aber wie reagier ich in der BPL darauf?

TBx 5. Okt 2017 11:16

AW: Properties in Interfaces
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1382669)
Implementierungen von Interfaces können sogar private sein

Ui, das war mir neu. Funktioniert aber, wie ich gerade feststelle.
Zitat:

Zitat von Uwe Raabe (Beitrag 1382669)
Eigentlich ist das auch vorzuziehen, da diese Methoden von außen in der Regel nur über das Interface angesprochen werden sollen und nicht über die Klasseninstanz.

Das leuchtet ein. Wieder was gelernt.

jaenicke 5. Okt 2017 11:56

AW: Properties in Interfaces
 
Zitat:

Zitat von Helmi (Beitrag 1382671)
also einfach functions und procedures anlegen und die dann im Host aufrufen?
Aber wie reagier ich in der BPL darauf?

Wir machen das (bei DLLs, aber kommt auf das gleiche raus) so, dass wir eine Schnittstelle initialisieren, die dann in beide Richtungen Interfaces durchreicht.

Konkret gibt es im IHostInterface ein RegisterClient, das wiederum ein Interface weitergibt. Auf die Weise kann die Anwendung in beide Richtungen kommunizieren. Wir machen das dann so, dass wir in einer Methode GetInterface die GUID des benötigten Interfaces anfragen und dann die entsprechende Implementierung als Instanz zurückbekommen. So können wir über eine schlanke Schnittstelle sehr viel Funktionalität durchleiten.

Wir würden also konkret vom Host aus am Client z.B. einen ITimerManager anfragen, der dann z.B. eine Property TimerEnabled hat.

Helmi 5. Okt 2017 12:55

AW: Properties in Interfaces
 
Zitat:

Zitat von jaenicke (Beitrag 1382677)
Zitat:

Zitat von Helmi (Beitrag 1382671)
also einfach functions und procedures anlegen und die dann im Host aufrufen?
Aber wie reagier ich in der BPL darauf?

Wir machen das (bei DLLs, aber kommt auf das gleiche raus) so, dass wir eine Schnittstelle initialisieren, die dann in beide Richtungen Interfaces durchreicht.

Konkret gibt es im IHostInterface ein RegisterClient, das wiederum ein Interface weitergibt. Auf die Weise kann die Anwendung in beide Richtungen kommunizieren. Wir machen das dann so, dass wir in einer Methode GetInterface die GUID des benötigten Interfaces anfragen und dann die entsprechende Implementierung als Instanz zurückbekommen. So können wir über eine schlanke Schnittstelle sehr viel Funktionalität durchleiten.

Wir würden also konkret vom Host aus am Client z.B. einen ITimerManager anfragen, der dann z.B. eine Property TimerEnabled hat.

Könntest du mir ein kleines Beispiel basteln dafür?

jaenicke 6. Okt 2017 08:13

AW: Properties in Interfaces
 
Das hatte ich schon länger vor... ich weiß nicht, ob ich in den nächsten Tagen dazu komme.

Mavarik 7. Okt 2017 10:58

AW: Properties in Interfaces
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1382669)
Implementierungen von Interfaces können sogar private sein...

Ich setzte die "sogar" immer strict private...

2 Gründe:
  1. Ich nutze sonst NIE strict private also ist es für mich ein "flag" die Methoden kommen aus einem Interface...
    Bedeutet, wenn meine Klasse zwei oder mehr Interfaces Implementiert, gibt es auch für jedes Interface eine eigene strict private Region.
  2. Ich komme auch nicht auf die Idee innerhalb der Unit diese Methoden zu benutzen.

Mavarik


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz