Учитывая, что разница между постоянным посетителем и изменяемых визитером, что методы постоянным посетителем не разрешается изменять посещаемый объект.посетители Реализации: Constant против Мутабельного Visitor
class Integer_Field;
class Boolean_Field;
class Text_Field;
class Visitor_Constant
{
public:
virtual void visit(const Integer_Field& f) = 0;
virtual void visit(const Boolean_Field& f) = 0;
virtual void visit(const Text_Field& f) = 0;
};
class Visitor_Mutable
{
public:
virtual void visit(Integer_Field& f) = 0;
virtual void visit(Boolean_Field& f) = 0;
virtual void visit(Text_Field& f) = 0;
};
Я хотел бы свести к минимуму поддержку этих посетителей. Например, если я придумал класс Blob_Field
, мне нужно изменить оба класса. Я предпочел бы иметь что-то, где мне нужно только изменить один класс или трафарет.
Проблема обслуживания вентиляторов, когда есть много классов, определенных этими родительскими посетителями. Это основная причина, по которой я хочу упростить техническое обслуживание.
Мои вопросы:
(Примечание. Это должны быть решены без использования C++ 11 функций в моей среде разработки не поддерживает C++ 11 и я не позволил обновить в это время)
- есть ли способ, чтобы использовать механизм
template
объединить два (например, поставки «сопзЬ» в качестве параметра шаблона)? - Как я могу настроить этих посетителей, чтобы передать
Visitor_Constant
методам, используяVisitor_Mutable
?
Примечание: объединение этих классов через родительский класс позволяет удвоить методы посетителей, которые должны быть реализованы и поддерживаться.
Edit 1: отношения классов
class Component; // Base class for fields and records.
class Field : public Component; // Base class for all fields
class Record : public Component // Base class for all records
{
std::vector< boost::shared_ptr<Component> > component_container;
};
class Integer_Field : public Field;
class Boolean_Field : public Field;
class Text_Field : public Field;
Edit 2: Рациональность полого
Один рациональности для месторождений, леченных конкретно в случае генерации оператора SQL для создания таблицы.
Другое для загрузки полей из таблицы базы данных.
Как относятся к классам «поле»? –
@ Cheersandhth.-Alf Классы полей являются компонентами записи, например, в записи базы данных/таблицы. –
Не считая проблемы 'const', вы можете позволить каждой функции' visit' соответствовать определенному интерфейсу. Посетителю нужно только реализовать интерфейсы, которыми он управляет (и они могут быть организованы в некотором иерархическом порядке для поддержки иерархии типов). Посещаемый объект поля может затем «dynamic_cast» посетителя перейти к интерфейсу, соответствующему его собственному базовому типу, и если такой интерфейс присутствует, вызовите его функцию. Это централизует явное понижение. Напротив, ваша схема выше не требует какого-либо понижения, но имеет эту потенциальную поддержку prblm –