与我的上一个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/