如何解决当编译器看起来完全相同时,为什么会说实现“与先前的声明不同”?
| 我有两个单位, 第一个,我的界面: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中使用类型名称进行复制时,这个问题就变得更加糟糕了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。