5

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

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

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

4

3 回答 3

10

您没有显示足够的代码,但显然正在发生的事情是您正在重新定义接口部分中的声明和方法实现之间的违规类型(TdatosTllave) 。Tmilitares这种重新声明要么以您的另一个单元的形式出现,要么在该单元use的实现部分中militares

找到那些其他声明,您将能够解决您的问题。


您在问题末尾的评论告诉我们:

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

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

于 2011-05-24T21:15:43.220 回答
0

以下作品。没有不匹配的先前声明。我怀疑您正在声明 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.
于 2011-05-24T21:47:35.430 回答
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 '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 中这样做时更糟糕。

于 2016-03-11T14:55:44.560 回答