【问题标题】:How to inherit generic virtual method?如何继承泛型虚方法?
【发布时间】:2016-05-18 19:03:45
【问题描述】:

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

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

如果我输入Value: T,我会在 T 上得到一个“未声明的标识符”

如果是Value: TSomeClass,我会收到“'Notify' 的声明与之前的声明不同”

NotifyTObjectList&lt;T: class&gt; 的受保护方法。此方法不会出现在 XE2 IDE 的覆盖列表中。

这是实现这一点的某种方法,还是我需要使用另一种方法,因为这是众所周知的砖墙?

【问题讨论】:

    标签: delphi generics inheritance delphi-xe2


    【解决方案1】:

    如果您的后代类正在修复泛型类型,那么您必须使用该固定类型代替 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);
    

    几乎可以肯定,您在uses 子句中 Classes 声明了Generics.Collections,并且编译器正在解析不需要的TCollectionNotification 版本。

    要修复它,要么重新组织您的 uses 子句,使 Generics.Collections 出现在 Classes 之后使用完全限定的类型名称,即:

      procedure Notify(const Value: TSomeClass;
        Action: Generics.Collections.TCollectionNotification); override;
    

    differs from previous declaration 错误的教训是有条不紊地检查你的类型。类型标识符上的 Ctrl+CLICK 将带您进入编译器正在使用的类型的定义。

    【讨论】:

    • 完美!我做了两件事:重新组织了uses 子句 AND 放入完全限定的名称。 +1 并接受
    • 在 RAD Studio 10.4 中`TCollectionNotification = (cnAdding, cnAdded, cnExtracting, cnExtracted, cnDeleting, cnRemoved);`
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多