OOP:设计树,在Node类和Tree Class之间划分功能

时间:2014-04-10 17:02:00

标签: c++ oop design-patterns

我需要实现一个自定义树类(使用C ++)。在我的工作中,我见过许多树实现。一些实现了一个暴露给用户的“超级节点”类。其中一个(根节点)充当树的实例。一些人暴露了一个树类,它使用一个节点类来构造一个树。有些人使用节点类作为纯数据结构,将树构造等功能留给树类。其他人将类似node.Split()的构造放入节点类中。

假设您需要设计二叉树(如KD树)。从OOP的角度来看,什么是“最好的”方法。节点类只包含数据,还是将其自身分解为子节点的逻辑?一般来说节点类应包含多少逻辑?

感谢您提供建设性意见!

1 个答案:

答案 0 :(得分:0)

这是你应该遵循的一条OOP规则,

  

每个班级代表一个实体。类具有属性和方法   即实体的属性及其行为

所以你需要按照你对场景的理解。

以下是我查看节点的方式。 它有一些数据,一个右节点参考和一个左节点参考。我不认为一个节点应该能够做任何事情,除了提供数据,所以我会写一个这样的节点类:

class Node
{
public:
    int Data;    // yeah, you would obviously use templates, so it's not restricted to a particular type

    Node* Left;
    Node* Right;

    // also you can write constructors and maybe some sort of cast operator overload to be able to make the 

    // we could also make it return the subtree itself
    getRightSubTree(){ return Tree(*Right); }
    getLeftSubTree(){ return Tree(*Left); }
};

树应该是这样的。

class Tree
{
private:
    Node root;
public:
    Tree(Node t):root(t){} // every tree should have a root. Cannot be null.

    // since the root node will be able to handle the tree structure, now we'll need the necessary methods
    void addNode(Node n){
    // code here
    }
    ....


    getSubTree(int data){
        // check if node with that data exists and all
        ...
        Node n = getNode(data);
        return Tree(n);
    }
};

好的,所以我觉得你现在有了一个主意。这都是关于你如何看待系统的。