Delphi 无法将TMyClass对象分配给其基本接口类型的变量
为什么我不能将类分配给其基本接口类型的变量 考虑到我们有以下几点:Delphi 无法将TMyClass对象分配给其基本接口类型的变量,delphi,inheritance,interface,variable-assignment,delphi-xe2,Delphi,Inheritance,Interface,Variable Assignment,Delphi Xe2,为什么我不能将类分配给其基本接口类型的变量 考虑到我们有以下几点: IInt1 = interface procedure Test1; end; IInt2 = interface(IInt1) procedure Test2; end; TCustomClass = class(TInterfacedObject) end; TMyClass = class(TCustomClass, IInt2) procedure Test1; procedure Test2; e
IInt1 = interface
procedure Test1;
end;
IInt2 = interface(IInt1)
procedure Test2;
end;
TCustomClass = class(TInterfacedObject)
end;
TMyClass = class(TCustomClass, IInt2)
procedure Test1;
procedure Test2;
end;
var
Obj: IInt1;
begin
Obj := TMyClass.Create; // <!-- E2010 Incompatible types: 'IInt1' and 'TMyClass'
...
end;
E2010 Incompatible types: 'IInt1' and 'TMyClass'
IInt1=接口
程序测试1;
结束;
IInt2=接口(IInt1)
程序测试2;
结束;
TCustomClass=class(TInterfacedObject)
结束;
TMyClass=class(TCustomClass,IInt2)
程序测试1;
程序测试2;
结束;
变量
Obj:IInt1;
开始
Obj:=TMyClass.Create;// 在声明中的已实现接口列表中包括IInt1
:
TMyClass = class(TCustomClass, IInt1, IInt2)
end;
上面有三个错误,如下所示:
类声明必须包含接口所需的所有成员。因此,TMyClass必须定义过程Test1和Test2
接口必须具有GUID,如下面的代码所示。将光标放在希望GUID显示的位置,然后按CTRL-SHIFT-G以获取IDE来为您创建GUID
分配新类时,需要使用AS关键字进行类型转换
因此,您的代码片段应该如下所示
IInt1 = interface
['{218BE5BB-0784-4E4A-923C-F1F1E116F38B}']
procedure Test1;
end;
IInt2 = interface(IInt1)
['{635D00B2-AC59-43A9-A7DB-660F53EBCDD8}']
procedure Test2;
end;
TCustomClass = class(TInterfacedObject)
private
procedure Test1;
end;
TMyClass = class(TCustomClass, IInt2)
private
procedure Test2;
end;
...
var
Obj: IInt1;
begin
Obj := TMyClass.Create AS IInt1;
...
接口不需要GUID。仅当您希望直接或间接使用QueryInterface方法(支持
)或需要COM接口时,才需要此选项。所以接口通常有一个GUID,但它不是必需的。此外,不需要AS运算符。编译器有足够的知识正确执行“类型转换”。此外:接口继承仅适用于接口。类必须明确指定它实现的接口。这与查询不同接口版本(彼此派生)的方式有关。