Search code examples
delphiinheritanceinterfacetinterfacedobject

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!


Solution

  • 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;