2015-01-13 10 views
5

私は特定のインターフェイスのリストを取得するために継承したいインターフェイスのカスタムリストを宣言しようとしています(私はIInterfaceListを認識していますが、これは単なる例です)。私はDelphi 2007を使用しているので、実際のジェネリックにアクセスできない(同情します)。同じ名前のメソッドを持つ2つのインターフェイスを実装するにはどうすればよいですか?

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がコンパイルされません:私は推測 'のGetFirst' 異なっの

E2211宣言を宣言からインタフェースで 'ISpecificInterfaceList'

ここ

は簡略化した例であります私は理論的にTCustomInterfaceListを使うことができましたが、私はそれを使うたびに "GetFirst"をキャストしたくありません。私の目標は、基本クラスの動作を継承し、 "GetFirst"をラップする特定のクラスを持つことです。

どうすればこの問題を解決できますか?

ありがとうございます!

+2

[インターフェイス名を別のメソッド名にマップする方法](http://stackoverflow.com/questions/1390552/how-to-map-interface-names-to-different-method-names) – RFerwerda

答えて

5

ISpecificInterfaceListは、3つの方法を定義する。彼らは以下のとおりです。

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

あなたの機能の2つが同じ名前を共有しているため、あなたはコンパイラがこれはどちら識別しやすくする必要があります。

method resolution clauseを使用してください。

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

驚くばかり!ありがとう:) –

1

これがDelphi7でも可能かどうかは不明ですが、宣言でメソッド解決節を試すことができます。

function interface.interfaceMethod = implementingMethod; 

可能であれば、名前の競合を解消するのに役立ちます。

0

メソッドの場合、パラメータが異なる場合は、オーバーライドを選択することもできます。

子孫インターフェイスを実装している後の子孫がある場合、これらの関数がインターフェイスメソッドとして次のクラスに転送されず、再マップする必要があるため、インターフェイス関数のマッピングが静かではありません。

関連する問題