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

相關問題