gpt4 book ai didi

delphi - 从 TObject 转换为接口(interface)类型

转载 作者:行者123 更新时间:2023-12-03 18:17:34 25 4
gpt4 key购买 nike

关于我的最后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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com