4

이 코드를 변경하여 작동되게 할 수 있습니까? 템플릿 메서드 패턴과 다중 상속을 결합 할 수 있습니까? 서로 다른 클래스에서 서로 다른 알고리즘을 구현하는 것이 매우 편리한 것처럼 보입니다. 고맙습니다.템플릿 방법 패턴과 다중 상속을 결합하는 방법은 무엇입니까?

class TBase { 
public: 
    virtual void Do1() const = 0; 
    virtual void Do2() const = 0; 

    void Do() const { 
     Do1(); 
     Do2(); 
    } 
}; 

class TFirstAlgorithm { 
public: 
    void Do1() const {} 
}; 

class TSecondAlgorithm { 
public: 
    void Do2() const {} 
}; 

class TAlgorithm 
    : public TBase 
    , public TFirstAlgorithm 
    , public TSecondAlgorithm 
{}; 

답변

3

기본적으로 문제가 TFirstAlgorith::Do1TBase::Do1 (및 TBase::Do2에 마찬가지로 TSecondAlgorithm::Do2 관련이없는 것입니다 그들과 관련된 수 있도록하는 것입니다 그것을 해결하기 위해

한 가지 가능한 방법 :.

class TBase { 
public: 
    virtual void Do1() const = 0; 
    virtual void Do2() const = 0; 

    void Do() const { 
     Do1(); 
     Do2(); 
    } 
}; 

class TFirstAlgorithm : public virtual TBase { 
public: 
    void Do1() const { } 
}; 

class TSecondAlgorithm : public virtual TBase { 
public: 
    void Do2() const { } 
}; 

class TAlgorithm 
    : public TFirstAlgorithm 
    , public TSecondAlgorithm 
{}; 
+0

대단히 감사합니다. 해결책은 멋지다 – typedef

+0

Btw, 여기에 문제가있다 : 클래스 TFirstAlgorithm과 TSecondAlgorithm의 객체를 생성 할 수 없다. 이것은 우리가 별다른 테스트를 할 수없는 아주 좋은 beacause가 아닙니다. – typedef

+0

@ user1058588 : 예, 클래스는 인스턴스화되기 전에 기본 클래스의 모든 순수 가상 함수를 정의해야합니다. 해결 방법이 있습니다 (대부분 다른 클래스를 NOP로 정의하는 다른 클래스를 소개하지만) 특히 깨끗한 것은 없습니다. –

0

Do1 및 Do2에 대한 구현을 사용하고 그 내부에서 적절한 알고리즘을 호출 할 수 있습니다.

class TBase { 
    public: 
     virtual void Do1() const = 0; 
     virtual void Do2() const = 0; 

    void Do() const { 
     Do1(); 
     Do2(); 
    } 
}; 

class TFirstAlgorithm { 
public: 
    void Do1() const {} 
}; 

class TSecondAlgorithm { 
public: 
    void Do2() const {} 
}; 

class TAlgorithm 
    : public TBase 
    , public TFirstAlgorithm 
    , public TSecondAlgorithm 
{ 
    virtual void Do1() const { TFirstAlgorithm::Do1() ; } 
    virtual void Do2() const { TSecondAlgorithm::Do2() ; } 
}; 
+0

음, Do1과 Do2의 서로 다른 함수를 많이 구현 했으므로 TAlgorithm과 같은 다른 클래스를 쉽게 조합하고 싶습니다. 그러나이 솔루션을 사용하면 각 TAlgorithm 클래스에이 행을 쓸 수 있습니다. – typedef