2012-10-10 19 views
6

Al intentar implementar mi propia cola envolviendo la cola genérica, noté que Queue implementa ICollection. Sin embargo, la firma del método de ICollection.CopyTo es el siguienteQué hace Queue <T> realmente implementar

void CopyTo(
    Array array, 
    int index) 

Considerando que la firma del método genérico es Queue.CopyTo

public void CopyTo(
    T[] array, 
    int arrayIndex) 

Esto es lo mismo que la firma de la versión genérica de ICollection .Copiar a. Mi confusión proviene del hecho de que la cola genérica no parece implementar el ICollection genérico, sino que implementa el ICollection estándar. Entonces, ¿qué está pasando exactamente aquí?

+0

posible duplicado de [C# Stack Implements ICollection, pero tiene métodos de ICollection ] (http://stackoverflow.com/questions/10589803/c-sharp-stack-implements-icollection-but-has-methods-from- icollectiont) – nawfal

Respuesta

9

Según the documentation:

public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable 

Así que implementa la interfaz genérica IEnumerable<T>, pero la interfaz no genérico ICollection.

No dejes que la similitud de los nombres te engañe - ICollection y ICollection<T> son interfaces completamente separadas, y aunque algo como esto (implementando algunas interfaces genéricas pero otras interfaces no genéricas) es inusual, es completamente legítimo.

sospecho que hubo varios aspectos de ICollection<T> la que los diseñadores realmente no quieren apoyar en Queue<T>, pero igualmente se desea implementar ICollection para permitir a la gente a la actualización de la clase no genérica Queue sin dolor.

EDITAR: Como se señala en la respuesta de Dennis, ICollection.CopyTo se implementa explícitamente en Queue<T>. Esto significa que puede solo llegar a esa firma mediante una expresión del tipo ICollection. Por ejemplo:

Queue<string> queue = new Queue<string>(); 
Array array = new Button[10]; 
queue.CopyTo(array, 0, queue.Count); // Compilation failure... 
ICollection collection = (ICollection) queue; 
collection.CopyTo(array, 0, queue.Count); // Compiles, but will go bang 

El método de tomar una matriz fuertemente tipado que sea válida para implementar ICollection<T>.CopyTo, pero los AddRemove y métodos de ICollection<T> no están presentes - en su lugar, que está destinado a Enqueue y Dequeue valores .

+1

[Cielos, estas interfaces son un dolor de cabeza colectivo.] (http://tvtropes.org/pmwiki/pmwiki.php/Main/IncrediblyLamePun) – BoltClock

+0

@BoltClock: Sí.Enumeraría las dificultades, pero soy demasiado vago. –

+1

Esta es una buena respuesta, pero * solo * responde al * título * de la pregunta. La respuesta a la pregunta sobre las dos firmas diferentes se da en [respuesta de Dennis Traub] (http://stackoverflow.com/a/12826832/1106367). – Adam

2

Debido ICollection<T> contiene un método Remove que elimina un elemento desde cualquier lugar la colección. Esto no es aplicable a una cola, ya que solo puede eliminar el elemento superior sin reconstruir toda la cola.

Cuestiones relacionadas