如何继承通用的虚方法?

时间:2016-05-18 19:03:46

标签: delphi generics inheritance delphi-xe2

我有以下代码。我想覆盖基础列表的Notify方法,以便能够在修改列表时创建一个事件。

  TDescendantList = class(TObjectList<TSomeclass>)
  private
    <...>
  protected
    procedure Notify(const Value: T;
      Action: TCollectionNotification); override;
    <...>
  end;

如果我提出Value: T,我会在T上获得 “未声明的标识符”

如果Value: TSomeClass我得到 “通知声明”与之前的声明“ 不同。

NotifyTObjectList<T: class>的受保护方法。此方法不会出现在XE2 IDE的重写列表中。

这是实现这个的一些方法,或者我需要使用另一种方法,因为这是一个众所周知的砖墙?

1 个答案:

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