Иерархия наследования против множественного наследования (C ++)

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

Ситуация следующая: у меня есть пара разных классов интерфейса, абстрагирующих несколько коммуникационных устройств. Поскольку эти устройства различаются по своей природе, они также различаются по интерфейсу и, следовательно, не связаны между собой. Назовем их IFooDevice и IBarDevice . Со временем могут быть добавлены другие типы устройств. Язык - C ++.

Поскольку другие компоненты (с этого момента называемые клиентами) могут захотеть использовать одно или несколько из этих устройств, я решил предоставить класс DeviceManager для обработки доступа ко всем доступным устройствам в время выполнения. Поскольку количество типов устройств может увеличиться, я хотел бы относиться ко всем устройствам одинаково (с точки зрения менеджеров). Однако клиенты будут запрашивать определенный тип устройства (или устройства, основанные на некоторых свойствах).

Я подумал о двух возможных решениях:

Первым может быть своего рода иерархия промежуточных состояний. Все устройства будут подклассом общего интерфейса IDevice , который будет предоставлять (виртуальные) методы, необходимые для управления и запросов устройств (например, getProperties () , hasProperties () , ...). Затем DeviceManager имеет набор указателей на IDevice , и в какой-то момент потребуется преобразование из Base в Derived - либо с шаблонный метод в диспетчере или после запроса на стороне клиента.

С точки зрения дизайна, я думаю, было бы более элегантно разделить проблемы управления устройством и интерфейсом самого конкретного устройства. Таким образом, это приведет к двум несвязанным интерфейсам: IManagedDevice и, например, IFooDevice . Реальное устройство должно наследовать и от того, и от другого, чтобы «относиться» к конкретному типу устройства и быть управляемым. Менеджер будет управлять только указателями на IManagedDevice . Однако, в какой-то момент потребуется преобразование между несвязанными теперь классами (например, от IManagedDevice к IFooDevice ), если клиент хочет использовать устройство, предоставленное менеджером.

Сделайте это. Здесь я должен выбрать меньшее из двух зол? И если да, то какой? Или я что-то упускаю?

Правка:

По поводу "управляющей" части. Идея состоит в том, чтобы иметь библиотеку, предоставляющую множество устройств связи, которые разные (клиентские) приложения могут использовать и совместно использовать. Управление просто сводится к хранению экземпляров, методам регистрации нового устройства и поиску определенного устройства. Ответственность за выбор «правильного» устройства для задачи лежит на стороне клиента, поскольку она лучше всех знает, какие требования она предъявляет к коммуникации. Чтобы повторно использовать и, таким образом, совместно использовать доступные устройства (и под этим я имею в виду реальные экземпляры, а не только классы), мне нужна центральная точка доступа ко всем доступным устройствам. Я не очень люблю самого менеджера, но это единственное, что я мог придумать в таком случае.

5
задан Benjamin 4 February 2014 в 11:05
поделиться