1

Какой приемлемый жаргон (если есть) для описания методов, предназначенных для вызова только фактически и из других методов в базе? Я иногда видел, что это называется обратным вызовом, но это, похоже, довольно далеко от первоначального определения этого термина. Я даже не уверен, что это заслуживает того, что называется шаблоном, но я пытаюсь более точно комментировать код. Спасибо за помощь!частные переопределения шаблонов частных методов? (ANSWER: NVI)

// Abstract class. 
class A { 
public: 
    void run() { while (call()) { /* ... */ } } 
private: 
    virtual bool call() = 0; 
}; 

// Completion/specialization of A. 
class B : public A { 
private: 
    // Standard term to indicate this pattern? 
    bool call(); 
}; 

Резюме: Это, кажется, называется Non-Virtual Interface рисунок, частный случай метода шаблона Pattern. Спасибо Нику и Стивену за помощь!

+0

Uhm, не следует 'call' быть' protected', а не 'private'? –

+0

@Steven и @Arseny: вы можете переопределить частных членов. Это должно быть «частным» здесь. –

+0

@ Билли: Ты не ошибаешься, но это все еще заставляет меня немного подергиваться. –

ответ

3

Это иногда называют шаблоном «не виртуальный интерфейс» (или NVI). Он часто используется, когда реализация для виртуальной функции должна различаться между производными классами, но базовый класс нуждается в контроле при вызове функции.

Например, базовый класс может сделать еще один вызов функции до или после виртуального вызова вместо создания виртуальной функции общественности и опираясь на переопределениях вызвать базовую реализацию самостоятельно (и в нужное время!)

+0

Я думаю, что это так, учитывая, что Стивен указал мне на голову. NVI, по-видимому, является специальным подмножеством шаблона метода шаблонов, который придумал Херб Саттер когда-то после 2001 года. – Jeff

5

Может быть template method pattern.

+0

Спасибо за ссылку. Не могли бы вы объяснить более четко, чем статья, как это отличается, если вообще от NVI? По крайней мере, однажды источник я откопал утверждения о том, что они являются синонимами: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface – Jeff

+0

Я не считаю, что он отличается. Фактически, ссылка, которую вы только что опубликовали, называет ее псевдонимом. –

+0

Nevermind, Sutter придумал NVI как подмножество TMP: http://www.gotw.ca/publications/mill18.htm (в разделе «Более поздняя заметка:») – Jeff

0

Um ... частные виртуальные машины? Зачем изобретать новую терминологию? Это языковая конструкция, а не идиома, и, на мой взгляд, недостаточно интересна, чтобы ее можно было назвать шаблоном.

+0

-1: Да, частные виртуальные машины.C++ позволяет им, и они являются общими для реализации шаблонов и шаблонов NVI. –

+0

@ Билли: соглашались вы или не соглашались? –

+0

Удалено нисходящее движение в результате редактирования. Если у вас есть только оригинал, похоже, вы называете OP глупым: P. –

1

Я слышал образец, в котором у вас нет никаких функций virtual в вашем интерфейсе в качестве шаблона не виртуального интерфейса, NVI для краткости.

В других контекстах он упоминается как шаблон Метод шаблон, где ваш run() является метод шаблон с производными классами, прыжки, чтобы заполнить пробелы.

+0

Это на самом деле самый точный ответ в ретроспективе. Он просто пропустил порыв голосов от прибытия чуть позже. Спасибо, sbi! – Jeff

+0

@Jeff: Спасибо за похвалу, но я был меньше минуты позже, чем первый ответ. Люди просто считали, что другие ответы лучше. – sbi

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