2011-07-26 4 views
3

다음과 같은 정의가 있습니다.익명 메소드를 저장하는 컨테이너

type 
    TOmniTaskDelegate = reference to procedure(const task: IOmniTask); 
내가 TOmniTaskDelegate 인스턴스의 목록을 저장하기 위해 (D2009에서 지원한다)를 사용한다 컨테이너 어떤 종류의

? 현재 나는 array of TOmniTaskDelegate을 사용하고 있습니다.

+0

왜 배열에 만족하지 않습니까? –

+0

a) 잘 정의 된 인터페이스와 b)를 가진 컨테이너에 책임을 위임하고 싶기 때문에, 무언가를 추가 할 때마다 배열의 크기를 조정하기 때문에. 사실, 현재 크기와 할당 된 크기 등을 알 수있는 배열 주위에 멋진 래퍼를 쓸 수는 있지만, 이미 TSomeList를 다시 구현하고 있습니다. 델파이와 함께 제공되는 것을 사용하고 싶습니다. – gabr

+2

'TSomeList '이란 무엇입니까? 'TSomeList '를 사용할 수 없습니까? –

답변

8

TList<TOmniTaskDelegate>을 사용합니다. generics 사용으로 인해 typesafe이므로 멤버의 평생 문제를 올바르게 처리합니다.

+1

Generics.Collections의'TList '에 대해 생각하고 있습니다. 이것은 유형 보증이므로 참조 카운트를 처리합니다. 하지만 이제는 D2009에 포함되지 않을지 모르는 의심이 있습니다. –

+0

TObjectList는 익명 메소드 참조가 메소드에 대한 참조와 인터페이스의 "self"에 대한 참조를 포함해야하기 때문에 적절한 컨테이너가 아닙니다. 즉, 크기는 2 x SizeOf (포인터)입니다. –

+0

@Cosmin 그건 바보 같은 실수 야. 물론'TList '을 의미했다. –

3

편집 : 델파이 2009 일반 TList<T> 포함, 나는 그것이 바로 TList<T> 최적의 선택이 델파이 2010의 하나로서, array of를 사용하여 구현했다고 가정하기로한다! 내 원래의 답변은 왜 array of이 좋은 데이터 구조이고 왜 이 아니냐고 설명하기 때문에을 사용하면 많은 문제가 발생합니다.

  • 익명 메소드 (인터페이스를 사용하여 구현) 엔티티를 관리 : 때문에


    array of Anonym의 선택은 나에게 아주 좋은 보인다. 그들은 제대로 마무리되어야합니다.

  • 동적 배열 자체는 관리되는 형식이므로 익명 메서드 참조가 제대로 마무리되었는지 확인해야합니다.
  • Delphi 2010 일반 컨테이너는 동적 배열을 사용하여 구현되므로 최대 작업입니다. 그러나 배열을 하나씩 성장시키지 않고 청크로 자라게하십시오.

구현을 위해 다른 것을 사용하는 경우 직접 참조를 마무리해야합니다. 예 : (: ZeroMemory 또는 FillChar하지 예) 그래서 컴파일러가 마무리 코드를 생성 할 수있는 기회를 얻을 수

  • 당신이 의도적으로 전무로 각 항목을 설정하는 소멸자가 필요합니다 메모리의 일반 블록을 사용하는 경우

    .
  • 레코드는 관리되는 개체이며 동적 메서드에 대한 참조를 보유 할 수 있지만 제한된 수의 참조 만 저장할 수 있습니다. 더 많은 링크 목록을 구현해야하는 경우에는 다음을 수행해야합니다. 신중하게 거기에 라이프 사이클을 관리 할 수 ​​있습니다.
  • 클래스는 레코드의 모든 결함을 겪고 그 위에 고유 한 오버 헤드 레이어를 추가합니다.
+1

귀하의 경우 기본 유형 (근본적인 새로운 유형의 목록)을 구현하고 있으며 제네릭 및 컴파일러가 절차를 엉망으로 만들지 않도록 신뢰할 수 있다고 생각하지 않습니다. 참조. ProcRef 배열 이외의 다른 것을 사용하려고한다면 TList 을 사용하고 프로 시저 참조를 레코드 유형 안에 넣습니다. –

+1

'array of'는 목록의 개인 구현에는 적합하지만 기본 데이터 유형으로 사용하지 않으려합니다. 'TList '을 사용할 수 없다면 자신 만의 닮은 무늬를 만드십시오. –