Я ищу совета по шаблону проектирования, который хорошо подходит для моих нужд:
В моем проекте на C++ один конкретный чисто виртуальный класс будет представлять надмножество всех связанных функций для определенной концепции, а каждый из конкретных классов, производных от этого чисто виртуального класса, будет некоторым различным ограниченным подмножеством этого надмножества. Только 1 экземпляр любого из этих конкретных классов будет существовать во время выполнения.
Если бы я программировал на C, я бы, вероятно, решил реализовать это как структуру указателей на функции с NULL для любой отсутствующей функциональности. Но это не очень удовлетворяет C++.
Единственная идея, о которой я могу думать, - это класс, в котором каждая функция-член является «защищенной» и соответствующий набор указателей на «общедоступные» функции-члены. Конструкторы будут нести ответственность за инициализацию MFP либо значением NULL, либо адресом соответствующей функции-члена, в зависимости от того, какую функциональность предоставляет этот класс.
Но на самом деле это лишь немногим более похоже на C++, чем C-struct-of-function-pointers, о которых я впервые упоминал выше. И, возможно, это достаточно хорошо. Но мне интересно, может ли кто-нибудь предложить более удовлетворительный, проницательный шаблон проектирования для этого сценария.
Я открыт для любой общепринятой практики. СТЛ в порядке.
ОБНОВЛЕНИЕ. Причина, по которой подход с использованием МФУ не очень удовлетворителен, заключается в том, что мне придется внедрить заглушки для тех, которые неприменимы, из-за чисто- виртуальный базовый класс — хотя я бы установил для соответствующих МФУ значение NULL. Если поразмыслить, то это обновление оказалось полностью фальшивым. (Они не будут бесполезными заглушками, это будут полезные функции в тех случаях, когда NULL не используется для МФУ. Думаю, я устал.)
ОБНОВЛЕНИЕ 2. Аналогия: мой проект поддерживает аппаратные модули, которые можно заменять. Все они в основном относятся к одной и той же категории функциональных возможностей, но различаются по функциям и возможностям. При запуске я должен определить, какой аппаратный модуль фактически подключен, и создать экземпляр соответствующего класса. Но я не хочу, чтобы код, использующий этот класс, обладал специальными знаниями о каждом из классов; Я хочу, чтобы класс рекламировал, какие функции он предоставляет. (Иногда два аппаратных модуля идентифицируются как идентификаторы одного и того же типа, но при проверке возможностей один из них указывает функциональные возможности, которых нет у другого.)
dynamic_castчтобы узнать во время выполнения, какие функции есть. Или в коде шаблона он может использоватьstd::is_base_derived(который, насколько я помню, имеет свои аргументы в неправильном порядке, но в любом случае). Но подумайте, служит ли это усложнение — а оно и есть — полезной цели. Имеет ли это? - person Cheers and hth. - Alf   schedule 11.12.2013