Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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!

like image 968
Steve Riley Avatar asked Jan 13 '15 18:01

Steve Riley


1 Answers

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;
like image 156
David Heffernan Avatar answered Sep 21 '22 00:09

David Heffernan