2

私の最後の質問に関連して、私は今次の問題を抱えています:

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;

(簡素化され、エラー チェックが削除されました)

4

4 に答える 4

3

問題は NodeClass が TClass であることです。NodeClass を作成すると、INodeInterface ではなく単なる TObject になります。

あなたは試すことができます

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. 
于 2009-08-06T08:25:02.607 に答える
2

Delphiでは、インターフェイスはオブジェクトではありません。また、Interface-PointerはObjectpointerではないため、キャストできません。QueryInterfaceを使用し、インターフェイスを照会する必要があります。

function QueryInterface(var IID: TGUID; out Obj: Type):HRESULT

HRESULTがS_OKの場合、objにはクエリされたインターフェイスへの参照が含まれます。

残念ながら、Delphi(Win32)は、.NET/Javaとは異なるインターフェイスを処理します。

于 2009-08-06T08:15:59.567 に答える
2

オブジェクトからインターフェイス参照を抽出するには、Supports() 関数を使用する必要があります。これは SysUtils にあります。

オーバーロードされたバージョンがいくつかあります。3 番目の「out」パラメーターがインターフェイス参照を戻す 3 つのパラメーター バージョンが必要です。

于 2009-08-06T08:01:39.033 に答える
0

この開示者から答えを始めましょう。私は 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;

これは正しい答えではないかもしれませんが、これが解決策につながることを願っています。

于 2009-08-06T07:59:53.500 に答える