Reputation: 144
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!
Upvotes: 7
Views: 1494
Reputation: 1
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.
Upvotes: 0
Reputation: 613322
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;
Upvotes: 7
Reputation: 1277
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.
Upvotes: 4