Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 无法将TMyClass对象分配给其基本接口类型的变量_Delphi_Inheritance_Interface_Variable Assignment_Delphi Xe2 - Fatal编程技术网

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运算符。编译器有足够的知识正确执行“类型转换”。此外:接口继承仅适用于接口。类必须明确指定它实现的接口。这与查询不同接口版本(彼此派生)的方式有关。