无法覆盖TCollection.Notify:通知声明与之前的声明

时间:2018-01-19 16:09:50

标签: delphi tcollection

注意:other question的标题不同,这使其无法识别为匹配的标题。

System.Classes

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

MyUnit

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声明'通知'与以前的声明不同

在实施部分:

  

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

问题

Whai错了?

1 个答案:

答案 0 :(得分:9)

不幸的是,Delphi声明TCollectionNotification两次:一个驻留在 System.Classes 中,另一个驻留在 System.Generics.Collections 中。

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