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/