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

时间:2015-05-13 13:20:52

标签: c# oop interval-tree

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

在BST内部,我有一个<script type = "text/javascript"> function GetLabelText() { $.ajax({ type: "POST", url: "page.aspx/functionname", data: {}, contentType: "application/json; charset=utf-8", dataType: "json", success: OnSuccess, failure: function(response) { alert(response.d); } }); } function OnSuccess(response) { $("#label").val(response.d); } </script> 类:

Node

在区间树中,我有一个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

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
} 

1 个答案:

答案 0 :(得分:1)

您的示例代码无法编译,但这是我认为您想要获得的内容:

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
        }
    }

然后在派生类中:

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);
        }
    }

你需要修复你的泛型问题,但你应该能够看到这一点。

由于IntervalNodeNode,因此您可以将其存储在基类所在的相同位置,不需要将其存储或将存储分开。这是继承的一个很好的部分。