質問

私の最後の質問するに関連し、私は今、次のような問題があります:

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;

これは正しい答えではないかもしれませんが、私はこれを溶液にあなたを導くのに役立ちます願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top