2

为什么我无法将类分配给其基本接口类型的变量。无法将TMyClass对象分配给其基本接口类型的变量

考虑,我们有以下几点:

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

包括IInt1在你的宣言实现的接口列表:

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

除此之外:接口继承只适用于接口。该类必须明确指定它实现的接口。这与处理方式有关,会查询不同的接口版本(相互派生的版本)。 – 2012-03-06 16:34:48

0

有三个错误上方,如下:

  1. 类声明必须包含的接口所需的所有成员。因此TMyClass必须定义过程Test1和Test2。
  2. 接口必须有一个GUID,如下面的代码所示。将光标放在希望显示GUID的位置,然后按CTRL-SHIFT-G让IDE为您创建。
  3. 当您分配新类时,需要使用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; 
    ... 
+2

接口不需要GUID。只有在您想要直接或间接使用QueryInterface方法('Supports')时才需要,或者您需要COM接口。所以通常Interface都有一个GUID,但不是必需的。此外,AS运营商不是必需的。编译器知道足够正确地执行“类型转换”。 – 2012-03-06 16:30:54

相关问题