与我的上一个question有关,我现在遇到以下问题:

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;


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

最佳答案

问题是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.

关于delphi - 从TObject转换为接口(interface)类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1237421/

10-10 01:51