2010-04-20 43 views
2

如果我有一个由第三方实现的现有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; 

我特别想知道的方式,让我始终调用Foo1和Foo2,并用单变量引用(的IFoo,IFooBar,或TFooBar)吧,不在它们之间切换,并且不需要将所有IFoo的方法添加到TFooBar中。

回答

1

更改类阅读:

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

您还需要一个构造函数或一些方法来创建的IFoo的实例,并把它放在FFoo。

+0

“类VS接口”和缺少“阅读FFoo”是错别字。即使纠正它们,该示例也不起作用。如果我有TFooBar的引用,我不能调用“FooBar.Foo1”;它被认为是未公开的。 – 2010-04-20 23:07:08

+0

我相信你需要在IFooBar中重新声明IFoo的程序,如果你想使用IFooBar并让它们暴露。 – skamradt 2010-04-20 23:15:17

+2

Skamradt是对的。 Delphi中没有“Interface Helper”。如果有的话,这将是很好的。尝试在QC中添加它。 – 2010-04-20 23:48:37

1

您无法通过参考访问的IFoo的方法TFooBar因为TFooBar没有实现的IFoo - 它代表IFoo的。但是,不应该使用引用来访问接口对象,这就是首先使用接口的全部要点!

注:要刻意避免这一点,我通过我的类实现接口的方法为“受保护”的惯例,特别是拒绝访问的实现细节除了通过接口本身浮出水面。

在哪里,无论你正在获得到TFooBar的参考,将其更改为,而不是获得由TFooBar实施IFooBar界面,你会进行排序。

+0

显然,我的职务还不清楚。我有一个来自第三方的'IFoo',我不能控制它。我想添加更多的辅助函数,就像一个类助手一样。 TFooBar和IFooHelper是我的建议语法如何发生。 – 2010-04-21 02:16:11

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;