AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage zu Interfaces

Ein Thema von Oracle · begonnen am 26. Nov 2007 · letzter Beitrag vom 29. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Oracle
(Gast)

n/a Beiträge
 
#1

Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:06
Freilich geht das. Jedoch wirst du wenn du nur mit dem Interface arbeitest diese nicht verfügbar haben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#3

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:06
Natürlich geht das.
Interface heisst nur, dass die Klasse _mindestens_ die vom Interface vorgegebenen Methoden implementieren muss.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Oracle
(Gast)

n/a Beiträge
 
#4

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:10
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?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#5

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:11
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?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:12
Was möchtest du denn überhaupt genau erreichen?
Oliver Hanappi
Besucht meine neue Homepage: http://oli.hux.de
  Mit Zitat antworten Zitat
Oracle
(Gast)

n/a Beiträge
 
#7

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#8

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:23
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:25
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Verständnisfrage zu Interfaces

  Alt 26. Nov 2007, 16:26
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 Uhr.
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