在不更改基本算法实现的情况下扩展 class?

Extend a class without changing a base algorithm implementation?

我正在用 C# 编写区间树。我想做的只是扩展现有的二叉搜索树来存储间隔,而不必重写核心功能(添加、获取、删除)。

在 BST 里面,我有一个 Node class:

protected class Node 
{
    public KeyValuePair<TKey, TVal> Data;
    public Node Left, Right;

    public Node(KeyValuePair<TKey, TVal> data,
        Node left = null, Node right = null)
    {
        Data = data;
        Left = left; Right = right;
    }
}

在间隔树中,我有一个 IntervalNode class 扩展 Node:

private class IntervalNode : Node
{
    public Interval<TInterval> Interval;
    public override string ToString()
    {
        return string.Format("A={0}, B={1}", Interval.A, Interval.B);
    }

    public IntervalNode(KeyValuePair<TInterval, TVal> data, 
        Node left = null, Node right = null)
        : base(data, left, right)
    {
    }
}

我 运行 遇到的问题是尝试在树中存储 IntervalNode 而不是 Node。现在有什么方法可以将 Add 的现有基本实现与 IntervalNode 一起使用?

protected Node Add(Node root, KeyValuePair<TKey, TVal> data)
{
    // regular binary search tree insert
} 

我想我想做的是这样的事情:

public void Add(Interval<TInterval> intvl, TVal val)
{
    _root = Add((Node)_root, new KeyValuePair<TInterval, TVal>(intvl.A, val));
    IntervalNode inserted = (IntervalNode)Get(_root, intvl.A);
    inserted.Interval = intvl;
}

// tree should store IntervalNodes, not Nodes
private IntervalNode _root;

您的示例代码无法编译,但我认为您要达到的目的是:

protected class Node
    {
        public KeyValuePair<TKey, TVal> Data;
        public Node Left, Right;

        public Node(KeyValuePair<TKey, TVal> data,
            Node left = null, Node right = null)
        {
            Data = data;
            Left = left; Right = right;
        }

        public virtual void Add(Node root, KeyValuePair<TKey, TVal> data)
        {
            //Do whatever
        }
    }

然后在导出class:

private class IntervalNode: Node
    {
        public Interval<TInterval> Interval;
        public override string ToString()
        {
            return string.Format("A={0}, B={1}", Interval.A, Interval.B);
        }

        public IntervalNode(KeyValuePair<TInterval, TVal> data, 
            Node left = null, Node right = null)
            : base(data, left, right)
        {
        }

        public override void Add(Node root, KeyValuePair<TInterval, TVal> data)
        {
            //Do whatever you need to, then
            base.Add(root, data);
        }
    }

您需要解决您遇到的泛型问题,但您应该能够明白这一点。

由于 IntervalNode 是一个 Node,您可以将它存储在与基数 class 相同的位置,不需要转换它或将存储出来。这是关于继承的一个很好的部分。