How do I implement two interfaces that have methods with the same name?
Asked Answered
S

3

7

I am trying to declare a custom list of interfaces from which I want to inherit in order to get list of specific interfaces (I am aware of IInterfaceList, this is just an example). I'm using Delphi 2007 so I don't have access to actual generics (pity me).

Here is a simplified example:

   ICustomInterfaceList = interface
      procedure Add(AInterface: IInterface);
      function GetFirst: IInterface;
   end;

   TCustomInterfaceList = class(TInterfacedObject, ICustomInterfaceList)
   public
      procedure Add(AInterface: IInterface);
      function GetFirst: IInterface;
   end;

   ISpecificInterface = interface(IInterface)
   end;

   ISpecificInterfaceList = interface(ICustomInterfaceList)
      function GetFirst: ISpecificInterface;
   end;

   TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList)
   public
      function GetFirst: ISpecificInterface;
   end;

TSpecificInterfaceList will not compile:

E2211 Declaration of 'GetFirst' differs from declaration in interface 'ISpecificInterfaceList'

I guess I could theoretically use TCustomInterfaceList but I don't want to have to cast "GetFirst" every time I use it. My goal is to have a specific class that both inherits the behavior of the base class and wraps "GetFirst".

How can I achieve this?

Thanks!

Shammy answered 13/1, 2015 at 18:48 Comment(1)
possible duplicate of How to map interface names to different method names?Galarza
E
7

ISpecificInterfaceList defines three methods. They are:

procedure Add(AInterface: IInterface);
function GetFirst: IInterface;
function GetFirst: ISpecificInterface;

Because two of your functions share the same name, you need to help the compiler identify which one is which.

Use a method resolution clause.

TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList)
public
  function GetFirstSpecific: ISpecificInterface;
  function ISpecificInterfaceList.GetFirst = GetFirstSpecific;
end;
Execration answered 13/1, 2015 at 19:1 Comment(0)
G
4

Not sure if this is also possible in Delphi7, but you could try using Method Resolution Clauses in your declaration.

function interface.interfaceMethod = implementingMethod;

If possible, this will help you solve the naming conflicts.

Galarza answered 13/1, 2015 at 19:0 Comment(0)
W
0

For methods you can also choose override if the parameters are different.

The interface function mapping is quiet difficult if you have later descendants implementing an descendant interface cause these functions are not forwarded to the next class as interface method and so you need to remap them.

Wilmot answered 15/1, 2015 at 22:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.