接口助手或委托接口父级

时间:2010-04-20 21:28:43

标签: delphi interface

如果我有一个由第三方实现的现有IInterface后代,并且我想添加帮助程序,Delphi是否提供了任何简单的方法来实现,而无需手动重定向每个接口方法?也就是说,给定一个这样的界面:

IFoo = interface
  procedure Foo1;
  procedure Foo2;
  ...
  procedure FooN;
end;

是否支持以下类似内容?

IFooHelper = interface helper for IFoo
  procedure Bar;
end;

IFooBar = interface(IFoo)
  procedure Bar;
end;

TFooBar = class(TInterfacedObject, IFoo, IFooBar)
private
  FFoo: IFoo;
public
  procedure Bar;
  property Foo: IFoo read FFoo implements IFoo;
end;

我特别想知道如何允许我总是用单个变量引用(IFoo,IFooBar或TFooBar)调用Foo1,Foo2和Bar,而不在它们之间切换,并且不添加所有IFoo的方法TFooBar。

3 个答案:

答案 0 :(得分:1)

将您的课程更改为:

TFooBar = Class(TInterfacedObject, IFoo, IFooBar)
private
  FFoo: IFoo;
public
  procedure Bar;
  property Foo: IFoo read FFoo implements IFoo ;
end;

您还需要一个构造函数或一些方法来创建IFoo实例并将其放在FFoo中。

答案 1 :(得分:1)

您无法通过对 TFooBar 的引用来访问 IFoo 的方法,因为 TFooBar 未实现< em> IFoo - 它委派 IFoo 。但是你不应该使用 TFooBar 引用来访问接口对象,这就是首先使用接口的全部意义!

注意:为了故意防止这种情况,我采用了一种在我的类上实现接口方法为“受保护”的约定,特别是拒绝访问那些实现细节,除非通过接口本身浮出来。

如果您目前正在获取对 TFooBar 的引用,请将其更改为获取 TFooBar实现的 IFooBar 界面,您将被排序。

答案 2 :(得分:0)

我不确定我理解你所有的担忧,但无论如何,这是我的建议:

IFooBar = interface(IFoo)
  procedure Bar;
end;

TFooDelegate = class(TInterfacedObject, IFoo )
private
  FFoo: IFoo;
public
  property Foo: IFoo read FFoo implements IFoo;
end;

TFooBar = class( TFooDelegate, IFooBar )
  procedure Bar;
end;