2015-05-13 2 views
0

Я пишу дерево интервалов в C#. То, что я хотел бы сделать, это просто расширить существующее двоичное дерево поиска для хранения интервалов и не переписывать основные функции (добавлять, получать, удалять).Расширить класс без изменения реализации базового алгоритма?

Внутри BST, у меня есть 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 
} 

Я думаю, что я хотел бы быть в состоянии сделать что-то вроде этого:

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; 
+1

Наследованием класса Note вы уже не можете использовать метод добавления узла? –

+0

Вы имеете в виду 'base.Add'? – Grundy

+0

@Grundy: Я хочу хранить 'IntervalNode' в дереве, но не' Node'. – rookie

ответ

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

Вам нужно будет исправить проблему с генериками, но вы должны уметь это видеть.

С IntervalNode является Node, вы можете сохранить его в том же месте, что и в базовом классе, нет необходимости бросать его или отделять хранилище. Это хорошая часть о наследовании.

+0

Спасибо, Рон. 'Node' и' IntervalNode' являются внутренними классами 'BinarySearchTree' и' IntervalTree' соответственно. Я рассмотрю ваше решение. – rookie

Смежные вопросы