如何实现两个具有同名方法的接口?
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;
因为您的两个函数共享相同的名称,您需要帮助编译器识别哪个是哪个。
TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList)
public
function GetFirstSpecific: ISpecificInterface;
function ISpecificInterfaceList.GetFirst = GetFirstSpecific;
end;
对于方法,如果参数不同,您也可以选择覆盖。
如果您有后代实现后代接口,则接口函数映射非常困难,因为这些函数不会作为接口方法转发给下一个class,因此您需要重新映射它们。
我正在尝试声明一个自定义接口列表,我想从中继承以获得特定接口的列表(我知道 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;
因为您的两个函数共享相同的名称,您需要帮助编译器识别哪个是哪个。
TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList)
public
function GetFirstSpecific: ISpecificInterface;
function ISpecificInterfaceList.GetFirst = GetFirstSpecific;
end;
对于方法,如果参数不同,您也可以选择覆盖。
如果您有后代实现后代接口,则接口函数映射非常困难,因为这些函数不会作为接口方法转发给下一个class,因此您需要重新映射它们。