我有以下代码。我想覆盖基础列表的Notify方法,以便能够在修改列表时创建一个事件。
TDescendantList = class(TObjectList<TSomeclass>)
private
<...>
protected
procedure Notify(const Value: T;
Action: TCollectionNotification); override;
<...>
end;
如果我提出Value: T
,我会在T上获得 “未声明的标识符” 。
如果Value: TSomeClass
我得到 “通知声明”与之前的声明“ 不同。
Notify
是TObjectList<T: class>
的受保护方法。此方法不会出现在XE2 IDE的重写列表中。
这是实现这个的一些方法,或者我需要使用另一种方法,因为这是一个众所周知的砖墙?
答案 0 :(得分:15)
如果您的后代类正在修复泛型类型,那么您必须使用该固定类型代替T.在您的情况下:
protected
procedure Notify(const Value: TSomeclass;
Action: TCollectionNotification); override;
是声明此功能的正确方法。
错误:
“通知”声明与之前的声明不同
是Delphi RTL在不同单元中复制类型名称的遗憾情况。
单位System.Classes
定义
TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
和System.Generics.Collections
定义
TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);
几乎可以肯定, 要解决此问题,请重新组织 Generics.Collections
子句中 Classes
之前已uses
声明了,并且编译器正在解析不需要的TCollectionNotification
版本。< / p>
uses
条款,以便在Generics.Collections
或之后Classes
使用完全限定的类型名称,即: procedure Notify(const Value: TSomeClass;
Action: Generics.Collections.TCollectionNotification); override;
differs from previous declaration
错误的教训是有条不紊地检查您的类型。类型标识符上的 Ctrl + CLICK 将带您进入编译器正在使用的类型的定义。