2011-01-23 64 views
6

下面的例子給我這個錯誤:
[DCC Error] Unit2.pas(54): E2010 Incompatible types: 'IBar' and 'Unit2.TFoo<Unit2.IBar>'問題與泛型和接口和繼承

我認爲這個問題是地方由於許多試圖把它編譯我不小心進入FFoo後圍繞Self.Create := TBar(Self).Create;它編譯和工作。

我使用德爾福XE

IFoo = interface 
end; 

TFoo<T: IInterface> = class(TInterfacedObject, IFoo) 
private class var 
    FFoo: T; 
public class 
    function Instance: T; 
end; 

IBar = interface(IFoo) 
end; 

TBar = class(TFoo<IBar>, IBar) 
end; 

class function TFoo<T>.Instance: T; 
begin 
    if not Assigned(FFoo) then 
    begin 
    FFoo := Self.Create; 
    end; 
    Result := FFoo; 
end; 
+4

錯誤告訴你一個行號。也許你可以指出究竟是什麼路線,而不是猜測問題出在哪裏? – 2011-01-23 22:15:41

+1

錯誤發生在「結束」之後。 – RjK 2011-01-23 22:59:44

+0

由於您不確定Self是TBar **還是**它會打破泛型的概念(不適用於其他課程),所以鑄造`TBar(Self).Create`是不必要的! – TridenT 2011-01-24 08:53:02

回答

1

您TFoo沒有實現T作爲接口。這就是FFoo和TFoo的一個實例不兼容的原因。如果你想爲TFoo分配一個TFoo實例,你需要對它進行強制轉換。

3

的問題是與TBAR聲明此行:

FFoo := Self.Create; 

要理解,讓我們解釋的類型後面的代碼[這樣的說明]:

FFoo:[IBar] := Self:[TFoo(IBar)].Create():[TFoo<IBar>] 

所以,恩總結,我們有:[IBar] := [TFoo<IBar>]
這些類型是否兼容?
一個[TFoo]只實現的IFoo接口,無需伊巴爾,因爲它是在你的代碼表示

TFoo<T: IInterface> = class(TInterfacedObject, IFoo) 

這是編譯錯誤!
UPDATE:解決方案1 ​​
要解決此問題:改變TBAR聲明

TBar = class(TFoo<IFoo>, IBar) 
end; 

UPDATE:解決方案2
更換FFoo := Self.Create通過

FFoo := Self.Create.Instance; 

,所以它作品!