如何在Delphi 2010下设置泛型类型的前向声明?

时间:2011-05-19 08:20:26

标签: delphi generics forward-declaration

我遇到了一个看似非常经典的问题:一个项目和一个集合类,它们都是相互引用的,需要一个前向声明。我正在使用Delphi 2010和更新5.

这适用于非泛型类,但我无法使用泛型类型解决E2086错误:

type
  // Forward declarations
  TMyElement = class; // E2086: Type 'TMyElement' is not yet completely defined

  TMyCollection<T:TMyElement> = class
    //
  end;

  TMyElement = class
    FParent: TMyCollection<TMyElement>;
  end;

切换类声明顺序时会出现同样的问题。

我在此处或在QualityCentral中未找到任何对此问题的引用(找到了E2086的其他问题,但与此用例无关)

我现在唯一的解决方法是将父项声明为TObject,并在需要时将其强制转换为集合泛型类型(不是一个干净的解决方案......)

您是如何解决此问题的,或者向前声明您的泛型类?

谢谢,

[编辑2011年10月22日]跟进QualityCentral: 我在质量中心here

中报告了这个错误

最近EMB已经关闭了以下解决方案状态: 决议:按设计 已在建立时解决:16.0.4152

我只有Delphi 2010.有人可以确认它已在Delphe XE2 Update1中修复,还是意味着它按预期工作?

[编辑2011年10月23日] EMB的最终答案: EMB今天证实,实际的Delphi编译器使用泛型类型的前向声明不支持。您可以在QC中看到他们的答案,并提供上面提供的链接。

2 个答案:

答案 0 :(得分:13)

你可以通过声明一个祖先类来解决它:

type
  TBaseElement = class
  end;

  TMyCollection<T: TBaseElement> = class
  end;

  TMyElement = class(TBaseElement)
  private
    FParent: TMyCollection<TBaseElement>;
  end;

答案 1 :(得分:0)

看起来Delphi避免转发与泛型相关的转发课程。

您也可以考虑创建非通用的TMyCollectionBase类,通过移动所有不依赖于T类型的代码,可以使用一些虚函数来扩充它,以便理想地使其完全由FParent引用时所需。我在想C ++,但是当TMyCollection用于存储多种类型的项目时,它可能会减少生成代码的大小。