2

与我的最后一个问题有关,我现在有以下问题:

function TNodeFactory <T>.CreateNode (ID : Integer) : INodeInterface <T>;
var
  NodeClass : TClass;
begin
  NodeClass := FindRegisteredClass (ID);
  Result := NodeClass.Create;      
end;

这会产生编译器错误:

E2010 Incompatible Types: 'INodeInterface<TNodeFactory<T>.T>' and 'TObject'

演员表也不起作用。

我在这里想念什么?

编辑:当前实施

TNodeFactory <T> = class
private
  type
    TRegisteredNodeType = record
      ID : Integer;
      NodeClass : TClass;
    end;
private
  FNodeTypeList : TList <TRegisteredNodeType>
public
  procedure RegisterNodeType (ID : Integer; NodeClass : TClass);
  function  CreateNode (ID : Integer) : INodeInterface <T>;
end;

procedure TNodeFactory <T>.RegisterNodeType (ID : Integer; NodeClass : TClass);
var
  RegisteredType : TRegisteredNodeType;
begin
  RegisteredType.ID := ID;
  RegisteredType.NodeClass := NodeClass;
  FNodeTypeList.Add (RegisteredType);
end;

function TNodeFactory <T>.CreateNode (ID : Integer);
var
  RegisteredType : TRegisteredNodeType;
begin
  for RegisteredType in FNodeTypeList do
    if (RegisteredType.ID = ID) then
      Exit (RegisteredType.NodeClass.Create);
  raise EInvalidNodeType.Create ('No node type with ID ' + IntToStr (ID) + ' registered');
end;

(简化和删除的错误检查)

4

4 回答 4

3

问题是 NodeClass 是一个 TClass。如果您创建 NodeClass,它将只是一个 TObject,而不是 INodeInterface。

你可以试试

Result := TInterfacedObject(RegisteredType.NodeClass).Create as INodeInterface

或将 RegisterNodeType 更改为

type
  TInterfacedObjectClass = class of TInterfacedObject;   
...   
procedure RegisteredNodeType...(ID: Integer; NodeClass : TInterfacedObjectClass);

并返回

Result := RegisteredType.NodeClass.Create as INodeInterface. 
于 2009-08-06T08:25:02.607 回答
2

您需要使用 Supports() 函数从对象中提取接口引用。您可以在 SysUtils 中找到它。

有几个重载版本,您需要第三个“out”参数带回您的接口引用的三参数版本。

于 2009-08-06T08:01:39.033 回答
2

在 Delphi 中,接口不是对象。并且接口指针不是对象指针,这就是为什么你不能转换它们。您需要使用 QueryInterface 并查询接口。

function QueryInterface(var IID: TGUID; out Obj: Type):HRESULT

如果 HRESULT 为 S_OK,则 obj 包含对查询接口的引用。

不幸的是,Delphi (Win32) 处理与 .NET/Java 不同的接口。

于 2009-08-06T08:15:59.567 回答
0

让我从这个披露者开始我的回答:我对 Delphi 中模板的使用不是很熟悉。

您收到编译器错误,因为您尝试返回定义为 TClass 实例的 NodeClass。但是,该函数希望您返回一个实现 INodeInterface 的类的实例。你也许可以用这样的东西来解决这个问题

Result := INodeInterface(NodeClass.Create);     

或者

function TNodeFactory <T>.CreateNode (ID : Integer) : INodeInterface <T>;
var
  NodeClass : TClass;
  NodeInterface: INodeInterface;
begin
  NodeClass := FindRegisteredClass (ID);
  NodeInterface:= NodeClass.Create;
  Result := NodeInterface;      
end;

这可能不是正确的答案,但我希望这有助于您找到解决方案。

于 2009-08-06T07:59:53.500 回答