当编译器看起来完全相同时,为什么会说实现“与先前的声明不同”?

问题描述

| 我有两个单位, 第一个,我的界面:
use personas

interface

type
  Tllave = array[0..31] of byte;
  Tdatos = array of byte;

  ImyInterface = interface(IInterface)

    function nombre : string;
    function edad : integer;
    procedure resetear;
    function Proceso(datos : tdatos; cantidad : integer) : integer ;    
    procedure Iniciar(llave : Tllave);
  end;
第二单元,我的对象声明:
use militares

interface

uses personas;

type

  Tmilitares = Class(TInterfacedObject,ImyInterface )
    public
      function nombre : string;
      function edad : integer;
      procedure resetear;
      function Proceso(datos : Tdatos; cantidad : integer) : integer ;    
      procedure Iniciar(llave : Tllave);
    published
      constructor create;
  end;

implementation

function tmilitares.Proceso(datos : tdatos; cantidad : integer) : integer ; // getting error !!
begin
  // ....
end;


procedure tmilitares.Iniciar(llave : Tllave); // getting error!!
begin
  // ....
end;
我仅在\'proceso \'函数和\'iniciar \'过程中收到错误消息: 'Iniciar \'的声明与以前的声明不同 'Proceso \'的声明与以前的声明不同。 我注意到他们有数组参数。参数的类型在第一个单元中定义,如果我在第二个单元中定义了这些类型,则会遇到相同的错误,但是会在对象的声明中显示。我该如何编译?     

解决方法

您没有显示足够的代码,但是很明显,这是在接口部分中的
Tmilitares
声明与方法实现之间重新定义了令人反感的类型(
Tdatos
Tllave
)。该重新声明可以是您
use
的另一个单元的形式,也可以是
militares
单元的实现部分的形式。 找到其他声明,您将能够解决您的问题。 问题末尾的评论表明:   如果我在第二个单元中定义了这些类型,则会遇到相同的错误,但是会在类的声明中显示。 您尝试重新定义类型的事实表明存在理解问题。类型只需要声明一次。一旦定义了两次,您将拥有两种截然不同的不兼容类型。更糟糕的是,它们具有相同的名称!定义一次类型,然后通过“ 7”语句将其导入其他单元。     ,以下作品。没有没有匹配的先前声明。我怀疑您在声明iMyInterface.SomeProcedure(在我的示例中为unit1),其参数与在实现接口(在我的示例中为unit2)的类中显示的参数略有不同。请注意,任何实现ImyInterface的东西都必须实现全部。 单元1:
unit Unit1;


interface

type   
  Tllave = array[0..31] of byte;  

  Tdatos = array of byte;

  ImyInterface = interface(IInterface)

    function nombre : string;
    function edad : integer;
    procedure resetear;
    function Proceso(datos : tdatos; cantidad : integer) : integer ;
    procedure Iniciar(llave : Tllave);   end;

implementation


  //stuff.

end.
单元2:
unit Unit2;

interface

{$M+}

uses Unit1;

type

  Tmilitares = Class(TInterfacedObject,ImyInterface )
    public
      function nombre : string;
      function edad : integer;
      procedure resetear;
      function Proceso(datos : Tdatos; cantidad : integer) : integer ;    
      procedure Iniciar(llave : Tllave);
    published
      constructor create;
  end;

implementation


function Tmilitares.nombre: string;
begin

end;

function tmilitares.Proceso(datos : tdatos; cantidad : integer) : integer ; // no more error 
begin
  // ....
end;


constructor Tmilitares.create;
begin

end;

function Tmilitares.edad: integer;
begin

end;

procedure Tmilitares.resetear;
begin

end;

procedure tmilitares.Iniciar(llave : Tllave); // no more error.
begin
  // ....
end;

end.
    ,我将其作为答案添加在这里,因为这是一个非常相似的问题,但是我只是在一个看起来像这样的单元中遇到了这个问题:
unit Unit1;

interface
  uses Generics.Collections;

type
  TFoo = class
  end;

  TFooList = class(TObjectList<TFoo>)
    protected
      procedure Notify(const Item: TFoo; Action: TCollectionNotification); override;
  end;

implementation

uses Classes;

procedure TFooList.Notify(const Item: TFoo; Action: TCollectionNotification);
var
 sl : TStringList;
begin
  //
end;

end.
  [dcc32错误] Unit1.pas(20):E2037 \'Notify \'的声明与以前的声明不同   [dcc32错误] Unit1.pas(12):E2065不满意的转发或外部声明:\'TFooList.Notify \'   [dcc32致命错误] Project1.dpr(6):F2063无法编译使用的单元\'Unit1.pas \' 我花了比我想承认要花更长的时间
System.Classes :: TCollectionNotification = (cnAdded,cnExtracting,cnDeleting);
和一个:
System.Generics.Collections :: TCollectionNotification = (cnAdded,cnRemoved,cnExtracted);
课程是有条不紊地检查您的类型。类型标识符上的Ctrl + CLICK将带您进入编译器正在使用的类型的定义。要解决此问题,请重新组织
uses
子句或使用完全限定的类型名称。 当在我们自己的代码中出现复制类型名称的新手错误时,这已经足够糟糕了;而当Emba在其自己的RTL中使用类型名称进行复制时,这个问题就变得更加糟糕了。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...