C++ 项目设计 - 私有继承和"is a"关系
c++ Project Design - private inheritance and "is a" relationship
我想通过私有继承来扩展一个类。
基类为:Graph<T>
派生结果为:Tree<T>
我们知道树是一个特定的图,所以我想扩展我的图类,而不让用户使用图类的 PUBLIC 方法。
制作:
template <typename T> class Tree : public Graph<T>{
.
.
.
}
有效,但我不想使用 Graph 类方法更改我的树状态。用户必须使用树类特定的方法。我想我应该使用私人继承来得到我想要的东西。
问题是我不能失去"是"的关系,因为树实际上是一个图。
什么是好的设计,才能使事情变得好和语义有序?
谢谢
好吧,你不能同时拥有它。 is-a 关系完全意味着用户可以在指针(或引用)上使用任何Graph
定义的非虚拟、未重写的函数来Tree
并实现预期结果。
如果不能允许用户调用这些函数,则意味着is-a
关系根据定义是不合适的,您应该选择私有继承。
私有继承不是一个好主意 - 有关更多详细信息,请参阅这篇文章。
但是,我认为您以错误的方式处理问题。如果树是图形,那么可能想要对图形执行的任何操作都是有效的。应该允许客户这样做。操作应以有意义的方式构建。如果您发现某些操作没有,那么这可能不是继承的正确使用。
请记住,在图论/组合数学中,树是图,但在计算机科学中,这种关系是脆弱的。树和图形表示为数据结构的方式完全不同,这使得代码共享变得麻烦。
面向对象并不总是很好用。树是一种特殊类型的图形。但是在特殊性方面,它比一般图形更受限制和更简单,并且支持更少的操作。因此,您可以编写一个允许任意数量的节点和任何拓扑的图库,然后在树层中限制拓扑。或者你可以说树根本不继承图。或者你可以说有一个抽象的"图库",然后可以用树、一般图、有向无环图、平衡树等来实例化。
我建议最后一个是你想要的。因此,编写一个至少一个虚拟成员函数设置为 null 的abstract_graph基类。
然后你可以私下继承。这取决于树客户端是否关心树是图。然而,私人继承并不常见。
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- C++GTKMM gui循环依赖关系
- 创建具有 new in 函数和"this is nullptr"异常的对象
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- Is !NaN not a NaN?
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- Where is std::hardware_destructive_interference_size?
- Is-没有虚函数 c++ 的关系
- C++ 访客模式与子类节点上的访客失去"is a"关系
- C++ 项目设计 - 私有继承和"is a"关系
- C++ IS-A 关系和头文件
- 什么是"is-implemented-in-terms-of"关系,何时应使用它?
- 这种关系"A is nested class in B"传递的吗?
- C++设计:自定义字符串类的基类构造函数和is-a或has-a关系