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”的声明与之前的声明不同。我注意到他们有阵列参数。参数的类型在第一个单元中定义,如果我在第二个单元中定义这些类型,我得到相同的错误,但它在对象的声明中显示。我怎么编译?
答案 0 :(得分:10)
您没有显示足够的代码但显然正在发生的事情是您正在重新定义接口部分中Tdatos
声明之间的违规类型(Tllave
和Tmilitares
)方法的实施。此重新声明可以是您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中执行它时,这是非常糟糕的。