AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interface Methode als Parameter übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Interface Methode als Parameter übergeben

Ein Thema von t2000 · begonnen am 25. Jul 2022 · letzter Beitrag vom 27. Jul 2022
Antwort Antwort
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#1

Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 11:27
Delphi-Version: 11 Alexandria
Hallo,

da ich immer noch nicht zu 100% fit bzgl Interfaces bin, hier eine Frage.

Ich möchte eine Funktion als Parameter übergeben. So wie es sonst geht, funktioniert es leider nicht.
Hier meine Deklarationen:

Delphi-Quellcode:
type
  TMeineFunktion = function( const Param: TJSONObject): TJSONObject;// of object;

  IMeinInterface = interface(IInvokable)
  ['{A...0}']
    function DieFunktion( const Param: TJSONObject): TJSONObject;
  end;
Jetzt möchte ich die Funktion als Parameter übergeben. Grund ist, das ich bestimmt 100 Stellen hbe, bei denen immer wieder das gleiche gemacht wird. Neben einem String ist nur die Interface-Funktion variabel.
Ich will nicht 100 Mal den selben Code schreiben (ca. 20-30 Zeilen).

Delphi-Quellcode:
var
  EinInterfaceObjekt: IMeinInterface;
begin
  // Initialisierungen ...

  Ergebnis := Rechenfunktion( EinString, EinInterfaceObjekt.DieFunktion);

end;
Ich bekomme immer Parameterfehler.

Alternativen:
Delphi-Quellcode:
  @EinInterfaceObjekt.DieFunktion

  Addr(EinInterfaceObjekt.DieFunktion)

  var xx: TMeineFunktion;
  with EinInterfaceObjekt do
    xx := @DieFunktion;
gehen alle nicht.
Geht das grundsätzlich nicht oder habe ich einfach noch keine Ahnung, wie damit umzugehen ist?

Für eine schnelle Hilfe wäre ich sehr dankbar.

VG
Thomas
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#2

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 11:37
Du übergibst ein Interface, nicht die Funktion "DieFunktion" an Rechenfunktion.
function Rechenfunktion(Str: stirng; Func: IMeinInterface): string;

In der Funktion weißt du, dass "dieses" Interface die geünschte Funktion implementiert definiert und kannst sie demnach dort aufrufen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#3

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 12:16
Ich habe aber viele unterschiedliche Funktionen im Interface. Alle mit identischen Parametern.
Insgesamt gibt es viele Interfaces und jeweils dort drin einige Funktionen. Der Ablauf innerhalb ist immer gleich (REST Kommunikationsschnittsetlle).
Ich wollte mir das Leben einfacher machen und eine zentrale Routine nutzen, in der der ganze REST-Overhead gemacht wird.
Daher würde ich gerne die auszuführende Funktion übergeben.
Ist das möglich?
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 12:21
In der Funktion weißt du, dass "dieses" Interface die geünschte Funktion implementiert definiert und kannst sie demnach dort aufrufen.
Das funktioniert nur dann, wenn jedes Mal das gleiche Interface übergeben wird und intern immer dieselbe Funktion davon aufgerufen wird. Im diesem Fall hier klappt das nicht:
Delphi-Quellcode:
  Ergebnis1 := Rechenfunktion( EinString, EinInterfaceObjekt.DieFunktion);

  Ergebnis2 := Rechenfunktion( EinString, EinInterfaceObjekt.DieAndereFunktion);
Das Problem bei diesem Ansatz ist, dass Interface-Methoden anders implementiert sind als die in Klassen. Ein hässlicher Workaround wäre sowas:
Delphi-Quellcode:
type
  TMeineFunktion = reference to function( const Param: TJSONObject): TJSONObject;// of object;
...

function Rechenfunktion( const EinString: string; AFunc: TMeineFunktion): string;

...
  Ergebnis := Rechenfunktion( 'EinString',
    function( const Param: TJSONObject): TJSONObject
    begin
      result := EinInterfaceObjekt.DieFunktion(Param);
    end
    );
Wäre IMeinInterface eine Klasse, würde es so funktionieren:
Ergebnis := Rechenfunktion( 'EinString', EinInterfaceObjekt.DieFunktion);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (25. Jul 2022 um 12:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#5

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 12:38
Man könnte mehrere gleiche, von einem Gemeinsamen abgeleitete, Interfaces erstellen
und jedem Interface je eine Methode der Klasse zuweisen.
https://docwiki.embarcadero.com/RADS...olution_Clause

Dann kann man über die Wahl des Interfaces eine der Methoden (das zugehörige Interface) übergeben.


Wenn das Delphi-Objekte in den Interfaces sind, dann ginge auch noch
Delphi-Quellcode:
Ergebnis := Rechenfunktion(EinString, (EinInterfaceObjekt as TEinObjekt).DieFunktion);

// bzw.
Ergebnis := Rechenfunktion(EinString, @(EinInterfaceObjekt as TEinObjekt).DieFunktion);
Für Interfaces in Delphi wird seit einer Weile ein geheimes Fake-Interface implementiert, worüber man von Interfaces das interne Objekt rausholen kann.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jul 2022 um 17:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#6

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 15:10
Mir fehlen noch Details um einen Rat geben zu können. Aktuell verstehe ich noch nicht, wie das ganze aufgebaut ist, bzw. warum es so gebaut ist.

Bei Interfaces gibt es viele Möglichkeiten, sei es mit Vererbung oder QueryInterface zu arbeiten usw., aber für den konkreten Fall hilft das nicht weiter.

Deshalb wäre es hilfreich, wenn du mehr zu der Architektur schreiben könntest, damit wir vielleicht eine andere Lösung finden, statt zu versuchen, deine Lösungsidee irgendwie doch zu realisieren.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 20:24
Sehe ich auch so.
Dazu noch ein Hinweis: mache statt "TMeineFunktion = function" besser "TMeineFunktion = reference to function". Das ist dann universeller verwendbar. (Mehr dazu hier.)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:00 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