Мне часто приходится иметь возможность выполнять итерацию по совокупности объектов, которые имеют сходную, но не идентичную функциональность (представьте себе коллекцию объектов Task
, которые имеют собственную реализацию функции Do()
, например).Любые причины для поиска альтернатив наследованию/полиморфизму?
Обычно я реализую это, имея базовый класс Task
(с виртуальным Do()
), из которого вытекают все задачи. Затем я могу собрать их в vector<Task*>
или vector<unique_ptr<Task>>
.
Есть ли причины (или, действительно, жизнеспособные способы) сделать это по-другому?
Edit:
Я использовал (мнимая) Task
объекты исключительно в качестве примера для простоты. В действительности, типичный случай из фактического текущего проекта будет структурой состава пользовательского интерфейса. При каждом прохождении обновления макета «визуальное дерево» перемещается из корневого контейнера, а его дочерние элементы управления рекурсивно (дочерние элементы управления контейнерами имеют другие элементы управления как дочерние элементы и т. Д.) На основе дочерних свойств, таких как смещение, выравнивание, размер и т. Д. Родители позиционируйте своих детей по-разному в соответствии с их типом и конфигурацией (подумайте о холсте WPF, Grid, StackPanel и т. д.).
Дерево постоянно меняется во время выполнения посредством визуальных элементов, перетаскиваемых между контейнерами и другим динамическим/пользовательским поведением, а сами элементы управления - постоянно расширяющееся семейство (которое поддерживает новые типы управления через плагины).
звучит как правильный подход, если вы не беспокоитесь о производительности во время виртуальной отправки. в последнем случае вы, вероятно, можете использовать отправку времени компиляции шаблона на основе шаблона. – vsoftco
unique_ptr на самом деле нет RAII. Реализация RAII была бы задачей обработки уникальности. –
@ DieterLücking 'unique_ptr' является не чем иным, как указателем на объект Task-_derived_, но где (для всех целей и целей) объект «хранится в векторе» (т. Е. Вам не нужно хранить его в другом месте (постоянно), чтобы иметь возможность поместить в него указатель в вектор, как и с вектором '). 'vector ' не соответствует заданию, очевидно. –
d7samurai