В C++ интерфейс может быть реализован классом, методы которого являются чисто виртуальными.
Такой класс может быть частью библиотеки, чтобы описать, какие методы объект должен реализовать, чтобы иметь возможность работать с другими классами в библиотеке:
class Lib::IFoo
{
public:
virtual void method() = 0;
};
:
class Lib::Bar
{
public:
void stuff( Lib::IFoo & );
};
Теперь я хочу использовать класс Lib::Bar
, поэтому мне нужно реализовать интерфейс IFoo
.
Для моих целей мне нужен целый набор связанных классов, поэтому я хотел бы работать с базовым классом, который гарантирует общее поведение с использованием идиомы NVI:
class FooBase : public IFoo // implement interface IFoo
{
public:
void method(); // calls methodImpl;
private:
virtual void methodImpl();
};
Идиома невиртуального интерфейса (NVI) должна лишать производные классы возможности переопределения общего поведения, реализованного в FooBase::method()
, но поскольку IFoo
сделала его виртуальным, кажется, что все производные классы имеют возможность переопределить FooBase::method()
.
Если я хочу использовать идиому NVI, какие у меня есть варианты, кроме уже предложенной идиомы pImpl (спасибо, space-c0wb0y).