AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Method-Resolution Clause bei Interface-Vererbung

Method-Resolution Clause bei Interface-Vererbung

Ein Thema von Der schöne Günther · begonnen am 15. Aug 2019 · letzter Beitrag vom 15. Aug 2019
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
5.888 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Method-Resolution Clause bei Interface-Vererbung

  Alt 15. Aug 2019, 11:20
Delphi-Version: 10 Seattle
Ich möchte dass eine Klasse zwei Interfaces implementiert, und ein Interface ist abgeleitet vom ersten und "verdeckt" eine Methode.

Sieht so aus:
Delphi-Quellcode:
type
   IMyInterface = interface
   ['{521683FE-4DF8-43E5-8575-420FA539CA0A}']
      function getNumber(): Integer;
   end;

   IMyInterfaceEx = interface(IMyInterface)
   ['{06555A86-3DCE-4DC0-84EE-3419B7164F5C}']
      function getNumber(): Single;
   end;

   TMyObject = class(
      TInterfacedObject,
      IMyInterface,
      IMyInterfaceEx
   )
      function IMyInterface.getNumber = IMyInterface_getNumber;
      function IMyInterface_getNumber(): Integer;

      function IMyInterfaceEx_getNumber(): Single;
      function IMyInterfaceEx.getNumber = IMyInterfaceEx_getNumber;
   end;
Ich bekomme in der Zeile TMyObject = class leider folgenden Fehler:
Code:
[dcc32 Fehler] Project8.dpr(22): E2291 Implementierung der Interface-Methode IMyInterface.getNumber fehlt
Mache ich was falsch oder will der Compiler einfach nicht? Wenn ja, warum will er nicht?


Link: Doku -> Implementing Interfaces -> Method Resolution clause
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.888 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Method-Resolution Clause bei Interface-Vererbung

  Alt 15. Aug 2019, 11:25
Notfalls ginge es wohl auch so, ich glaube das wäre sogar deutlich besser ohne Interface-Vererbung.

Delphi-Quellcode:
type
   IMyInterface<T> = interface
   ['{521683FE-4DF8-43E5-8575-420FA539CA0A}']
      function getNumber(): T;
   end;

   TMyObject = class(
      TInterfacedObject,
      IMyInterface<Integer>,
      IMyInterface<Single>
   )
      function IMyInterface<Integer>.getNumber = IMyInterface_Integer_getNumber;
      function IMyInterface_Integer_getNumber(): Integer; virtual; abstract;

      function IMyInterface<Single>.getNumber = IMyInterface_Single_getNumber;
      function IMyInterface_Single_getNumber(): Single; virtual; abstract;
   end;
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: Method-Resolution Clause bei Interface-Vererbung

  Alt 15. Aug 2019, 11:36
Dein IMyInterfaceEx hat durch die Vererbung jetzt 2 Methoden mit dem Namen getNumber . Das soll so sein?

Das ist auf jeden Fall das, was dem Compiler zu schaffen macht.

Such dazu mal nach IEnumerable vs. IEnumerable<T> . Da hast du das gleiche Problem.

Das hier geht ohne Probleme
Delphi-Quellcode:
type
  IMyInterface = interface
    ['{C67ABDD4-94F0-477D-92FE-A1EC7E790153}']
    function GetNumber(): Integer;
  end;

  IMyInterfaceEx = interface
    ['{4675F531-90C2-48D2-85EB-21EA1A6E063B}']
    function GetNumber(): Single;
  end;

  TMyObject = class(TInterfacedObject, IMyInterface, IMyInterfaceEx)
  private
    function GetIntegerNumber(): Integer;
    function IMyInterface.GetNumber = GetIntegerNumber;

    function GetSingleNumber(): Single;
    function IMyInterfaceEx.GetNumber = GetSingleNumber;
  end;

Geändert von Schokohase (15. Aug 2019 um 11:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.898 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Method-Resolution Clause bei Interface-Vererbung

  Alt 15. Aug 2019, 11:40
Gleichnamige Methoden können bei vererbten Interfaces nicht richtig aufgelöst werden mit Method Resolution Clause.

IMyInterfaceEx hat ja 2 Methoden namens getNumber, aber du delegierst nur die von IMyInterface und eine von IMyInterfaceEx (die, die Single zurückliefert).
Nun fehlt noch die getNumber Methode aus IMyInterface, die im IMyInterfaceEx drin steht - da interesiert ihn nicht, dass du IMyInterface.getNumber delegiert hast.

Mein Ansatz in solchen Fällen ist Vererbung der implementierenden Klasse:

Delphi-Quellcode:
   TMyObject = class(
      TInterfacedObject,
      IMyInterface
   )
      function getNumber(): Integer;
   end;

   TMyObjectEx = class(
      TMyObject,
      IMyInterfaceEx
   )
      function IMyInterfaceEx_getNumber(): Single;
      function IMyInterfaceEx.getNumber = IMyInterfaceEx_getNumber;
   end;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf