【问题标题】:c++ Project Design - private inheritance and "is a" relationshipc ++项目设计-私有继承和“是”关系
【发布时间】:2017-01-30 15:52:33
【问题描述】:

我想通过私有继承来扩展一个类。

基类是:Graph<T>

派生为:Tree<T>

我们知道一棵树是一个特定的图,所以我想扩展我的 Graph 类而不让用户使用 Graph 类的 PUBLIC 方法。

制作:

template <typename T> class Tree : public Graph<T>{

    .
    .
    .
}

有效,但我不想用 Graph 类方法改变我的树状态。用户必须使用 Tree 类特定的方法。 我认为我应该使用私有继承来获得我想要的。

问题是我不能失去“是”的关系,因为事实上,树是一个图。

什么是好的设计才能使事物变得良好并在语义上有序?

谢谢

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

好吧,你不能同时拥有它。 is-a 关系正好意味着用户可以在指向Tree 的指针(或引用)上使用任何Graph 定义的非虚拟、非覆盖函数并达到预期的效果。

如果不能让用户调用这些函数,则说明is-a关系在定义上是不合适的,应该选择私有继承。

【讨论】:

    【解决方案2】:

    私有继承并不是一个好主意 - 有关详细信息,请参阅 this 帖子。

    但是,我认为您以错误的方式处理问题。如果树是图,那么任何人可能想要对图执行的操作都是有效的。应该允许客户这样做。操作应该以有意义的方式构建。如果您发现某些操作没有,那么这可能不是对继承的正确使用。

    请记住,在图论/组合学中,树就是图,但在计算机科学中,这种关系是脆弱的。树和图表示为数据结构的方式完全不同,这使得代码共享变得很麻烦。

    【讨论】:

      【解决方案3】:

      面向对象并不总是很好。树是一种特殊类型的图。但在特殊性方面,它比一般图更受限制和更简单,并且支持的操作更少。因此,您可以编写一个允许任意数量的节点和任意拓扑的图库,然后将拓扑限制在树层中。或者你可以说树根本不继承自图。或者你可以说有一个抽象的“图基”,然后可以用树、通用图、有向无环图、平衡树等实例化。

      我建议最后一个是你想要的。所以写一个abstract_graph基类,至少有一个虚成员函数设置为null。

      然后你可以私下继承。这取决于树客户是否关心树是否是图。然而,私有继承并不是那么普遍。

      【讨论】:

      • 制作抽象基类似乎是个好方法,会检查一下!
      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2020-09-01
      相关资源
      最近更新 更多