【问题标题】:Inheriting a C++ interface and LSP violation继承 C++ 接口和 LSP 违规
【发布时间】:2015-01-27 16:20:49
【问题描述】:

我有这样的界面

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

我有一组“设备”类,所有这些类都需要支持上述接口,以便我可以检查设备之间的兼容性。为此,我从上述 IVersion 类公开继承了每个设备。

现在,由于我继承自 IVersion(以及 Liskov 替换原则),这意味着设备 版本。但我想要的实际关系是设备有一个版本。

我希望所有设备都支持 IVersion 中的方法,但我这样做的方式我认为是不正确的。任何人都可以提出更好的方法吗?我可以使用组合,但是我现在需要在 IVersion 中添加方法,将其添加到设备基类中,然后在内部使用 IDevice 实现。这是实现我想要实现的目标的最佳方式吗?

【问题讨论】:

  • 那就不要继承了。而是提供一个方法
  • 如何将您的界面重命名为IVersioned,因此“设备版本化”。
  • 坚持Iridium的评论,是不是一个有版本号的Version,可以兼容另一个或者device?如果答案是设备,那么您只需要遵循 Iridium 的建议即可。
  • 我根据设备的版本检查设备的兼容性
  • 设备对象有版本或有版本。你必须决定哪一个更合适。如果版本是定义其属性的设备的固有部分,则使用继承并更改接口名称,如@Iridium 建议的那样。如果版本就像稍后添加到设备以标记其属性的标签(例如,您制作了设备目录并使用自己的语义创建了版本控制系统),那么创建版本类并使用组合。

标签: c++ liskov-substitution-principle


【解决方案1】:

由于您的IVersion 类中有虚方法,看来您可能需要覆盖这些方法(现在或将来)。所以在这种情况下,私有继承组合的更好替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2021-08-10
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2023-03-14
    • 2018-04-30
    相关资源
    最近更新 更多