Наследование интерфейса C++ и нарушение LSP

у меня такой интерфейс

class IVersion
{
public:
   virtual char * get_version() const  = 0;
   virtual bool is_compatible(const IVersion& other) const = 0;
};

У меня есть набор классов «Устройства», каждый из которых должен поддерживать указанный выше интерфейс, чтобы я мог проверить совместимость между устройствами. Для этого я публично наследую каждое устройство от вышеуказанного класса IVersion.

Теперь, поскольку я наследую от IVersion (и от принципа замещения Лискова), это означает, что устройство является версией. Но фактическая связь, которую я хочу, заключается в том, что устройство имеет версию.

Я хочу, чтобы все устройства поддерживали методы, как в IVersion, но способ, которым я это сделал, я думаю, неверен. Может ли кто-нибудь предложить лучший способ? Я могу использовать композицию, но тогда мне нужно будет добавить методы сейчас в IVersion в базовый класс устройства, а затем внутренне использовать реализацию IDevice. Это лучший способ сделать то, что я хочу достичь?


person Arun    schedule 27.01.2015    source источник
comment
Тогда не наследуй. Вместо этого предоставьте метод   -  person BЈовић    schedule 27.01.2015
comment
Как насчет того, чтобы переименовать ваш интерфейс в IVersioned, таким образом, устройство имеет версию.   -  person Iridium    schedule 27.01.2015
comment
Чтобы настаивать на комментарии Iridium, это версия, имеющая номер версии и может быть совместима с другой версией или устройством? Если ответ заключается в устройстве, то вам просто нужно следовать совету Iridium.   -  person Serge Ballesta    schedule 27.01.2015
comment
Проверяю совместимость устройств по их версиям   -  person Arun    schedule 27.01.2015
comment
Либо объекты устройств имеют версию, либо имеют версию. Вы должны решить, какой из них более подходит. Если версия является неотъемлемой частью устройства, определяющей его свойства, используйте наследование и измените имя интерфейса, как предлагает @Iridium. Если версия похожа на метку, добавленную позже к устройству для обозначения его свойств (скажем, вы создали каталог устройств и создали систему управления версиями с собственной семантикой), то создайте класс Version и используйте композицию.   -  person doc    schedule 27.01.2015


Ответы (1)


Поскольку в вашем классе IVersion есть виртуальные методы, кажется, вам может потребоваться переопределить их (сейчас ИЛИ в будущем). Таким образом, в данном случае частное наследование является лучшей альтернативой композиции.

person ravi    schedule 27.01.2015