В 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).