我有MaxHeap
类,它提供了一个堆将要执行的所有常用属性(ExtractMax,Add,Build)。现在我想测试它,但为了测试它,我需要使用我在内部使用它的结构(数组),以验证是否违反了堆属性。
堆属性是堆的每个节点(在整数的上下文中)比它的子节点更大,这可以通过此函数轻松完成,例如
/// <summary>
/// Determines if given array is max maxHeap.
/// </summary>
/// <typeparam name="T">Type of the elements contained in the maxHeap.</typeparam>
/// <param name="maxHeap"> The maxHeap.</param>
/// <param name="index"> Index from which to start.</param>
/// <returns>Whether the heap is max heap or not.</returns>
private static bool IsMaxHeap<T>(MaxHeap<T> maxHeap, int index = 0)
{
// if it is a leaf it is max maxHeap.
if (index >= (maxHeap.Count - 1)/2)
{
return true;
}
return Comparer<T>.Default.Compare(maxHeap[index], maxHeap[2 * index + 1]) > 0
&& Comparer<T>.Default.Compare(maxHeap[index], maxHeap[2 * index + 2]) > 0
&& IsMaxHeap(maxHeap, 2 * index + 1)
&& IsMaxHeap(maxHeap, 2 * index + 2);
}
但是这需要你的堆类具有公共索引器。如果我有权访问堆的内部表示,那么通过传递数组而不是MaxHeap
或通过MaxHeap
对象直接访问它,这个函数会变得更容易,但我不认为这是怎么回事应该这样做,因为结构的内部表示不应该暴露。
在不弄乱Heap类API的情况下,这样做的正确方法是什么?
MaxHeap
类,并公开所有需要的信息吗?MaxHeap
类中添加一些受保护的索引器并使用存根进行测试?(不要喜欢这种方法,因为它离开了继承我的类并获得对该索引器的访问权限,这基本上打败了不改变MaxHeap
)