タイプのインタフェースにTObjectのからキャスト
-
11-09-2019 - |
質問
私の最後の質問するに関連し、私は今、次のような問題があります:
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;
(簡略化及びエラーチェックを除去)
解決
問題があることはTClass NodeClassです。あなたが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.
他のヒント
あなたがオブジェクトからインタフェース参照を抽出するために支持体()関数を使用する必要があります。 あなたはsysutilsの中でそれを見つけることができます。
いくつかのオーバーロードされたバージョンがあり、あなたは第三「アウト」パラメータは、あなたのインターフェイスの参照をあなたに戻しますこれで三個のパラメータバージョンが欲しいます。
デルファイのインターフェイスは、オブジェクトではありません。およびインターフェイスポインタは、あなたがそれらをキャストすることはできません理由です、Objectpointerではありません。あなたは、インターフェイスのQueryInterfaceとクエリを使用する必要があります。
function QueryInterface(var IID: TGUID; out Obj: Type):HRESULT
HRESULTがS_OKある場合、は、objが照会インターフェースへの参照を含んでいる。
残念ながらデルファイ(Win32の)は、.NET / Javaへの異なるインタフェースを処理します。
私はこの開示者との私の答えを見てみましょう:私は、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;
これは正しい答えではないかもしれませんが、私はこれを溶液にあなたを導くのに役立ちます願っています。