LINUX.ORG.RU

Паттерн класса


0

0

Доброго времени суток !

Нужно реализовать такой класс, которому бы передавалось какое то значение ( не важно какое - главное уникальное ), и потом в зависимости от этого значения потомки выполняли вполне конкретные действия, но сам базовый класс ничего не должен знать об этих действиях, те реализация ф-ций ложится полностью на потомков. Смотрел статьи по паттернам и самое подходящее что нашел - Command pattern: http://rsdn.ru/article/patterns/patterncommand.xml Но насколько я понимаю, это не совсем то, что мне нужно...

Есть ли реализации данной идеи ? Или стоит использовать именно паттерн Command ?

Спасибо.

>Нужно реализовать такой класс, которому бы передавалось какое то значение ( не важно какое - главное уникальное ), и потом в зависимости от этого значения потомки выполняли вполне конкретные действия

Тип этого значения одинаков для всех потомков?

Sectoid ★★★★★
()

А как можно что-то передать классу? Либо передаём экземпляру класса при создании, либо делаем тип, параметризованный нужным значением. А при чём тут потомки, вообще не понятно. Или ты хочешь сделать экземпляр конкретного потомка, а потом от ссылки на объект базового типа узнать, что же оно такое делает на самом деле?

yz
()

Imho тебе нужно сделать .so-шки с реализациями потомков, и просто подгружать нужные в зависимости от параметра (зависимость брать из конфига). Класс, который этим будет заниматься вероятно будет синглетом.

Если вариант с сошками не подходит, можешь сделать в синглете map<value, MyAbstractClass* (*)()> и кидать туда ссылки на статические функции потомков(статический конструктор =)) ). Так-же в мапе могут быть функторы, но imho это изврат (лишние классы писать).

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

Я думал об *.so, но хочется сделать элегантнее, на паттернах, иначе получается модульная система )

amorphis
() автор топика
Ответ на: комментарий от yz

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

Нашел что-то похожее на жаве... (что то вроде фабрики команд) http://www.developer.com/tech/article.php/10923_3671676_1

amorphis
() автор топика
Ответ на: комментарий от amorphis

> Я думал об *.so, но хочется сделать элегантнее, на паттернах, иначе получается модульная система )

Подумай, может в этом месте модули и будут нужны.

> но хочется сделать элегантнее, на паттернах,

Патерны-то проектирования, а не кодинга. =)

Такая ситуация развязывается синглетом-строителем нужных объектов. Как он реализован (модули+конфиг/статические конструкторы) не столь важно.

Может кто-то еще что предложит..

YesSSS ★★★
()
Ответ на: комментарий от amorphis

Раз функции все известны заранее, то и делай для них интерфейс в базовом классе, а в наследниках реализуй как хочешь. Полиморфизм в чистом виде. И будешь потом вызывать через интерфейс от базы.

yz
()

В базовом классе можно завести мапу такого плана

std::map<value, boost::function>

и соответсвенно в методе базового искать в мапе значение и вызывать хендлер. А регистрироваться в мапе в конструкторе наследников.

zim
()
Ответ на: комментарий от zim

> А регистрироваться в мапе в конструкторе наследников.

Не, отдельно придется. Фиг знает, когда впервые создастся наследник.

YesSSS ★★★
()

по моему тебе нужен шаблон Factory из Александреску

Reset ★★★★★
()

+1 к Factory или FactoryMethod, в зависимости от.

anonymous
()

Спасибо всем за ответы. Выбрал реализацию фабрики комманд (методов), так как этот паттерн показался наиболее близким к поставленной задаче.

amorphis
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.