【发布时间】:2018-02-26 13:09:05
【问题描述】:
我正在研究基于 C++ 分层树的类设计,具有两种对象类型,A 和 B。
A 类对象可以有任意数量的 A 或 B 类型的子对象,但它们必须按单一顺序存储。 B 类对象可能没有任何子对象。
我的问题是关于在 C++ 中处理混合类型集合的最佳 OO 实践。
我可以看到的一个解决方案是创建一个基类,A 和 B 都从该基类派生,并让 A 持有 vector<Base*> children。这似乎是一个很好的解决方案,除了下线更有可能是一些动态转换来确定子类型,我被告知这可能是代码设计不佳的症状。
另一个选项是让 A 类保存一个单独的 A 和 B 子级列表,以及一个表示该子级在组合子级列表中的位置的值。这似乎是一个更有问题的解决方案,因为当插入、删除或重新排列项目时,必须手动维护位置值。
第三种选择是将 A 类和 B 类的功能整合到一个类中,并有一个标志来说明如何解释对象。
这些是我解决这个问题的唯一选择吗?我是否错过了一些更优雅的解决方案,或者从错误的方向接近它?我已经看到 Boost 有一些用于异构集合的选项,但不幸的是,在这个项目中使用 Boost 不是一个选项。
编辑:我将尝试用更多细节来描述真实案例
A 类对象定义集合。它们保存字符串路径或模式,以定义一组对象(来自用户创建的池)。子集合定义了更多的子集。
B 类对象是覆盖对象。它们描述了要应用于由父 A 对象定义的对象集的操作。
集合和集合的顺序决定了覆盖的应用顺序。
我发现需要向下转型的点是在评估阶段,我在树中迭代以整理和应用覆盖 - 我需要知道如何处理树中的每个项目以及是否要查找位置或覆盖数据。从我收到的 cmets 看来,我应该能够通过真正的 OO 设计来完成我所需要的,所以在我模棱两可地说不然之前,我会再试一次。
【问题讨论】:
-
为什么在第一个解决方案中需要向下转型?你需要解决什么问题,你不能通过
virtual函数(和多态性)解决? -
第一种解决方案不能在 A 和 B 中都实现 GetType 方法以避免动态转换吗?
-
@UnholySheep,如果每个类都有一些独特的成员函数,我怎样才能在不向下转换的情况下从基类指针访问它们?
-
@KillzoneKid 你的意思是像从 GetType 检查枚举,然后根据结果进行静态转换?这比动态演员表更好吗?
-
为什么您的子类具有您需要直接访问的独特功能?我发现您的示例过于抽象,无法说明
A和B的真正要求(和用法)是什么。尽管应尽可能避免使用dynamic_cast,但在某些情况下是必要的。
标签: c++ class oop parent-child hierarchical-data