接口的多重继承
Multiple inheritance for interfaces
有没有办法定义一个继承自两个或多个接口的接口?
我在 Delphi2007 上尝试了以下代码:
IInterfaceA = interface
procedure A;
end;
IInterfaceB = interface
procedure B;
end;
IInterfaceAB = interface(IInterfaceA, IInterfaceB);
.. 它引发了 E2029 错误:
E2029 ')' expected but ',' found
行:
IInterfaceAB = interface(IInterfaceA, IInterfaceB)
.
Delphi 中没有多重接口继承,因为 Delphi 中根本没有多重继承。您所能做的就是让一个 class 一次实现多个接口。
TMyClass = class(TInterfacedObject, IInterfaceA, IInterfaceB)
在Delphi中接口不能继承多个接口,但是类可以实现多个接口。如果你正确地设计你的组件(查找 ISP - 接口隔离原则)你应该不需要从接口继承接口。
恕我直言,在这种情况下,您必须定义三种类型。
每个接口一个,第三个用于多重继承:
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;
有没有办法定义一个继承自两个或多个接口的接口?
我在 Delphi2007 上尝试了以下代码:
IInterfaceA = interface
procedure A;
end;
IInterfaceB = interface
procedure B;
end;
IInterfaceAB = interface(IInterfaceA, IInterfaceB);
.. 它引发了 E2029 错误:
E2029 ')' expected but ',' found
行:
IInterfaceAB = interface(IInterfaceA, IInterfaceB)
.
Delphi 中没有多重接口继承,因为 Delphi 中根本没有多重继承。您所能做的就是让一个 class 一次实现多个接口。
TMyClass = class(TInterfacedObject, IInterfaceA, IInterfaceB)
在Delphi中接口不能继承多个接口,但是类可以实现多个接口。如果你正确地设计你的组件(查找 ISP - 接口隔离原则)你应该不需要从接口继承接口。
恕我直言,在这种情况下,您必须定义三种类型。 每个接口一个,第三个用于多重继承:
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;