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

标签 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 编译器中的一个错误,该错误涉及跨多个单元的泛型搞乱类型。这可能是相关的。谁能证实这一点?

最佳答案

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 吗?

在过去,(阅读涡轮帕斯卡)有时行号会因为不可见的字符而出现错误。但我认为这仍然有效。

关于delphi - 如何使通用对象列表从特定基类工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384690/

相关文章:

delphi - 如何在 Delphi 7 中使窗体上的画线不可见

delphi - 如何动态创建与顶部对齐但在其他对齐控件之后的控件?

delphi - TDelphiTwain 组件,损坏 delphi 表单(dfm 文件)

德尔福XE6 "Error reading form"

typescript - 如何组合传递的泛型类型的属性

Java函数设置未知类型的数组列表

java - 泛型实际上如何像参数一样工作?

Delphi:从什么时候开始,接口(interface)引用不再在 with block 末尾释放?

listview - 如何更改 TListGroups 中的组顺序?

delphi - TObject 包含哪些数据?