我想写一个基于队列接口的对象。我搜索了一下 IQueue<T>
,但出乎意料地毫无结果。
以下是与集合相关的接口:
ICollection<T>
IList<T>
IDictionary<TKey,TValue>
ISet<T>
为什么这些类型的集合有明确定义的接口?为什么栈和队列不需要接口呢?
我想写一个基于队列接口的对象。我搜索了一下 IQueue<T>
,但出乎意料地毫无结果。
以下是与集合相关的接口:
ICollection<T>
IList<T>
IDictionary<TKey,TValue>
ISet<T>
为什么这些类型的集合有明确定义的接口?为什么栈和队列不需要接口呢?
嗯,因为那些接口与实现它们的类之间存在一对一的映射(除了最新的ConcurrentQueue
)。但其他提到的接口有许多实现它们的类。
稍微扩展一下。我们无法了解BCL团队的真正动机。但我有一种感觉,当他们创建Queue
和Stack
这两个类时,这些类看起来如此平凡,以至于他们决定不将它们抽象成接口。原因很明显:那些类看起来既简单又完整,所以没有理由在BCL中创建不同的实现。然后就出现了ConcurrentQueue
,前面的说法变得略微不正确。
正如所指出的,Queue
和ConcurrentQueue
并没有太多相似之处,可以使它们实现单个接口。
ConcurrentQueue<T>
与 Queue<T>
的语义(大多数情况下)也有所不同;它们唯一真正共享的抽象是 Enqueue
。 - Jeff SternalConcurrentQueue<T>
和ConcurrentStack<T>
类的存在证明了您的观点,即应该有IQueue<T>
和IStack<T>
接口。 即使它们最初不存在,也应在.NET 4中添加它们。ConcurrentQueue<T>
是否会让Queue<T>
和它实现一个共同的接口更有意义?请注意,ConcurrentQueue<T>
目前在BCL中已经存在。 - LukeHIQueue<T>
接口!我的实现将使用同步存储并持久化到磁盘。如果能够重用已有的接口而不是定义自己的接口,那就更好了! - Paul TurnerQueue<T>
和ConcurrentQueue<T>
之间的常见抽象仍然很有用,即使它们只是将CQ<T>
作为Q<T>
的真正特化。 - LukeHSortedSet<T>
ж—¶пјҢиҝҷ并没жңүйҳ»жӯўд»–们引е…ҘISet<T>
жҺҘеҸЈе№¶е°Ҷе…¶йҖӮй…ҚеҲ°HashSet<T>
гҖӮ - LukeH我认为没有什么特别的原因。如果我能自己选择,我会更倾向于有更多离散定义的接口,即使没有只实现它们的类。例如,我可能会实现一个QueueStack(Of T),它将实现IGetNext(Of T)、IGetNextWait(Of T)和IClear(Of T),以及IQueue(Of T)、IWaitQueue(Of T)、IStack(Of T)和IWaitStack(Of T)。使用对象的人可以明确指定他们实际需要的内容,而实现者只需实现他们声称支持的内容。