如何继承泛型虚方法?
How to inherit generic virtual method?
我有以下代码。我想在此基础上覆盖基础列表的 Notify 方法,以便能够在列表修改时创建事件。
TDescendantList = class(TObjectList<TSomeclass>)
private
<...>
protected
procedure Notify(const Value: T;
Action: TCollectionNotification); override;
<...>
end;
如果我输入 Value: T
,我会在 T 上得到 "Undeclared identifier"。
如果是 Value: TSomeClass
我得到 "Declaration of 'Notify' differs from previous declaration".
Notify
是 TObjectList<T: class>
的受保护方法。此方法未出现在 XE2 IDE.
的覆盖列表中
这是实现这个的某种方法,还是我需要使用另一种方法,因为这是一堵众所周知的砖墙?
如果您的后代 class 正在修复通用类型,那么您必须使用该固定类型代替 T。在您的情况下:
protected
procedure Notify(const Value: TSomeclass;
Action: TCollectionNotification); override;
是声明此函数的正确方法。
错误:
Declaration of 'Notify' differs from previous declaration
是 Delphi RTL 在不同单元中重复类型名称的一个令人遗憾的案例。
单位System.Classes
定义
TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
和System.Generics.Collections
定义
TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);
几乎可以肯定,您在 uses
子句中 在 Classes
之前声明了 Generics.Collections
,并且编译器正在解析不需要的 [= 版本19=].
要修复它,请重新组织您的 uses
子句,以便 Generics.Collections
出现在 Classes
之后 或 使用完全限定的类型名称,即:
procedure Notify(const Value: TSomeClass;
Action: Generics.Collections.TCollectionNotification); override;
differs from previous declaration
错误的教训是有条不紊地检查你的类型。在类型标识符上 Ctrl+CLICK 将带您进入编译器正在使用的类型的定义。
我有以下代码。我想在此基础上覆盖基础列表的 Notify 方法,以便能够在列表修改时创建事件。
TDescendantList = class(TObjectList<TSomeclass>)
private
<...>
protected
procedure Notify(const Value: T;
Action: TCollectionNotification); override;
<...>
end;
如果我输入 Value: T
,我会在 T 上得到 "Undeclared identifier"。
如果是 Value: TSomeClass
我得到 "Declaration of 'Notify' differs from previous declaration".
Notify
是 TObjectList<T: class>
的受保护方法。此方法未出现在 XE2 IDE.
这是实现这个的某种方法,还是我需要使用另一种方法,因为这是一堵众所周知的砖墙?
如果您的后代 class 正在修复通用类型,那么您必须使用该固定类型代替 T。在您的情况下:
protected
procedure Notify(const Value: TSomeclass;
Action: TCollectionNotification); override;
是声明此函数的正确方法。
错误:
Declaration of 'Notify' differs from previous declaration
是 Delphi RTL 在不同单元中重复类型名称的一个令人遗憾的案例。
单位System.Classes
定义
TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
和System.Generics.Collections
定义
TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);
几乎可以肯定,您在 uses
子句中 在 Classes
之前声明了 Generics.Collections
,并且编译器正在解析不需要的 [= 版本19=].
要修复它,请重新组织您的 uses
子句,以便 Generics.Collections
出现在 Classes
之后 或 使用完全限定的类型名称,即:
procedure Notify(const Value: TSomeClass;
Action: Generics.Collections.TCollectionNotification); override;
differs from previous declaration
错误的教训是有条不紊地检查你的类型。在类型标识符上 Ctrl+CLICK 将带您进入编译器正在使用的类型的定义。