2013-08-30 7 views
4

Я реализую шаблоны проектирования в C++, и я хочу, чтобы мои классы использовали интерфейсы через композицию, это привело меня к изучению различных способов реализации интерфейсов. Я хотел бы уточнить определения этой терминологии.В чем разница между «не виртуальным интерфейсом» и «абстрактным интерфейсом»?

ответ

6

невиртуальный интерфейсом является функцией открытого члена, что это не виртуальным, но, как правило, как ожидается, будет реализованы в терминах виртуальной функции, которая является переопределением:

class Interface 
{ 
public: 
    int compute() 
    { 
     return compute_impl(); 
    } 
private: 
    virtual int compute_impl() = 0; 
protected: 
    virtual ~Interface() { } 
}; 

Аккуратными здесь является то, что реализация на самом деле private, так как вы все же можете переопределить частные методы - вы просто не можете позвонить их извне.

В противоположность этому, абстрактный интерфейс сам по себе виртуальный, и чисто так в классе интерфейса:

class Interface 
{ 
public: 
    virtual int compute() = 0; 
protected: 
    virtual ~Interface() { } 
}; 

Хотя эти два подхода выглядят внешне похожи, преимущество интерфейса идиомы невиртуальном является то, что интерфейс не обременены реализацией деталь виртуальных функций-членов. Другими словами, тот факт, что различные реализации интерфейса удовлетворяют его контракту путем переопределения виртуальных функций, является деталью реализации, которая не является частью публичного аспекта интерфейса. В частности, автор вправе изменить способ реализации функции в будущем, не беспокоясь о том, что пользователи разработали собственные иерархии наследования и переопределения.

+0

Хороший ответ. Я использовал эту точную парадигму при реализации структуры для различных видов алгоритмов, которые необходимо было отслеживать из использования памяти и времени. В методе 'int Interface :: compute()' у меня были некоторые базовые вещи для настройки использования памяти и времени, тогда как фактический алгоритм перешел в 'virtual int compute_impl()'. – rwols

Смежные вопросы