泛型,接口和继承问题

时间:2011-01-23 22:12:55

标签: delphi generics interface

以下示例给出了此错误:
[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;

2 个答案:

答案 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,则需要对其进行硬编码。