相关疑难解决方法(0)

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

我遇到了一个看似非常经典的问题:一个项目和一个集合类,它们都相互引用,需要一个前向声明.我正在使用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;
Run Code Online (Sandbox Code Playgroud)

切换类声明顺序时会发生同样的问题.

我在这里或在QualityCentral中没有找到任何对此问题的引用(发现了E2086的其他问题,但与此用例无关)

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

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

谢谢,

[编辑2011年10月22日]跟进QualityCentral: 我在这里报告了质量中心的这个错误

EMB最近已经关闭,其解决方案状态如下:解决方案:已设计已解决的内容:16.0.4152

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

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

delphi generics forward-declaration

14
推荐指数
1
解决办法
4037
查看次数

Delphi:泛型后代的通用列表,并将泛型作为参数

我对于仿制药的理解以及它们如何能够和不能被使用有点挣扎.

我有一个通用类TControlMediator,如下所示:

TControlMediator<C, T> = class
private
  FMediatedComponent: C;
public
  constructor Create(ComponentToMediate: C);

  function GetValue: T; virtual; abstract;
  procedure SetValue(Value: T); virtual; abstract;

  property MediatedControl: C read FMediatedComponent;
end;
Run Code Online (Sandbox Code Playgroud)

然后我为每个我想调解的控件类型制作'concret'子类:

TEditMediator = class(TControlMediator<TEdit, string>)
public
  function GetValue: string; override;
  procedure SetValue(Value: string); override;
end;
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切似乎都运作正常.但是,当我想要一个TControlMediator后代列表,或者将TControlMediator作为方法的参数时,会出现问题:

TViewMediator = class
private
  FControlMediators: TList<TControlMEdiator<C, T>>;
public
  procedure registerMediator(AControlMediator: TControlMediator<C, T>);
  procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;
Run Code Online (Sandbox Code Playgroud)

编译器因致命错误而停止:

[DCC Error] mediator.pas(23): E2003 Undeclared identifier: 'C'
[DCC Error] mediator.pas(28): E2007 Constant or type identifier expected
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何做到这一点?

delphi generics delphi-2010

3
推荐指数
1
解决办法
1692
查看次数