2

一般的なDelphi2009の使用方法を理解する必要がありますTObjectList。私の非TObjectList試みは次のように見えました

TSomeClass = class(TObject)
private
  FList1: Array of TList1;
  FList2: Array of TList2;
public
  procedure FillArray(var List: Array of TList1; Source: TSource); Overload;
  procedure FillArray(var List: Array of TList2; Source: TSource); Overload;
end;

ここでは、同じコンストラクターTList1TList2継承しconstructor TParent.Create(Key: string; Value: string);ます。ただし、専門分野が異なるため(たとえば、プライベートフィールドが異なるため)、同じタイプにはなりません。したがって、ほぼ同じ2つの塗りつぶしメソッドを作成する必要があります。

procedure TSomeClass.FillArray(var List: Array of TList1; Source: TSource);
begin
  for i := 0 to Source.List1.Count - 1 do begin
    SetLength(List, Length(List) + 1);
    List[i] := TList1.Create(Source.List1[i].Key, Source.List1[i].Value);
  end;
end;

全体でwithをFillArray(List: Array of TList2; Source: TSource);置き換えることを除いて、同一です。私が理解している限り、これは単一の塗りつぶし方法を使用することでうまく回避できます。まだ、私はこれについてどうやって行くのか見当がつかない。誰かがこれについていくつかの良い指針を持っていますか?ありがとう!TList1TList2TObjectList

4

3 に答える 3

2

ジェネリックの型はクラス定義の一部であるため、ジェネリックリストを使用してそれを凝縮することはできません。したがって、aはaTObjectList<TMyClass1>とは異なります(互換性がありません)TObjectList<TMyClass2>。通常のTList/TObjectListよりもジェネリックリストを使用する主な利点は、キャストが少なく、コードがクリーンな、型の安全性が向上することです。

また、キーと値のペアを使用している場合、それらをリストに入れてから、キーを検索して関連する値を返すことでそれらを取得していますか?もしそうなら、Generics.CollectionsのTDictionaryを見てください。これは、このプロセスを大幅に簡素化する汎用のキー/値ハッシュテーブルです。

于 2009-11-02T12:30:15.790 に答える
0

Generics.Collections.TObjectListの公式EmbarcaderoドキュメントWikiには、動作中のTObjectListの簡単なコード例が含まれています。

質問が何を推進しているのか正確にはわかりませんが、TObjectListの幅広い使用に対処するために、TObjectListの初期化コードの例は次のようになります。

var
  List: TObjectList<TNewObject>;
  Obj: TNewObject;
begin
  { Create a new List. }
  List := TObjectList<TNewObject>.Create();

  { Add some items to the List. }
  List.Add(TNewObject.Create('One'));
  List.Add(TNewObject.Create('Two'));

  { Add a new item, but keep the reference. }
  Obj := TNewObject.Create('Three');
  List.Add(Obj);

サンプルコードは、TObjectListで何ができるかを示しているはずですが、質問を正しく理解していれば、 TObjectListの単一のインスタンスに複数のクラスタイプを追加できるようにしたいと思いますか?TObjectListは単一の型でのみ開始できるため、追加するすべてのクラスで共有されるInterfaceクラスまたはAbstractクラスでTObjectListを開始した方がよい場合があります。

独自のオブジェクトを作成する場合と比較してTObjectListを使用する場合の重要な違いの1つは、 OwnsObjectsプロパティが存在することです。このプロパティは、追加したオブジェクトを所有しているかどうか、したがってオブジェクト自体を解放する必要があるかどうかをTObjectListに通知します。

于 2009-11-02T12:20:24.130 に答える
0

このようなもの?

TSomeClass = class
private
  FList1: TArray<TList1>;
  FList2: TArray<TList2>;
public
  procedure FillArray<T>(var List: TArray<T>; Source: TSource);
end;

procedure TSomeClass.FillArray<T>(var List: TArray<T>; Source: TSource);
begin
  for i := 0 to Source.List1.Count - 1 do begin
    SetLength(List, Length(List) + 1);
    List[i] := T.Create(Source.List1[i].Key, Source.List1[i].Value);
  end;
end;

これ、またはそれのようなものはあなたが望むことをするはずです、afaict。

于 2009-11-02T17:42:43.890 に答える