2
   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 的编译器中发现并报告了一个错误,其中涉及泛型在多个单元中搞砸了类型。这可能是相关的。谁能证实这一点?

4

2 回答 2

2

TObjectList<> 的定义是:

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)有时由于不可见字符而导致行号错误。但我认为这仍然无效。

于 2008-12-21T19:19:55.750 回答
1

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

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

于 2008-12-21T20:56:37.647 回答