在不更改基本算法实现的情况下扩展 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 相同的位置,不需要转换它或将存储出来。这是关于继承的一个很好的部分。
我正在用 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 相同的位置,不需要转换它或将存储出来。这是关于继承的一个很好的部分。