2016-11-10 108 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

是的,当然,但使用这种方法,修改每个接口的实现是最容易的。 而不必修改使用图层的实现。这避免了对更复杂项目的边缘效应 –