如何实现两个具有同名方法的接口?

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

我正在尝试声明一个自定义接口列表,我想从中继承以获得特定接口的列表(我知道 IInterfaceList,这只是一个示例)。我使用的是 Delphi 2007,所以我无法访问实际的仿制药(可怜我)。

这是一个简化的例子:

   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 将无法编译:

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

我想我理论上可以使用 TCustomInterfaceList,但我不想每次使用它时都必须强制转换 "GetFirst"。我的目标是有一个特定的 class 既继承了基础 class 的行为又包装了 "GetFirst".

我怎样才能做到这一点?

谢谢!

不确定这在 Delphi7 中是否也可行,但您可以尝试在声明中使用方法解析子句。

function interface.interfaceMethod = implementingMethod;

如果可能,这将帮助您解决命名冲突。

ISpecificInterfaceList 定义了三个方法。他们是:

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

因为您的两个函数共享相同的名称,您需要帮助编译器识别哪个是哪个。

使用 method resolution clause

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

对于方法,如果参数不同,您也可以选择覆盖。

如果您有后代实现后代接口,则接口函数映射非常困难,因为这些函数不会作为接口方法转发给下一个class,因此您需要重新映射它们。