![]() |
Verständnisfrage zu Interfaces
Angenommen ich deklariere ein Interface in dem es zwei Methoden gibt.
Delphi-Quellcode:
Dann will ich eine Klasse bilden, die das Interface implementiert. Ausserdem soll diese Klasse noch eine Methode dre einführen. Geht das?
IBeispiel = interface
procedure Methode1; procedure Methode2; end;
Delphi-Quellcode:
Sollte dies nicht gehen, muss ich dann eine abstrakte Klasse anstatt des Interface benutzen?
TBeispiel = class(TInterfacedObject, IBeispiel)
procedure Methode1; procedure Methode2; procedure Methode3; end; Vielen Dank schon mal im Vorraus :-D |
Re: Verständnisfrage zu Interfaces
Freilich geht das. Jedoch wirst du wenn du nur mit dem Interface arbeitest diese nicht verfügbar haben.
|
Re: Verständnisfrage zu Interfaces
Natürlich geht das.
Interface heisst nur, dass die Klasse _mindestens_ die vom Interface vorgegebenen Methoden implementieren muss. |
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?
|
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? |
Re: Verständnisfrage zu Interfaces
Was möchtest du denn überhaupt genau erreichen?
|
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:
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.
TKamera2 = class(TInterfacedObject, ICamera)
procedure Initialize; function getBild:SpectrumArray; procedure setExposureTime(msTime : integer); function getExposureTime: integer; procedure setTriggerTimeOut(mode : integer); function getTriggerTimeOut:integer; end;
Delphi-Quellcode:
Gibt es da vielleicht ein geschicktes Entwurfsmuster was mir dabei helfen kann?
var
Cam : ICamera; begin Cam := TKamera1.create; Cam.setExposureTime(1000); end; // Edit: Fehler mit create behoben |
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. |
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:
Das war's schon.
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; Jetzt kannst Du bei jeder Klasse auf die allgemeinen Methoden zugreifen und zusätzlich jeweils auf die speziellen. Gruß xaromz |
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. |
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