2016-11-10 171 views
4

有沒有一種方法來定義從兩個或更多接口繼承的接口?接口的多繼承

我試過Delphi2007下面的代碼:

IInterfaceA = interface 
    procedure A; 
    end; 

    IInterfaceB = interface 
    procedure B; 
    end; 

    IInterfaceAB = interface(IInterfaceA, IInterfaceB); 

..它在線路IInterfaceAB = interface(IInterfaceA, IInterfaceB)引發錯誤E2029 ')' expected but ',' found

+0

最後一段解釋了爲什麼它從來沒有爲Windows編譯器完成:http://edn.embarcadero.com/article/29779 –

回答

7

在Delphi中沒有多接口繼承,因爲在Delphi中根本沒有多繼承。你所能做的就是讓一個類一次實現多個接口。

TMyClass = class(TInterfacedObject, IInterfaceA, IInterfaceB) 
6

在Delphi中,接口不能繼承多個接口,但類可以實現多個接口。如果你正確地設計你的組件(查找ISP - 接口隔離原則),你不需要從接口繼承接口。

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

雖然這是可能的方法,它並不是真的有必要。你也可以直接在TMyObject中實現程序A和B. –

+0

是的,當然,但使用這種方法,修改每個接口的實現是最容易的。 而不必修改使用圖層的實現。這避免了對更復雜項目的邊緣效應 –