【发布时间】: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