以下示例给出了此错误:
[DCC Error] Unit2.pas(54): E2010 Incompatible types: 'IBar' and 'Unit2.TFoo<Unit2.IBar>'
我认为问题出在Self.Create附近 因为经过多次尝试编译后我不小心输入了FFoo:= TBar(Self).Create;它编译和工作。
我正在使用Delphi 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;
答案 0 :(得分:4)
问题在于TBar声明的这一行:
FFoo := Self.Create;
要理解,让我们解释一下代码背后的类型[注意这样]:
FFoo:[IBar] := Self:[TFoo(IBar)].Create():[TFoo<IBar>]
所以,总结一下,我们有:[IBar] := [TFoo<IBar>]
这些类型是否兼容?
[TFoo] 仅实现 IFoo 界面,没有 IBar ,因为代码中已说明
TFoo<T: IInterface> = class(TInterfacedObject, IFoo)
这是编译错误!
更新:解决方案1
要解决此问题,请执行以下操作:更改 TBar 声明
TBar = class(TFoo<IFoo>, IBar)
end;
更新:解决方案2
将FFoo := Self.Create
替换为
FFoo := Self.Create.Instance;
所以它有效!
答案 1 :(得分:1)
你的TFoo没有实现T作为接口。这就是为什么FFoo和TFoo的实例不兼容的原因。如果要将TFoo的实例分配给FFoo,则需要对其进行硬编码。