如何在不重新实现方法的情况下从外部接口继承接口
How to inherit a Interface from foreign Interface without reimplementing the Methods
我想创建一个接口对象,它支持来自其他地方的接口 + 我自己的函数。那么,如何stack/aggregate/enhance接口呢?我猜这是可能的,但我找不到特定于我的继承实验的片段或演示。
这个解决方案不是我想要的:
TImplement = Class(TInterfacedObject, IOne, ITwo)
private
FOne: IOne;
public
property One: IOne read FOne implements IOne;
property Two: ITwo read FTwo implements ITwo;
end;
当前使用情况:
(MyInterface as IOne).Something;
(MyInterface as ITwo).SomethingElse;
所需用法:
MyInterface.Something;
MyInterface.SomethingElse;
我尝试继承接口:
ITogether = Interface(IOne)
procedure SomeThingElse;
end:
TImplement = Class(TInterfacedObject, ITogether)
// or Class(TInterfacedObject, ITogether, IOne) => Both result in missing Implementation message on compile ...
private
FOne: IOne;
function SomeThingElse;
public
property One: IOne read FOne implements IOne;
end;
这个组合类似于:
E2291 Implementation of Method x From Interface IOne missing.
是否可以以某种方式组合接口,以便可以进行“无演员表”调用?
编辑:
Rob Lambden 的回答对我来说是缺少的信息。 Uwe Raabes 答案是正确的实施。 (而且可能是唯一可能的)
所以 uwe 赢得了答案,我只能投票支持 Robs 的答案。
您可以实现 IOne 方法并将它们转发到 FOne 接口。
type
IOne = interface
['{19F785C0-5D2E-479F-BB2C-88A00BA4C812}']
procedure Something;
end;
ITogether = interface(IOne)
['{B8B7F690-DC98-41AB-A6D9-29F70330EDA5}']
procedure SomethingElse;
end;
type
TTogether = class(TInterfacedObject, ITogether)
private
FOne: IOne;
protected
property One: IOne read FOne;
public
constructor Create(AOne: IOne);
procedure SomethingElse;
procedure Something;
end;
constructor TTogether.Create(AOne: IOne);
begin
inherited Create;
FOne := AOne;
end;
procedure TTogether.Something;
begin
One.Something;
end;
procedure TTogether.SomethingElse;
begin
{ Do something else }
end;
AFAIK,当 实现者 是一个接口 属性.
时,没有像 implements
这样的语言结构可以为你做到这一点
更新:
如果你有几个需要扩展 IOne 接口的情况,你可以编写一个包装器 class,它反过来成为 实现的一个很好的候选者 关键字。
type
TOneWrapper = class
private
FOne: IOne;
protected
property One: IOne read FOne;
public
constructor Create(AOne: IOne);
procedure Something;
end;
type
TTogether = class(TInterfacedObject, ITogether)
private
FOne: TOneWrapper;
protected
property One: TOneWrapper read FOne implements ITogether;
public
constructor Create(AOne: IOne);
destructor Destroy; override;
procedure SomethingElse;
end;
constructor TTogether.Create(AOne: IOne);
begin
inherited Create;
FOne := TOneWrapper.Create(AOne);
end;
destructor TTogether.Destroy;
begin
FOne.Free;
inherited Destroy;
end;
procedure TTogether.SomethingElse;
begin
{ Do something else }
end;
constructor TOneWrapper.Create(AOne: IOne);
begin
inherited Create;
FOne := AOne;
end;
procedure TOneWrapper.Something;
begin
One.Something;
end;
您的问题似乎与两件事有关。首先是关于 调用 方法而无需强制转换。
只需使用对象引用,您就可以做到这一点。
MyObject:=TImplements.Create;
MyObject.Something;
MyObject.SomethingElse;
其次是实现一个接口而不必重新实现函数。
Delphi 根据定义,接口不能包含实现。 (方法必须是抽象的,或者用 C++ 术语来说,它们是 'pure virtual')。
这意味着您不能像使用 C++ 那样执行多重继承类型实现。任何实现接口的对象都必须实现所有实现函数......或......
您 可以 将接口委托给 属性 ,如果您这样做,如果您使用该对象,您仍然可以调用这些方法而无需强制转换参考。
我想创建一个接口对象,它支持来自其他地方的接口 + 我自己的函数。那么,如何stack/aggregate/enhance接口呢?我猜这是可能的,但我找不到特定于我的继承实验的片段或演示。
这个解决方案不是我想要的:
TImplement = Class(TInterfacedObject, IOne, ITwo)
private
FOne: IOne;
public
property One: IOne read FOne implements IOne;
property Two: ITwo read FTwo implements ITwo;
end;
当前使用情况:
(MyInterface as IOne).Something;
(MyInterface as ITwo).SomethingElse;
所需用法:
MyInterface.Something;
MyInterface.SomethingElse;
我尝试继承接口:
ITogether = Interface(IOne)
procedure SomeThingElse;
end:
TImplement = Class(TInterfacedObject, ITogether)
// or Class(TInterfacedObject, ITogether, IOne) => Both result in missing Implementation message on compile ...
private
FOne: IOne;
function SomeThingElse;
public
property One: IOne read FOne implements IOne;
end;
这个组合类似于:
E2291 Implementation of Method x From Interface IOne missing.
是否可以以某种方式组合接口,以便可以进行“无演员表”调用?
编辑: Rob Lambden 的回答对我来说是缺少的信息。 Uwe Raabes 答案是正确的实施。 (而且可能是唯一可能的) 所以 uwe 赢得了答案,我只能投票支持 Robs 的答案。
您可以实现 IOne 方法并将它们转发到 FOne 接口。
type
IOne = interface
['{19F785C0-5D2E-479F-BB2C-88A00BA4C812}']
procedure Something;
end;
ITogether = interface(IOne)
['{B8B7F690-DC98-41AB-A6D9-29F70330EDA5}']
procedure SomethingElse;
end;
type
TTogether = class(TInterfacedObject, ITogether)
private
FOne: IOne;
protected
property One: IOne read FOne;
public
constructor Create(AOne: IOne);
procedure SomethingElse;
procedure Something;
end;
constructor TTogether.Create(AOne: IOne);
begin
inherited Create;
FOne := AOne;
end;
procedure TTogether.Something;
begin
One.Something;
end;
procedure TTogether.SomethingElse;
begin
{ Do something else }
end;
AFAIK,当 实现者 是一个接口 属性.
时,没有像implements
这样的语言结构可以为你做到这一点
更新: 如果你有几个需要扩展 IOne 接口的情况,你可以编写一个包装器 class,它反过来成为 实现的一个很好的候选者 关键字。
type
TOneWrapper = class
private
FOne: IOne;
protected
property One: IOne read FOne;
public
constructor Create(AOne: IOne);
procedure Something;
end;
type
TTogether = class(TInterfacedObject, ITogether)
private
FOne: TOneWrapper;
protected
property One: TOneWrapper read FOne implements ITogether;
public
constructor Create(AOne: IOne);
destructor Destroy; override;
procedure SomethingElse;
end;
constructor TTogether.Create(AOne: IOne);
begin
inherited Create;
FOne := TOneWrapper.Create(AOne);
end;
destructor TTogether.Destroy;
begin
FOne.Free;
inherited Destroy;
end;
procedure TTogether.SomethingElse;
begin
{ Do something else }
end;
constructor TOneWrapper.Create(AOne: IOne);
begin
inherited Create;
FOne := AOne;
end;
procedure TOneWrapper.Something;
begin
One.Something;
end;
您的问题似乎与两件事有关。首先是关于 调用 方法而无需强制转换。
只需使用对象引用,您就可以做到这一点。
MyObject:=TImplements.Create;
MyObject.Something;
MyObject.SomethingElse;
其次是实现一个接口而不必重新实现函数。
Delphi 根据定义,接口不能包含实现。 (方法必须是抽象的,或者用 C++ 术语来说,它们是 'pure virtual')。
这意味着您不能像使用 C++ 那样执行多重继承类型实现。任何实现接口的对象都必须实现所有实现函数......或......
您 可以 将接口委托给 属性 ,如果您这样做,如果您使用该对象,您仍然可以调用这些方法而无需强制转换参考。