2016-11-10 17 views
4

2つ以上のインタフェースから継承するインタフェースを定義する方法はありますか?インタフェースの多重継承

私はDelphi2007に次のコードを試してみました:

IInterfaceA = interface 
    procedure A; 
    end; 

    IInterfaceB = interface 
    procedure B; 
    end; 

    IInterfaceAB = interface(IInterfaceA, IInterfaceB); 

を...、それはラインIInterfaceAB = interface(IInterfaceA, IInterfaceB)でエラーE2029 ')' expected but ',' foundを上げました。

+0

最後の段落は説明する:http://edn.embarcadero.com/article/29779 –

答えて

7

Delphiでは複数の継承が全くないため、Delphiでは複数のインタフェース継承はありません。あなたができることは、クラスを一度に複数のインターフェイスを実装させることです。

TMyClass = class(TInterfacedObject, IInterfaceA, IInterfaceB) 
6

Delphiのインターフェイスでは複数のインターフェイスを継承することはできませんが、クラスは複数のインターフェイスを実装できます。コンポーネントを適切に設計する場合(ISPのインタフェース分離の原理を参照)、インタフェースをインタフェースから継承する必要はありません。

1

IMHO、この場合、ツリーオブジェクトを定義する必要があります。 インターフェイスごとに1つ、そのような多重継承のための第三:それは窓のコンパイラのために行われなかった理由を

IInterfaceA = interface 
    procedure A; 
    end; 

    IInterfaceB = interface 
    procedure B; 
    end; 

    TiA = class(TInterfacedObject, IInterfaceA) 
    procedure A; 
    end; 

    TiB = class(TInterfacedObject, IInterfaceB) 
    procedure B; 
    end; 

    TMyObject = class(TInterfacedObject, IInterfaceA, IInterfaceB) 
    private 
    _iA : IInterfaceA; 
    _iB : IInterfaceB; 
    function getiA : IInterfaceA; 
    function getiB : IInterfaceB; 
    public 
    property iA : IInterfaceA read getiA implements IInterfaceA; 
    property iB : IInterfaceB read getiB implements IInterfaceB; 
    end; 
{.....} 
{ TMyObject } 

function TMyObject.getiA: IInterfaceA; 
begin 
    if not Assigned(_iA) then _iA := TIA.Create; 
    Result := _iA; 
end; 

function TMyObject.getiB: IInterfaceB; 
begin 
    if not Assigned(_iB) then _iB := TIB.Create; 
    Result := _iB; 
end; 
+0

これが可能であるが、アプローチ、それは本当に必要ではありません。手続きAとBをTMyObjectに直接実装することもできます。 –

+0

もちろん、このアプローチでは、各インターフェイスの実装を変更するのが最も簡単です。 を使用してレイヤの実装を変更する必要はありません。これにより、より複雑なプロジェクトへのエッジ効果が回避されます –