У меня есть такой интерфейс
class IVersion
{
public:
virtual char * get_version() const = 0;
virtual bool is_compatible(const IVersion& other) const = 0;
};
У меня есть набор классов «Device», каждый из которых должен поддерживать вышеупомянутый интерфейс, чтобы я мог проверить совместимость между устройствами. Для этого я публично наследую каждое устройство из вышеуказанного класса IVersion.
Теперь, поскольку я наследую от IVersion (и от принципа подстановки Лискова), это означает, что устройство это Версия. Но фактические отношения, которые я хочу, это то, что устройство имеет версия.
Я хочу, чтобы все устройства поддерживали методы, как в IVersion, но так, как я это сделал Я думаю, не является правильным. Кто-нибудь может предложить лучший способ? Я могу использовать композицию, но тогда мне нужно будет добавить методы сейчас в IVersion в базовый класс устройства, а затем внутренне использовать реализацию IDevice. Это лучший способ сделать то, что я хочу достичь?
Так как есть виртуальные методы в вашем IVersion
класс, кажется, вам может потребоваться переопределить их (сейчас или в будущем). Так частное наследство лучшая альтернатива состав в этом случае.