如何确定接口的实现对象的类型

时间:2011-03-04 16:43:45

标签: delphi delphi-2009 typechecking dunit

我正在尝试为一个简单的工厂类编写单元测试,该工厂类创建几个可能的实现对象之一并将其作为接口引用返回。

DUnit有一个内置过程CheckIs(AObject: TObject; AClass: TClass; msg: string),如果对象的类类型与预期的类型不匹配,则基于其名称及其接受的参数将导致测试失败。唯一的问题是它需要一个对象引用而不是一个接口引用。

所以我正在尝试使用CheckTrue并在测试主体中进行比较,但我不熟悉Delphi的类型检查支持,就像我使用C#一样。

我知道is运算符是不可能的,因为它只适用于对象引用。

CheckTrue(LMyInterfaceReference {comparison here} TMyClass);

有什么建议吗?

顺便说一下,我正在使用Delphi 2009,所以我无法访问2010年增加的新RTTI支持。

3 个答案:

答案 0 :(得分:4)

我想知道为什么你必须要测试这个...也许你真的不需要。

但是如果知道接口的底层对象是必须的,那么你有两个选择:

  • 向接口添加一个方法,该方法返回底层对象,只返回TObject,并通过返回self在每个类中实现它。
  • 哈哈,例如使用这个Interface to object例程。

答案 1 :(得分:4)

如果你不喜欢黑客并且不想升级到Delphi 2010+,你可以使用这样的界面:

IImplementingObjectInterface = interface
  function GetImplementingObject: TObject;
end;

确保您的对象也实现此接口并使用它来提取实现对象。如果您需要为很多对象执行此操作,您可以定义已经实现此功能的TInterfacedObject派生,这样您就可以简单地更改继承并完成。

答案 2 :(得分:1)

Barry Kelly(主要的Embarcadero Delphi编译工程师之一)本周写了一篇不错的An ugly alternative to interface to object casting

它回答了你的问题。

有趣的是Hallvard Vassbotn写了very similar piece of code back in 2004

从Delphi 2010开始,您可以使用is检查或as强制转换从接口引用返回到对象引用。

- 的Jeroen