2009-11-02 4 views
2

일반 Delphi 2009 TObjectList을 사용하는 방법을 이해해야합니다. 내 비 TObjectList 시도가델파이 : TObjectList를 사용하는 방법 <T>?

여기
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);을 상속합니다. 그러나 다른 전문 분야 (예 : 다른 비공개 필드)로 인해 동일한 유형이되지는 않습니다. 그래서 나는 두 개의 거의 동일한 채우기 방법을 쓸 필요가 : FillArray(List: Array of TList2; Source: TSource);

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; 

전반에 걸쳐 TList2TList1의 교체를 제외하고, 동일되고. 내가 이해하는 한, 이것은 TObjectList과 단일 채우기 방법을 사용하여 깔끔하게 우회 될 수 있습니다. 그러나 나는 이것에 대해 어떻게 생각하는지 모른다. 아무도 이것에 좋은 포인터가 있습니까? 감사!

+0

1. TClass는 클래스 이름에 대해 매우 나쁜 선택입니다. 2. List가 FillChar에서 var로 선언되지 않았습니다. –

+0

3. SetLength (List, Length (List)); 실제로 아무것도하지 않습니다 –

+0

Uwe : 예, 정말 나쁜 이름입니다. 이것과 다른 제안들을 편집했습니다. :) – conciliator

답변

2

제네릭의 형식이 클래스 정의의 일부이기 때문에 일반 목록을 사용하여 압축 할 수 없습니다. 따라서 TObjectList<TMyClass1>TObjectList<TMyClass2>과 다르거 나 호환되지 않습니다. 일반 TList/TObjectList보다 일반적인 목록을 사용하면 얻을 수있는 주된 이점은 형식 안전성이 향상되고 캐스트 및 코드 정리가 줄어 듭니다.

또한 키/값 쌍을 사용하는 경우 목록에 넣은 다음 키를 검색하고 연관된 값을 반환하여 검색합니까? 그렇다면 Generics.Collections의 TDictionary를 살펴보십시오. 이 프로세스는 크게 단순화 될 일반적인 키/값 해시 테이블입니다.

+0

감사합니다 메이슨. 그건 내 질문에 대한 답변. – conciliator

0

Generics.Collections.TObjectList의 공식 엠바 카데로 문서 위키에는 TObjectList in action의 간단한 코드 예제가 포함되어 있습니다.

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); 

example code 당신에게 제공해야합니다 :

나는 TObjectList와의 폭 넓은 사용을 해결하기 위해 제외한하는 TObjectList와의 예제 초기화 코드는 다음과 같을 수있는 질문은 운전 정확하게 확실하지 않다 TObjectList가 수행 할 수있는 아이디어가 있지만 질문을 올바르게 이해했다면 TObjectList의 단일 인스턴스에 둘 이상의 클래스 유형을 추가 할 수 있기를 원합니까? TObjectList는 단일 유형으로 만 시작할 수 있으므로 추가하려는 모든 클래스에서 공유하는 인터페이스 또는 Abstract 클래스로 TObjectList를 시작한 경우 더 좋을 수 있습니다.

한 가지 중요한 차이를 이용하여 TObjectList 당신이 그것에 추가하고, 따라서 결과적으로는 그들에게 자신을 자유롭게 관리해야하는지 여부를 개체를 소유 여부 TObjectList을 알려주는 OwnsObjects 속성의 실존이 당신의 자신의 창조에있다 비교했다.

+0

안녕하세요 Jamiei. 당신이 말하는 예를 보았습니다. 불행히도, 그게 내가 정한만큼 정교하지 않고, 많이 언급하지 않고 떠난다.특히, 거의 동일한 코드를 사용하여 두 개의 다른 목록을 채우고 싶습니다. 그러나 Mason이 지적했듯이, 그렇게 할 수는 없습니다. 그래서 오버로드 - 보난자, 여기에 와서! – conciliator

+0

아, 그렇게 생각했기 때문에 ObjectList는 단일 유형으로 만 시작할 수 있으므로 가능하면이 작업을 수행하기 위해 인터페이스 또는 기본 클래스를 파생시키기 위해 클래스를 수정해야합니다. – jamiei

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; 

여러분이 원하는대로해야합니다.

관련 문제