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的编译器中发现并报告了一个错误,涉及泛型在多个单元中搞砸类型。这可能是相关的。谁能证实这一点?答案 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 的祖先,那么我会收到相同的错误消息,并且它会给出正确的行号。如果编译器给出错误的行号,则关闭项目,重新打开它并完成整个构建。