【问题标题】:Cannot override TCollection.Notify: Declaration of Notify differs from previous declaration无法覆盖 TCollection.Notify:Notify 声明与之前的声明不同
【发布时间】:2018-06-28 22:26:00
【问题描述】:

注意:other question 的标题不同,因此无法识别为匹配的。

System.Classes

TCollection = class(TPersistent)
protected
  procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); virtual;
end;

我的单位

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.ExtCtrls, DB, System.Generics.Collections;

TTextDisplayLineInfos = class(TCollection)
protected
  procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; //Here "[dcc32 Error] MyUnit.pas(85): E2037 Declaration of 'Notify' differs from previous declaration"
end;

implementation

procedure TTextDisplayLineInfos.Notify(Item: TCollectionItem;
  Action: TCollectionNotification);
begin
  inherited; //Here "[dcc32 Error] MyUnit.pas(475): E2008 Incompatible types"
  //..............
end;

Notify方法的签名已经被复制粘贴了,所以不会有任何错误;

错误

在界面部分:

[dcc32 错误] MyUnit.pas(85): E2037 'Notify' 声明与之前的声明不同

在实施部分:

[dcc32 错误] MyUnit.pas(475): E2008 不兼容类型

问题

哪里错了?

【问题讨论】:

  • 右键单击错误的声明。显示的上下文菜单中的顶部项目应该类似于“查找声明”。单击它并找到“以前的”声明,看看它是否不同。原因可能是您在接口和实现部分中的声明不匹配,或者在范围内有另一个类 TCollection 比您要扩展的 TCollection 更接近,或者 TCollectionNotification 的不同声明,或者......或...... .
  • 那么中间一定有一个TCollection。找到 TCollection 的声明,看看它是否是您所期望的。此外,清除您的项目并查看搜索路径中的目录中是否存在具有相同名称的不同文件(即,某处的单元代码的不同版本,正在被拾取)。我使用免费的Everything 进行此类搜索。它非常快(通常是立竿见影的结果)。还要检查范围内某处是否有不同的 TCollectionNotification。

标签: delphi tcollection


【解决方案1】:

不幸的是,Delphi 两次声明了TCollectionNotification:一个位于 System.Classes 中,另一个位于 System.Generics.Collections 中。

要解决此问题,请将 System.Generics.Collections 移到您的 uses 子句中的 System.Classes 之前,或将其限定为 System.Classes.TCollectionNotification)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
相关资源
最近更新 更多