C++에서 인터페이스는 모든 메소드가 순수 가상 인 클래스에 의해 구현 될 수 있습니다.C++에서 비 가상 인터페이스 관용구를 사용하여 인터페이스 클래스를 구현하는 방법은 무엇입니까?
class Lib::IFoo
{
public:
virtual void method() = 0;
};
:
이러한 클래스는 객체 라이브러리에서 다른 클래스와 함께 작동 할 수 있도록 구현해야하는지 방법을 설명하는 라이브러리의 일부가 될 수있는 지금
class Lib::Bar
{
public:
void stuff(Lib::IFoo &);
};
I Lib :: Bar 클래스를 사용하여 IFoo 인터페이스를 구현해야합니다.
class FooBase : public IFoo // implement interface IFoo
{
public:
void method(); // calls methodImpl;
private:
virtual void methodImpl();
};
비 가상 인터페이스 (NVI) 관용구 해야지 : 나는 NVI 관용구를 사용하여 일반적인 동작을 보장하는 기본 클래스와 함께 일하고 싶습니다 그래서 내 목적을 위해
나는 관련 클래스의 전체 필요 파생 클래스가 FooBase::method()
에 구현 된 공통 동작을 재정의 할 가능성을 거부했지만 IFoo
이후로 가상 클래스를 만들었으므로 모든 파생 클래스가 FooBase::method()
을 무시할 수있는 것으로 보입니다.
NVI 관용어를 사용하고 싶다면, 이미 제안 된 pImpl 관용구 이외의 옵션은 무엇입니까 (감사합니다 space-c0wb0y).
사실, 템플릿 클래스가 제공하는 보증 (예 : vf, vg 및 vh의 실행 순서)을 잃지 않고 기본 클래스에서 인터페이스를 구현할 수 있습니까? –
@andreas : 마이클의 대답에 대한 귀하의 의견에 답변했습니다. 귀하의 질문을 확장하여 귀하가하고 싶은 것을 조금 더 잘 설명하도록 제안드립니다. 내가 이해하는 바에 따르면, 아마도 당신이 찾고있는 것이 믹스 인이나 정책 일 것입니다. – sbi
NVI와 템플릿 방법은 완전히 다른 개념입니다. NVI는 일반적으로 Template Method가 일반적으로 구현되는 방법입니다. 가상 객체를위한 전략 객체를 사용하는 템플릿 메소드를 간단히 가질 수 있으며 템플릿 메소드 패턴이 아닌 NVI 패턴을 가질 수도 있습니다. –