3

任意のインターフェイス タイプ ( /を除く)TList<T>であるジェネリックの使用が危険であるかどうか疑問に思っています。私はインターフェースを多用しており、それらをリストに保存しています。一部のインターフェイスは私自身のものであり、一部は一部の COM インターフェイスによって提供されるため、COM が関与しています。TIUnknownIInterface

インスタンスの等価性のチェックが発生する潜在的な問題が見られます。たとえばRemove、リストのメソッドを使用する場合です (これは、提供された値と含まれる値を内部的に比較する必要があります)。COM ルールによると、2 つのインターフェイスを にキャストした後にのみ、それらが等しいかどうかを比較できますIUnknown。でインターフェイスを見つけることに関与するデフォルトのコンパレーターがそれを認識しているかどうかはわかりませんTList<T>

私の質問を例で説明するには:

var
  list:TList<IMyInterface>;
  intf:IMyInterface;
begin
  ...
  list:=TList<IMyInterface>.Create;
  list.Add(intf);
  ...
  list.Remove(intf);
end;

上記のコードは正当ですか?

4

2 に答える 2

5

インターフェイスが QueryInterface() によって IUnknown にダウングレードされない限り、COM ルールを尊重していない可能性があるため、これが問題になる可能性があります。

tkInterface のデフォルトの IComparer と IEqualityComparer は、ポインター値を 4 バイト整数として単純に比較します (したがって、集約に戻るために QueryInterface が実行されます)。Generics.Defaults で tkInterface を探して確認してください。

この問題は、リストを作成するときに IComparer または IEqualityComparer を指定することで回避できます。

インターフェイスでジェネリックを使用することによる参照カウントの問題はないと思います。

于 2009-05-20T15:11:31.693 に答える
1

TInterfaceList 型は役に立ちますか?

これは、インターフェイスのリストで動作するように特別に設計されています。

于 2009-02-05T21:10:52.227 に答える