Delphi 这个不兼容类型错误有什么问题
我过了几天有人问我为什么这个代码会出错。我想弄明白,但我想不通,所以我希望你们能帮助我们 第一个单位:定义类别的地方 第一单元Delphi 这个不兼容类型错误有什么问题,delphi,Delphi,我过了几天有人问我为什么这个代码会出错。我想弄明白,但我想不通,所以我希望你们能帮助我们 第一个单位:定义类别的地方 第一单元 interface type TSomeGeneric<T> = class private function getSelf: TSomeGeneric<T>; public property This : TSomeGeneric<T> read getSelf; end; implementa
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.
接口
类型
TSomeGeneric=class
私有的
函数getSelf:TSomeGeneric;
公众的
属性:TSomeGeneric read getSelf;
结束;
实施
{TSomeGeneric}
函数TSomeGeneric.getSelf:TSomeGeneric;
开始
结果:=自我;
结束;
结束。
单元2:它对单元1中定义的类进行引用
第二单元
interface
uses
Unit1;
type
TSomeGeneric<T> = class(Unit1.TSomeGeneric<T>);
implementation
end.
接口
使用
单元1;
类型
TSomeGeneric=class(Unit1.TSomeGeneric);
实施
结束。
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.
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、对话框、,
单元2;
类型
TfrmMain=类(TForm)
过程表单创建(发送方:ToObject);
私有的
{私有声明}
程序SomeProcedure(ASG:TSomeGeneric);
公众的
{公开声明}
结束;
变量
frmMain:TfrmMain;
实施
{$R*.dfm}
{TfrmMain}
过程TfrmMain.FormCreate(发送方:TObject);
var ASG:TSomeGeneric;
开始
ASG:=TSomeGeneric.Create();
与ASG do
尝试
//使用操作系统类。。。
某些程序(本)//错误->不兼容类型
最后
自由();
结束;
结束;
程序TfrmMain.SomeProcedure(ASG:TSomeGeneric);
开始
//...
结束;
结束。
我怀疑在这一点上TSomeGeneric=class(Unit1.TSomeGeneric)TSomeGeneric被定义为另一个类而不是引用,但我不能确认编译器是否已经非常清楚了。有问题的一行是:
SomeProcedure(This);
错误是:
[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and
'Unit1.TSomeGeneric'
定义一个新类型,现在有两个不兼容的类型
您只需删除
Unit2
。除了停止合理的代码编译之外,它没有任何作用。编译器非常清楚地说明了这一点。有问题的一行是:
SomeProcedure(This);
错误是:
[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and
'Unit1.TSomeGeneric'
定义一个新类型,现在有两个不兼容的类型
您只需删除
Unit2
。除了停止合理的代码编译之外,它没有其他用途。是的,它肯定是另一个类——同名的Unit1类的后代。如果你怀疑这就是问题所在,为什么你不能证实呢?只需删除Unit2,改用Unit1,看看程序是否编译并工作。如果调用SomeProcedure(ASG)
而不是SomeProcedure(This)
,它是否有效?是的,它在使用SomeProcedure(ASG)时有效,但在传递属性ASG时无效。那正是我迷路的地方,因为ASG。这实际上是另一门课?过程param中所需的Unit.TSomeGeneric而不是Unit2.TSomeGeneric?是的,它肯定是另一个类-具有相同名称的Unit1类的后代。如果你怀疑这就是问题所在,为什么你不能证实呢?只需删除Unit2,改用Unit1,看看程序是否编译并工作。如果调用SomeProcedure(ASG)
而不是SomeProcedure(This)
,它是否有效?是的,它在使用SomeProcedure(ASG)时有效,但在传递属性ASG时无效。那正是我迷路的地方,因为ASG。这实际上是另一门课?过程参数中需要的Unit.TSomeGeneric而不是Unit2.TSomeGeneric?好的,谢谢,还有一个问题,在Unit2中,有一种方法可以从unit1链接这个类而不重新定义它自己?好像不是泛型类。TSomeSimpleType=Unit1.TSomeSimpleType.Nope,您不能声明泛型类型别名OK谢谢,还有一个问题,在unit2中有一种方法可以从Unit1链接这个类而不重新定义自己?好像不是泛型类。例如:TSomeSimpleType=Unit1.TSomeSimpleType.Nope,不能声明泛型类型别名