这是一个基本的 OO 设计问题。我正在用 C++ 编写类,以根据已解析的输入 C 文件来表示流程图中的项目。
简单地说,我们有 2 种类型的项目(类):FlowChartActionItem和FlowChartConditionItem。它们分别代表流程图的动作和决策/条件元素。它们还分别表示存在于输入 C 文件中的语句和 If 条件。这两个类都继承了 FlowChartItem。
每个子类都有许多指向它们后面的项目的指针;是的,我们有一个图表,带有节点(项目)和链接(指针)。但是FlowChartActionItem只有一个外向指针,而FlowChartConditionItem有 3 个外向指针(对于 then-statements 分支,else-statements 分支和指向 if 条件两个分支之后的任何内容的指针。
我的问题是为外向指针(nextItems)编写一个简洁的设置器。看看课程:
class FlowChartItem
{
public:
//I **need** this setter to stay in the parent class FlowChartItem
virtual void SetNextItem(FlowChartItem* nextItem, char index) = NULL;
};
-
class FlowChartActionItem:public FlowChartItem
{
public:
FlowChartItem* nextItem; //Only 1 next item
public:
void SetNextItem(FlowChartItem* nextItem, char index);
};
-
class FlowChartConditionItem: public FlowChartItem
{
public:
FlowChartItem* nextItem;
FlowChartItem* trueBranchItem;
FlowChartItem* falseBranchItem; //we have 3 next items here
public:
void SetNextItem(FlowChartItem* nextItem, char index);
};
我需要一个不依赖于子类拥有的指针数量的通用设置器。如您所见,我使用 char index 来告诉设置器要设置哪个指针。但我不喜欢这样,我需要让事情变得更整洁。因为代码将不可读,例如:
item1.setNextItem(item2,1);
我们不记得 1 是什么意思?当时的分支?别的???
显而易见的答案是在 FlowCharItem 中定义一个枚举,但是我们将遇到以下两个问题之一:
1- 现在将定义枚举值,因此将为当前子类 FlowChartActioItem 和 FlowChartConditionItem 量身定制,因此对未来子类的 SetNextItem 调用将具有非常差的可读性。更糟糕的是,他们不能有超过 3 个向外的指针!
2-通过让未来子类的开发人员编辑 FlowChartItem 的头文件并在枚举中添加任何值来解决第一个问题!当然不能接受!
我有什么解决方案来保持 - 良好的可读性 - 我的课程的整洁可扩展性?