如何继承泛型虚方法?

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".

NotifyTObjectList<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 将带您进入编译器正在使用的类型的定义。