第一单元:定义了classe 单位Unit1;
interface
type
TSomeGeneric<T> = class
private
function getSelf: TSomeGeneric<T>;
public
property This : TSomeGeneric<T> read getSelf;
end;
implementation
{ TSomeGeneric<T> }
function TSomeGeneric<T>.getSelf: TSomeGeneric<T>;
begin
Result := Self;
end;
end.
单元2:它对单元1中定义的classe进行引用 单位Unit2;
interface
uses
Unit1;
type
TSomeGeneric<T> = class(Unit1.TSomeGeneric<T>);
implementation
end.
frmmain:它使用unit2是一点 单位ufrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
Unit2;
type
TfrmMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure SomeProcedure(ASG : TSomeGeneric<Integer>);
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject);
var ASG : TSomeGeneric<Integer>;
begin
ASG := TSomeGeneric<Integer>.Create();
with ASG do
try
//make use os the class ...
SomeProcedure(This); //error -> incompatible types
finally
Free();
end;
end;
procedure TfrmMain.SomeProcedure(ASG: TSomeGeneric<Integer>);
begin
//...
end;
end.
我怀疑在这一点TSomeGeneric = class(Unit1.TSomeGeneric)TSomeGeneric被定义为另一个classe而不是引用,但我无法确认
答案 0 :(得分:4)
编译器非常清楚。有问题的一行就是这个:
SomeProcedure(This);
错误是:
[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and 'Unit1.TSomeGeneric'
那是因为在那个方法中调用:
This
的类型为Unit1.TSomeGeneric<System.Integer>
和SomeProcedure
需要Unit2.TSomeGeneric<System.Integer>
类型的参数。这些不是同一类型,因为你明确地将它们区别开来。
type
TSomeGeneric<T> = class(Unit1.TSomeGeneric<T>);
定义了一种新类型,现在你有两种不兼容的类型。
您只需删除Unit2
即可。除了停止合理的代码编译之外,它没有用处。