Паттерн "Метод шаблона" у Саттера
От: DangerDen  
Дата: 11.01.05 08:52
Оценка:
Саттер ошибся в совей задачке? (3.4 на стр. 187)
//---------------------------------------------------
// File gta.h
//---------------------------------------------------
class GenericTableAlgorithm
{
public:
GenericTableAlgorithm( const string& table );
virtual ~GenericTableAlgorithm();

// Process() returns true if and only if successful.
// It does all the work: a) physically reads
// the table's records, calling Filter() on each
// to determine whether it should be included
// in the rows to be processed; and b) when the
// list of rows to operate upon is complete, calls
// ProcessRow() for each such row.
//
bool Process();

private:
// Filter() returns true if and only if the row should be
// included in the ones to be processed. The
// default action is to return true (to include
// every row).
//
virtual bool Filter( const Record& );

// ProcessRow() is called once per record that
// was included for processing. This is where
// the concrete class does its specialized work.
// (Note: This means every row to be processed
// will be read twice, but assume that that is
// necessary and not an efficiency consideration.)
//
virtual bool ProcessRow( const PrimaryKey& ) =0;

struct GenericTableAlgorithmImpl* pimpl_; // MYOB
};

Он говорит что это пример паттерна из сабжа.
Но какой смысл в private pure virtual методе? Ведь у наследников нет к нему доступа и как они его будут переопределять...
Вроде бы логичней было использовать protected... для ProcessRow.
Это ошибка или есть какой-то глубокий смысл...
Re: Паттерн "Метод шаблона" у Саттера
От: DangerDen  
Дата: 11.01.05 08:57
Оценка:
и вообще почему он рекомендует избавляться от открытых виртуальных функций и использовать вместо них паттерн Метод шаблона?
Ведь он (паттерн) реализуется открытыми виртуальными функциями, и кроме того, после этой рекомендации в решении как раз и используются открытые виртуальные функции.
Re[2]: Паттерн "Метод шаблона" у Саттера
От: ssm Россия  
Дата: 11.01.05 09:06
Оценка:
Здравствуйте, DangerDen, Вы писали:

DD>и вообще почему он рекомендует избавляться от открытых виртуальных функций и использовать вместо них паттерн Метод шаблона?

DD>Ведь он (паттерн) реализуется открытыми виртуальными функциями, и кроме того, после этой рекомендации в решении как раз и используются открытые виртуальные функции.

видимо имелось ввиду скрытие от клиента виртуальных функций, реализующих паттерн Метод шаблона
Re: Паттерн "Метод шаблона" у Саттера
От: Vladimir Prus  
Дата: 11.01.05 09:08
Оценка:
Здравствуйте, DangerDen, Вы писали:

DD>Саттер ошибся в совей задачке? (3.4 на стр. 187)

DD>//---------------------------------------------------
DD>// File gta.h
DD>//---------------------------------------------------
DD>class GenericTableAlgorithm
DD>private:
DD> virtual bool ProcessRow( const PrimaryKey& ) =0;
.....
DD> struct GenericTableAlgorithmImpl* pimpl_; // MYOB
DD>};

DD>Он говорит что это пример паттерна из сабжа.

DD>Но какой смысл в private pure virtual методе? Ведь у наследников нет к нему доступа и как они его будут переопределять...

Как обычно. При переопределении доступ к переопределяемой функции не требуется. Единственное, что убирает private -- возможность
вызова GenericTableAlgorithm::ProcessRow из потомка, что и не нужно, так как тело этого метода не определено.

— Volodya
Re: Паттерн "Метод шаблона" у Саттера
От: alexeiz  
Дата: 11.01.05 09:12
Оценка:
Здравствуйте, DangerDen, Вы писали:

DD>Он говорит что это пример паттерна из сабжа.

DD>Но какой смысл в private pure virtual методе? Ведь у наследников нет к нему доступа и как они его будут переопределять...

Ничего странного в этом нет. Виртуальный метод можно переопредилить в наследуемом классе даже если он закрытый. Смотри на это со стороны виртуальной таблицы. Виртуальный метод занимает в ней одну ячейку. Если я в наследуемом классе определю метод с такой же сигнатурой, то он попадёт в эту же ячейку.

DD>Вроде бы логичней было использовать protected... для ProcessRow.

DD>Это ошибка или есть какой-то глубокий смысл...

Смысл в том, чтобы метод ProcessRow нельзя было вызвать из наследуемых классов. Вызывается же он из открытого невиртуального метода Process(). Process может совершать какую-то работу, где требуется кастомизация. ProcessRaw в данном случае четко определяет место и роль этой кастомизации.
Re[2]: Паттерн "Метод шаблона" у Саттера
От: Кодт Россия  
Дата: 11.01.05 11:27
Оценка:
Здравствуйте, alexeiz, Вы писали:

DD>>Но какой смысл в private pure virtual методе? Ведь у наследников нет к нему доступа и как они его будут переопределять...


A>Ничего странного в этом нет. Виртуальный метод можно переопредилить в наследуемом классе даже если он закрытый. Смотри на это со стороны виртуальной таблицы. Виртуальный метод занимает в ней одну ячейку. Если я в наследуемом классе определю метод с такой же сигнатурой, то он попадёт в эту же ячейку.


Тот случай, когда баг языка С++ (перекрытие метода, лежащего вне поля зрения класса — Саттер, кстати, писал об этом в CUJ, кажется, в ноябре 2004) используется как фича.
Перекуём баги на фичи!
Re[3]: Паттерн "Метод шаблона" у Саттера
От: DangerDen  
Дата: 11.01.05 13:06
Оценка:
Здравствуйте, Кодт, Вы писали:


К>Тот случай, когда баг языка С++ (перекрытие метода, лежащего вне поля зрения класса — Саттер, кстати, писал об этом в CUJ, кажется, в ноябре 2004) используется как фича.


Эту багофичу не подправили в новом стандарте?
Re: Паттерн "Метод шаблона" у Саттера
От: Аноним  
Дата: 11.01.05 13:10
Оценка:
Вроде ж все ясно у него в комментариях? Шаблонный метод — это Process. Виртуальные функции закрытые.. ну так это не мешает их переопределять в производных классах. Какой доступ к ним, зачем?
Re[2]: Паттерн "Метод шаблона" у Саттера
От: Centaur Россия  
Дата: 11.01.05 21:10
Оценка: 3 (1)
Здравствуйте, DangerDen, Вы писали:

DD>и вообще почему он рекомендует избавляться от открытых виртуальных функций и использовать вместо них паттерн Метод шаблона?

DD>Ведь он (паттерн) реализуется открытыми виртуальными функциями, и кроме того, после этой рекомендации в решении как раз и используются открытые виртуальные функции.

Herb Sutter, Jim Hyslop. Conversations: Virtually Yours
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.