2010-02-03 3 views
2

클래스 매개 변수가 있습니다.이 매개 변수는 특정 매개 변수가 보유 할 수있는 가능한 값 (GetNumValues ​​() 및 GetValue (int index)의 두 가지 주요 메서드를 구현할 수 있음)을 나타 내기위한 것입니다.상속 한 클래스의 오브젝트 작성 중?

종종 하나의 논리적 매개 변수 (매개 변수 값은 비트 플래그)는 Parameter 클래스의 2 개 이상의 인스턴스로 표현하는 것이 가장 좋습니다 (예 : 1 또는 2가 될 수있는 매개 변수, 4 또는 8이 될 수있는 매개 변수, 하나의 매개 변수는 5, 6, 9 또는 10이 될 수 있음). 이를 처리하기 위해 매개 변수를 포함하는 CompositeParameter 클래스를 만들고 매개 변수의 조합에 따라 GetNumValues ​​() 및 GetValue() 함수를 구현합니다.

그리고 CompositeParameter가 매개 변수를 하나의 단일 매개 변수로 사용하도록 조합하기 때문에 "CompositeParameter는 매개 변수"관계가 적합합니다. 그래서 저는 상속받은 클래스의 객체를 구성하는 클래스가있는 상황에 처하게됩니다.이 클래스는 옳은 것처럼 보입니다. 그러나 동시에 높은 수준의 코드가 CompositeParameters 및 Parameters를 정확히 동일하게 처리해서는 안되는 이유를 알 수 없습니다.

제가 생각할 수있는 유일한 방법은 CompositeParameter에 매개 변수를 간단하게 작성하는 것입니다. 상위 레벨 코드는 CompositeParameters 만 처리합니다. 그러나 이것은 다소 낭비 적이기 때문에 일반적으로 하나의 매개 변수 만 포함하는 CompositeParameters가됩니다.

생각하십니까?

class Parameter 
{ 
public: 
    virtual unsigned int GetNumValues() const {...} 
    virtual unsigned int GetValue(unsigned int index) const {...} 
} 

class CompositeParameter : public Parameter 
{ 
public: 
    // product of GetNumValues() of each item in mParamList 
    virtual unsigned int GetNumValues() const {...} 

    // allow all the possible combinations of the items in mParamList to be 
    // treated as one parameter. i.e. if mNumParams = 2, this would be analogous 
    // to getting the row and col index of a matrix from index, and combining 
    // the mParamList[0]->GetValue(row) and mParamList[1]->GetValue(col) 
    virtual unsigned int GetValue(unsigned int index) const {...} 

private: 

    static const unsigned int MAX_PARAMS = 10; 

    unsigned int mNumParams; 
    const Parameter* mParamList[MAX_PARAMS]; 
} 
+1

C++ 코드에 대해 이야기 할 때 영어가 아닌 C++ 코드를 사용하여 문제를 설명하는 것이 거의 항상 좋습니다. –

답변

1
I have a class which composes objects of a class it inherits from, 
which just doesn't seem right. 

를 구현하는 CompositeParameter 클래스를 가지고 있지 않은의 정의 합성물?

(parameter values are bit flags) 

이것은 내가 궁금해하는 디자인의 일부입니다. 매개 변수의 더 좋은 이름은 아마도 FlagSet입니까?

인터페이스 뒤에 비트 테스트를 숨기는 것이 좋지만 기본 컴퓨터 과학에서 잘 알려진 솔루션으로 문제를 해결하기 위해서는 상속이 과잉 될 수 있습니다.


However, that is somewhat wasteful b/c the general case would be 
CompositeParameters which contained just one Parameter. 

복합 패턴의 지점 리프 오브젝트 복합 목적은 복잡한 경우를 나타내고, 단순한 경우를 나타내며, 클라이언트 코드는 두 가지 경우를 동일하게 취급 할 수 있다는 것이다. 인터페이스가 클라이언트 코드에서 둘을 구별하거나 기본 클래스 구성 요소를 반복해야하는 경우 패턴을 사용하면 어떤 가치도 얻지 못합니다.

bool Test() const; 

잎 클래스 구현과 같습니다 : 당신의 주요 관심사 시험의 경우

예를 들어, 기본 클래스는 메소드 할 수

bool LeafTester::Test() { return _DoTest(); } 

복합 클래스 구현을 것 모양은 다음과 같습니다.

bool CompositeTester::Test() { 
    bool success = true; 

    for (int i = 0; i < m_count; i++) 
     success &= m_components[i].Test(); 

    return success; 
} 

클라이언트는 항상 다음과 같은 코드를 사용합니다.

// tester could be a Composite or a leaf, but we don't care: 
bool testResult = tester.Test(); 

예제를 단순하게 유지하기 위해 for 루프를 사용했습니다. 실제로 나는 대신 STL을 사용할 것입니다.

+0

을 구현 한 객체 또는 그 것입니다. 이것은 복합체의 정의입니다. 제 문제는 그것이 작성한 것과 동일한 것을 상속 받았다는 것입니다. 목표는 비트 단위 테스트를 숨기지 않고 테스트 목적으로 가능한 모든 값을 생성하는 것입니다. 그것은 비트 테스트에서 사용될 GetValue (...)의 결과입니다. 저는 여기서 설명을 목적으로 Parameter라는 이름을 사용했습니다. 제 질문은 작성/상속 된 디자인에 관한 것입니다. – Chris

+0

컴포지트의 정의는 컴포지션과 동일한 것을 상속한다는 것입니다. "디자인 패턴"pp164를 참조하십시오. 그것이 당신의 합성물이하는 것이라면, 그 패턴을 따릅니다. – richj

+0

패턴에 따르면, Composite와 Leaf는 모두 추상 기본 클래스 Component에서 파생됩니다. 따라서 책에 설명 된대로 패턴을 구현하려는 경우 매개 변수는 추상이며 두 번째 하위 클래스 인 LeafParameter가 필요합니다. – richj

2

이것은 완벽하게 합리적인 설계처럼 보입니다. 내가 만들 수있는 유일한 변화는 매개 변수를 클래스에서 인터페이스로 변경하는 것입니다.

그런 다음 당신은 매개 변수 클래스를 가질 수있다 (또는 아마 ParameterImpl 클래스) 매개 변수를 구현하고, 또한 또한 매개 변수 인터페이스를

+0

그래서 CompositeParameter는 Parameter 인터페이스를 구현하고 ParameterImpl 객체를 포함할까요? – Chris

+0

그렇습니다. 매개 변수 인터페이스 –

관련 문제