У меня есть следующие интерфейсы:
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
динамическим, но это не решение, которое я ищу.Есть ли хороший способ сделать это?