Вы хотите, чтобы ваши конечные узлы и ваши внутренние узлы работали по-разному, при этом все еще имея возможность ссылаться на них обоих как на узлы.Это описывает иерархию наследования:
abstract class Node<K, V>
{
public K[] Keys { get; protected set; }
}
class LeafNode<K, V> : Node<K, V>
{
public V[] Values { get; protected set; }
}
class InnerNode<K, V> : Node<K, V>
{
public Node<K, V> Children { get; protected set; }
}
Другой вариант - использовать C # эквивалент void*
, то есть object
, но это будет означать, что код больше не является типобезопасным, и вы могли быдолжны быть повсюду.Я бы не рекомендовал делать это.
При этом, почему вы создаете свое собственное B-дерево?Это полезно только при хранении данных на диске, а не в памяти.Если вы делаете это только для того, чтобы иметь ассоциативный массив, в .Net есть классы, которые уже реализуют его (например, Dictionary<K,V>
или SortedDictionary<K,V>
), и они прекрасно работают.