如何使特定基类的通用对象列表工作?

时间:2008-12-21 17:18:58

标签: delphi generics delphi-2009

   TMyDataList<T: TBaseDatafile, constructor> = class(TObjectList<TBaseDatafile>)
   public
      constructor Create;
      procedure upload(db: TDataSet);
   end;

我在博客文章中读到(我现在不记得),这是为通用对象声明具有特定基类型的基于泛型的类的方法。编译器会接受它就好了。但是当我尝试使用它时,它决定不合作。

type
   TDescendantList = TMyDataList<TDescendantDatafile>;

这给我一个编译器错误。

[DCC错误] my_database.pas(1145):E2010不兼容的类型:'TDescendantDatafile'和'TBaseDatafile'

事实是,1145甚至不是一个有效的行。有问题的文件在#1142结束,它抱怨的类型声明在#20行。这让我想知道它是否是一个编译器故障。或者我只是没有正确的语法?有没有人知道如何使这项工作?

编辑:吉姆指出,当他尝试它时编译好。更多信息:我有基本数据文件类型和在同一单元中声明的通用列表,而TDescendantDatafile在第二个单元中,TDescendantList在第三个单元中定义。我已经在D2009的编译器中发现并报告了一个错误,涉及泛型在多个单元中搞砸类型。这可能是相关的。谁能证实这一点?

2 个答案:

答案 0 :(得分:2)

TObjectList&lt;&gt;的定义是:

TObjectList<T: class> = class(TList<T>)

所以你喜欢做类似的事情:

TMyDataList<T: TBaseDatafile> = class(TObjectList<T>)

不幸的是,这不起作用。幸运的是:

TMyDataList<T: class> = class(TObjectList<T>)

有效,但这可能不是你想要的。因为它不会利用类类型。我真的认为类说明符在这里有点奇怪。 (TObject应该避免这些问题)。但这对你没有帮助。

然后,以下工作:

  TBaseDataFile = class
  end;

  TDescendantDatafile = class (TBaseDataFile)
  end;

  TMyDataList<T: TBaseDataFile> = class(TObjectList<TBaseDataFile>)
  public
    constructor Create;
  end;

您确定TDescendantDataFile是否继承自TBaseDataFile?

在过去,(读turbo pascal)有时因为看不见的字符而错误的行号。但我不认为这仍然有效。

答案 1 :(得分:1)

TDescendantDatafile TBaseDataFile 下载时,它在我的机器上正常工作。检查您的类层次结构。

如果我更改了 TDescendantDatafile 的祖先,那么我会收到相同的错误消息,并且它会给出正确的行号。如果编译器给出错误的行号,则关闭项目,重新打开它并完成整个构建。