我有以下界面:
public interface IPriorityQueue<T>
{
int Size { get; }
void Insert(T val);
T Max();
void DeleteMax();
}
public interface IMergeablePriorityQueue<T> : IPriorityQueue<T>
{
IPriorityQueue<T> Union(IPriorityQueue<T> Queue);
}
Union
是合并两个队列的操作。
现在,在我的实现中,它是左派堆,我想简化Union
的复杂性,并且只对引用到堆根的对象进行操作:
public class LeftistHeap<T> : IMergeablePriorityQueue<T>
where T : IComparable<T>
{
private Node root = null;
private LeftistHeap(Node newRoot, int newSize) {...}
public LeftistHeap<T> Union(LeftistHeap<T> Q)
{
return new LeftistHeap<T>(Union(root, Q.root), Size + Q.Size);
}
private static Node Union(Node node1, Node node2) {...}
...
}
但是此Union
未实现接口的Union
。
我以为我可以将IPriorityQueue
的引用转换为LeftistHeap
或使Queue
参数动态化,但这不是我正在寻找的解决方案。有没有一种整齐的方法可以做到这一点?
答案 0 :(得分:0)
否,您必须完全按照接口中指定的方式实现该方法。
此外,您不能依赖于参数为LeftistHeap,调用方可以传递任何实现IPriorityQueue的对象(当然,如果参数恰好是LeftistHeap,则可以选择更有效的实现)。
答案 1 :(得分:0)
我想我已经找到了解决方法:
public interface IMergeablePriorityQueue<TQ, T> : IPriorityQueue<T>
where TQ : IMergeablePriorityQueue<TQ, T>
{
TQ Union(TQ Queue);
}
然后在每个IMergeable...
接口的实现中,我都将当前类型放入TQ参数中:
public class LeftistHeap<T> : IMergeablePriorityQueue<LeftistHeap<T>, T>
where T : IComparable<T>
{
public LeftistHeap<T> Union(LeftistHeap<T> Q)
{
return new LeftistHeap<T>(Union(root, Q.root), Size + Q.Size);
}
...
}
此处描述了类似的问题:How to reference current class type using generics