无法将TMyClass对象分配给其基接口类型的变量

时间:2012-03-06 15:39:59

标签: 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;
end;

var
  Obj: IInt1;
begin
  Obj := TMyClass.Create; // <!-- E2010 Incompatible types: 'IInt1' and 'TMyClass'
  ...
end;


E2010 Incompatible types: 'IInt1' and 'TMyClass'

这是编译器中的错误还是不允许的操作。这可以解决吗?

2 个答案:

答案 0 :(得分:2)

在声明中已实现的接口列表中包含IInt1

TMyClass = class(TCustomClass, IInt1, IInt2)
end;

答案 1 :(得分:0)

上面有三个错误,如下所示:

  1. 类声明必须包含接口所需的所有成员。因此,TMyClass必须定义过程Test1和Test2。
  2. 接口必须具有GUID,如下面的代码所示。将光标放在要显示GUID的位置,然后按CTRL-SHIFT-G让IDE为您创建此文件。
  3. 分配新类时,需要使用AS关键字进行类型转换。
  4. 因此,您的代码片段应如下所示

    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;
      ...