В C++ интерфейс может быть реализован классом со всеми его методами, чистыми виртуальными.Как реализовать класс интерфейса, используя идиом не виртуального интерфейса в 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) идиома OUGHT запретить производным классам возможность переопределения общего поведения, реализованного в FooBase::method()
, но поскольку IFoo
сделал это виртуальным, кажется, что все производные классы имеют возможность переопределить FooBase::method()
.
Если я хочу использовать идиому NVI, каковы мои варианты, отличные от уже упомянутой идиомы pImpl (спасибо space-c0wb0y).
Совершенно верно, но как я могу получить базовый класс для реализации интерфейса без потери гарантий (например, порядка выполнения vf, vg и vh), который предлагает мой метод шаблонов? –
@andreas: Я ответил на ваш комментарий к ответу Майкла. Я предлагаю вам продлить ваш вопрос, чтобы он немного описал, что вы хотите сделать. Из того, что я понимаю, возможно, смешанные или политики могут быть тем, что вы ищете. – sbi
NVI и Template Method - совершенно разные концепции; хотя NVI - это то, как обычно применяется метод шаблонов. Вы могли бы просто использовать шаблонный метод, который использует объект стратегии для своих виртуальных машин, и вы можете просто иметь шаблон NVI, который не соответствует шаблону метода шаблона. –