【发布时间】:2021-07-05 10:26:25
【问题描述】:
我有一个运行良好的二叉树类 BTree,我没有更改任何内容。
class BTreeNode {
private:
vector<string> data;
BTreeNode *parent = nullptr;
BTreeNode *leftChild = nullptr;
BTreeNode *rightChild = nullptr;
public:
BTreeNode();
BTreeNode(vector<string> noteData);
// getters and setters...
};
class BTree {
private:
BTreeNode *root = nullptr;
public:
BTree();
void add(vector<string> newNodeValue);
// other methods
};
但现在我想创建一个新的红黑树类RBTree。我认为通过继承来实现是个好主意。
第一个问题发生在红黑树的节点中。他们有一个额外的领域——颜色。如果红黑树RBTreeNode 的节点类继承BTreeNode,那么问题是BTreeNode 的getter 和setter 返回一个BTreeNode 对象,但我需要RBTreeNode。
class RBTreeNode : public BTreeNode {
public:
enum Colour { BLACK, RED };
private:
Colour colour;
public:
// constructors, getters and setters...
}
第二个问题是BTree 的root,因为在新的RBTree 类中,root 应该是RBTreeNode 类型。
那么,有没有办法以 OOP 方式解决它?还是我应该改变我的方法?
【问题讨论】:
-
既然你确定每个指针都指向
BTreeNode,那么向下转换就不会是一个邪恶的解决方案。但是使用(模板)组合并将来自BTree的调用委托给具体实现可能比使用继承更容易。
标签: c++ oop inheritance architecture