Почему компилятор говорит, что реализация «отличается от предыдущего объявления», когда они выглядят одинаково? - PullRequest
5 голосов
/ 25 мая 2011

у меня есть две единицы, первый, мой интерфейс:

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;

Я получаю сообщение об ошибке только в функции «procso» и процедуре «iniciar»:

декларация 'Iniciar' отличается от предыдущей декларации
декларация 'Proceso' отличается от предыдущей декларации.

Я заметил, что у них есть параметр массива. Тип параметра определяется в первом блоке, если я определяю эти типы во втором блоке, я получаю ту же ошибку, но это показано в объявлении объекта. как я могу скомпилировать?

Ответы [ 3 ]

10 голосов
/ 25 мая 2011

Вы не показываете достаточно кода, но ясно, что происходит то, что вы переопределяете типы-нарушители (Tdatos и Tllave) между объявлением Tmilitares в разделе интерфейса и реализацией методов.Это повторное объявление либо в форме другого модуля, который вы use, либо в разделе реализации блока militares.

Найдите эти другие объявления, и вы сможете решить свою проблему.


Ваш комментарий в конце вашего вопроса говорит:

Если я определяю эти типы во втором блоке, я получаю ту же ошибку, но она отображается в объявлениикласс.

Тот факт, что вы пытались переопределить типы, указывает на проблему понимания.Типы должны быть объявлены только один раз.Как только вы определили их дважды, теперь у вас есть два разных несовместимых типа.Что еще хуже, у них одно имя!Определите тип один раз и импортируйте его в другие единицы с помощью оператора uses.

0 голосов
/ 11 марта 2016

Я добавляю это как ответ здесь, потому что это очень похожая проблема, но я просто столкнулся с этим в блоке, который выглядит так:

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 Декларация «Уведомить» отличается от предыдущей декларации
[Ошибка dcc32] Unit1.pas (12): E2065 Неудовлетворенное прямое или внешнее объявление: 'TFooList.Notify' [dcc32 Фатальная ошибка] Project1.dpr (6): F2063 Не удалось скомпилировать использованный модуль 'Unit1.pas'

Мне потребовалось больше времени, чем я хотел бы признаться, чтобы понять, что есть

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

и a:

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

Урок заключается в методической проверке ваших типов. Ctrl + CLICK на идентификаторе типа приведет вас к определению типа, используемого компилятором. Чтобы это исправить, реорганизуйте предложения uses или используйте полное имя типа.

Достаточно плохо, когда совершают ошибку новичка при дублировании имен типов в нашем собственном коде, вдвойне плохо, когда Emba делает это в своих собственных RTL.

0 голосов
/ 25 мая 2011

Следующие работы. Нет предварительных объявлений, которые не совпадают. Я подозреваю, что вы объявляете iMyInterface.SomeProcedure (unit1 в моем примере) с параметрами, которые немного отличаются от того, что вы показали в классе, который реализует интерфейс (unit2 в моем примере). Обратите внимание, что все, что реализует ImyInterface, должно реализовывать ALL .

Unit1:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...