Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verständnisfrage zu Interfaces (https://www.delphipraxis.net/104048-verstaendnisfrage-zu-interfaces.html)

Oracle 26. Nov 2007 16:01


Verständnisfrage zu Interfaces
 
Angenommen ich deklariere ein Interface in dem es zwei Methoden gibt.

Delphi-Quellcode:
  IBeispiel = interface
    procedure Methode1;
    procedure Methode2;
  end;
Dann will ich eine Klasse bilden, die das Interface implementiert. Ausserdem soll diese Klasse noch eine Methode dre einführen. Geht das?

Delphi-Quellcode:
  TBeispiel = class(TInterfacedObject, IBeispiel)
    procedure Methode1;
    procedure Methode2;
    procedure Methode3;
  end;
Sollte dies nicht gehen, muss ich dann eine abstrakte Klasse anstatt des Interface benutzen?

Vielen Dank schon mal im Vorraus :-D

Bernhard Geyer 26. Nov 2007 16:06

Re: Verständnisfrage zu Interfaces
 
Freilich geht das. Jedoch wirst du wenn du nur mit dem Interface arbeitest diese nicht verfügbar haben.

Phoenix 26. Nov 2007 16:06

Re: Verständnisfrage zu Interfaces
 
Natürlich geht das.
Interface heisst nur, dass die Klasse _mindestens_ die vom Interface vorgegebenen Methoden implementieren muss.

Oracle 26. Nov 2007 16:10

Re: Verständnisfrage zu Interfaces
 
Wie Bernhard Geyer schon sagt ist das Problem dann aber, dass ich diese Funktionen über das Interface dann nicht zur Verfügung habe. Ich nehme an, dass mir eine abstrakte Klasse dann auch nicht hilft?

Phoenix 26. Nov 2007 16:11

Re: Verständnisfrage zu Interfaces
 
Nein. Aber Du könntest in dem Fall diese dritte Methode in einem zweiten Interface deklarieren, und dann auf dieses zweite Interface abprüfen.

Oder Du definierst die Methode auch direkt auf dem Interface, wenn Du es dort offensichtlich eh brauchst?

idontwantaname 26. Nov 2007 16:12

Re: Verständnisfrage zu Interfaces
 
Was möchtest du denn überhaupt genau erreichen?

Oracle 26. Nov 2007 16:19

Re: Verständnisfrage zu Interfaces
 
Also ich habe hier verschiedene Kameras von verschiedenen Herstellern die ich über deren API Funktionen anspreche.
Einige Funktionen haben alle Kameras gemeinsam, wie OpenKamera, BelichtungszeitEinstellen, oder Bildmachen.
Diese Funktionen will ich in ein Interface packen so dass ich die Kameras ohne weiteres untereinander austauschen kann.

Beispiel:

Delphi-Quellcode:
  ICamera = interface
    procedure Initialize;
    function getBild:SpectrumArray;
    procedure setExposureTime(msTime : integer);
    function getExposureTime: integer;
  end;

  TKamera1 = class(TInterfacedObject, ICamera)
    procedure Initialize;
    function getBild:SpectrumArray;
    procedure setExposureTime(msTime : integer);
    function getExposureTime: integer;
  end;

Nun haben einige der Kameras noch funktionen die andere nicht bieten, und somit würde ich bei diesen Kameras noch andere Funktionen hinzufügen wollen.

Beispiel:

Delphi-Quellcode:
  TKamera2 = class(TInterfacedObject, ICamera)
    procedure Initialize;
    function getBild:SpectrumArray;
    procedure setExposureTime(msTime : integer);
    function getExposureTime: integer;
    procedure setTriggerTimeOut(mode : integer);
    function getTriggerTimeOut:integer;
  end;
Ansprechen möchte ich die Kameras allerdings über das Interface, so dass sie wie gesagt untereinander austauschbar sind. Und dass ich ohne weiteres neue Kameras hinzufügen kann.

Delphi-Quellcode:
var
  Cam : ICamera;
begin
  Cam := TKamera1.create;
  Cam.setExposureTime(1000);
end;
Gibt es da vielleicht ein geschicktes Entwurfsmuster was mir dabei helfen kann?

// Edit: Fehler mit create behoben

Phoenix 26. Nov 2007 16:23

Re: Verständnisfrage zu Interfaces
 
Ja, dann mache für jede dieser zusätzlichen Funktionen, die einzeln auftreten können, ein weiteres Interface.

Du kannst dann ja auf dem Objekt letzlich abfragen, ob die gerade aktuelle Kamera dieses Interface implementiert und wenn ja, dann diese Methode nutzen.

xaromz 26. Nov 2007 16:25

Re: Verständnisfrage zu Interfaces
 
Hallo,

da hilft doch wieder die gute alte Vererbung:
Du erstellst ein Interface mit den allgemeinen Methoden und leitest davon wiederum die speziellen ab. Das gleiche machst Du mit den Klassen:
Delphi-Quellcode:
type
  ICamera = interface(IInterface)
    procedure Initialize;
    function getBild:SpectrumArray;
    procedure setExposureTime(msTime : integer);
    function getExposureTime: integer;
  end;

  ICamera1 = interface(ICamera)
    procedure setTriggerTimeOut(mode : integer);
    function getTriggerTimeOut:integer;
  end;

  TKamera = class(TInterfacedObject, ICamera)
    procedure Initialize;
    function getBild:SpectrumArray;
    procedure setExposureTime(msTime : integer);
    function getExposureTime: integer;
  end;

  TKamera1 = class(TKamera, ICamera1)
    procedure setTriggerTimeOut(mode : integer);
    function getTriggerTimeOut:integer;
  end;
Das war's schon.

Jetzt kannst Du bei jeder Klasse auf die allgemeinen Methoden zugreifen und zusätzlich jeweils auf die speziellen.

Gruß
xaromz

Apollonius 26. Nov 2007 16:26

Re: Verständnisfrage zu Interfaces
 
Was soll denn das Create im letzten Code-Teil?

Du kannst in den Kameras, die mehr Funktionalität bieten, so viele Methoden wie du willst reinpacken. Der Punkt ist eben, dass im Interface nur die Funktionen ansprechbar sind, die auch im Interface deklariert sind. Anders gesagt: Du kannst eine TKamera2 genauso über ein ICamera ansprechen wie eine TKamera1, aber mit der Interface-Variablen hast du keinen Zugriff auf Set- und GetTriggerTimeout.
Wenn es jedoch mehrere Kameras gibt, die Set- und GetTriggerTimeout implementieren, kann es nützlich sein, ein Interface IExtendedCamera = interface(ICamera) mit diesen Methoden zu erstellen, über das du dann die "besseren" Kameras austauschen kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 1 von 2  1 2      

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