gpt4 book ai didi

delphi - 如何继承泛型虚方法?

转载 作者:行者123 更新时间:2023-12-03 14:50:38 24 4
gpt4 key购买 nike

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

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

如果我输入 Value: T我在 T 上收到“未声明的标识符”

如果是 Value: TSomeClass我收到“‘通知’声明与之前的声明不同”

NotifyTObjectList<T: class> 的 protected 方法。该方法不会出现在 XE2 IDE 的重写列表中。

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

最佳答案

如果您的后代类正在修复泛型类型,那么您必须使用该固定类型来代替 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 子句中 before 声明了 Generics.Collections,并且编译器正在解析不需要的 TCollectionNotification 版本。

要修复此问题,请重新组织 uses 子句,使 Generics.Collections 位于 Classes use 之后完全限定的类型名称,即:

  procedure Notify(const Value: TSomeClass;
Action: Generics.Collections.TCollectionNotification); override;
<小时/>

与之前的声明错误不同的教训是有条不紊地检查您的类型。类型标识符上的 Ctrl+CLICK 将带您到编译器正在使用的类型的定义。

关于delphi - 如何继承泛型虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com