为什么编译器说它们看起来相同时实现“与之前的声明不同”?

时间:2011-05-24 20:58:48

标签: arrays delphi interface parameters tinterfacedobject

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

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”的声明与之前的声明不同。

我注意到他们有阵列参数。参数的类型在第一个单元中定义,如果我在第二个单元中定义这些类型,我得到相同的错误,但它在对象的声明中显示。我怎么编译?

3 个答案:

答案 0 :(得分:10)

您没有显示足够的代码但显然正在发生的事情是您正在重新定义接口部分中Tdatos声明之间的违规类型(TllaveTmilitares)方法的实施。此重新声明可以是您use的另一个单元格式,也可以是militares单元的实施部分。

查找其他声明,您就能解决问题。


您在问题末尾的评论是:

  

如果我在第二个单元中定义这些类型,我会得到相同的错误,但它会显示在类的声明中。

您尝试重新定义类型的事实表明存在理解问题。类型需要一次性声明一次。一旦定义它们两次,现在有两种不同的不兼容类型。更糟糕的是,他们有相同的名字!定义一次类型并通过uses语句将其导入其他单位。

答案 1 :(得分:0)

以下作品。没有先前的声明,不匹配。我怀疑你是在声明iMyInterface.SomeProcedure(在我的例子中是unit1),其参数与你在实现接口的类(在我的例子中为unit2)部分中显示的参数略有不同。请注意,实现ImyInterface的任何内容都必须实现 ALL

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.

UNIT2:

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.

答案 2 :(得分:0)

我在这里添加这个作为答案,因为这是一个非常类似的问题,但我刚刚在一个看起来像这样的单元中遇到了这个:

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声明&#39;通知&#39;与以前的声明不同   [dcc32错误] Unit1.pas(12):E2065不满意的前向或外部声明:&#39; TFooList.Notify&#39;   [dcc32致命错误] Project1.dpr(6):F2063无法编译使用过的单位&#39; Unit1.pas&#39;

我花了更长的时间才愿意承认有一个

System.Classes :: TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);

和a:

System.Generics.Collections :: TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);

课程是有条不紊地检查你的类型。类型标识符上的 Ctrl + CLICK 将带您进入编译器正在使用的类型的定义。要解决此问题,请重新组织uses子句或使用完全限定的类型名称。

在我们自己的代码中出现重复类型名称的新手错误时已经足够糟糕了,当Emba在他们自己的RTL中执行它时,这是非常糟糕的。