该课程设置是否违反了Liskov替代原则

时间:2018-07-27 09:43:13

标签: c++ inheritance liskov-substitution-principle

我有一棵树的这段代码。 BST节点包含实际数据。 BST通过继承unique_ptr<BSTnode<Key,Data>>来封装它们。 BST不会向该类添加任何新字段。

继承使之成为我的树是unique_ptr<BSTnode>,但这是实现它的正确方法吗? BST的附加操作(例如rotate()/ insert()或remove())特定于数据结构。您不会也不应期望它们用于常规的unique_ptr,但这确实意味着BST不能与unique_ptr互换使用。

如果此实施策略不正确,该如何解决?

template <class Key, class Data>
class BST : public unique_ptr<BSTnode<Key, Data>>
{
using unique_ptr<BSTnode<Key, Data>>::unique_ptr;
// operations ...
};

template <class Key, class Data>
class BSTnode
{
friend class BST<Key, Data>;

public:
//constructors ...

protected:
Key key;
Data data;
BSTnode<Key, Data> *parent;
BST<Key, Data> left, right;
};    

1 个答案:

答案 0 :(得分:1)

除了LSP,继承标准类通常是有问题的,在大多数情况下不是推荐的解决方案。在这种情况下,正如@SomeProgrammerDude所建议的,最好使用composition并将指针放在类中:

template <class Key, class Data>
class BST
{
    std::unique_ptr<BSTnode<Key, Data>> root;
    // operations ...
};

任何人都不想使用您的BST类来替换unique_ptr。这是一个单独的数据容器,恰好利用unique_ptr来存储其数据。