2010-03-15 1 views
0

TCollection에 저장된 항목의 컬렉션을 가질 계획입니다.TCollectionItem의 상속

각 항목을 차례로 TCollectionItem은에서 파생 TBaseItem에서 파생됩니다, 항목이 요청 될 때 컬렉션 TBaseItem를 반환합니다 염두에두고

.

이제 각 TBaseItemCalculate 기능을 갖 상기 TBaseItem이는 내부 변수를 반환하지만 TBaseItem의 파생어들 각각에 Calculate 함수 파라미터의 다른 세트를 필요로한다.

컬렉션은 분명히이

내가이 일을 세 가지 방법을 생각할 수있는 각 함수에 올바른 매개 변수를 전달해야합니다, 각 Calculate 함수를 호출하는 컬렉션 항목을 반복하고 Calculate All 기능을 갖게됩니다

  1. 기본 클래스의 각 계산 함수에 대해 가상/추상 메서드를 만들고이를 생성 된 클래스에서 재정의합니다. 그러면 개체를 사용할 때 형식 변환이 필요하지 않지만 또한 많은 작업을 만들어야한다는 것을 의미합니다. 가상 메서드 및 대형 경우 .. .else 문은 형식을 감지하고 올바른 "calculate"메서드를 호출하므로 계산할 메서드를 호출하면 올바른 매개 변수를 사용하여 코드를 작성할 코드를 작성할 때 알 수 있으므로 오류가 발생하기 쉽습니다. Error/EAbstractError.

  2. 가능한 모든 매개 변수가있는 레코드 구조를 만들고이를 "calculate"함수의 매개 변수로 사용하십시오. 이것은 필요한 모든 매개 변수를 포함 할 수 있고 잠재적으로 매우 긴 매개 변수 목록을 피할 수 있기 때문에이를 "모두 계산"함수에 전달하는 추가 이점이 있습니다.

  3. 올바른 계산 방법에 액세스하려면 TBaseItem을 유형 변환하면됩니다. 이것은 TBaseItem을 첫 번째 메소드에 비해 꽤 정리할 수 있습니다.

이 컬렉션을 처리하는 가장 좋은 방법은 무엇입니까?

+2

컬렉션은 실제로 다형성으로 사용하도록 설계되지 않았습니다. 기본 콜렉션 편집기는 항상 콜렉션의 생성자에 전달하는 유형 인 동일한 유형의 항목을 작성합니다. 양식 디자이너에서 컬렉션의 내용을 편집하지 않으려면 TCollection으로 시작하지 마십시오. TObjectList와 같은 다른 컨테이너 클래스 나 TObject의 직접적인 하위 클래스를 사용하십시오. –

+0

TCollection을 다형 적으로 사용하는 데 문제가 없습니다. 문제는 다른 매개 변수를 다른 자손에서 동일한 메서드로 전달할 때 훨씬 더 중요했습니다. –

답변

1

모두 메소드 서명이 다른 경우 가상 메서드를 사용하면 아무 것도 얻지 못합니다. 정적 인 경우도 있습니다. 적어도 당신이 지금까지 제공 한 설명을 기반으로, 귀하의 사례 2와 같은 "일반"/ "표준"매개 변수 집합과 가상/재정의 된 Calculate 방법을 선호합니다.