Estoy pensando específicamente en la clase genérica HashSet<T>
. Implementa varias interfaces, pero ninguna expone la semántica correcta de un conjunto. Específicamente, ninguno admite un método Add
que devuelve bool
. (ICollection<T>
admite void Add
, que se puede utilizar de forma abreviada). Estas interfaces tampoco son compatibles con las operaciones de conjunto común, como uniones e intersecciones. (Aunque debe decirse que algunas de estas operaciones están disponibles a través de las extensiones IEnumerable<T>
.)¿Por qué no hay una interfaz "configurada" en .NET Framework?
Esto significa que la clase solo se puede usar como un conjunto con su implementación directa. Es decir, no puede hacer algo como esto:
ISet<int> = new HashSet<int>;
No sé, de todos modos. Entonces, ¿qué motivó la decisión de dejar esto?
Quizás lo más importante es esto: incluso si puede convertir HashSet<T>
en ICollection<T>
y otros, pierde el valor semántico en la API que está exponiendo. Es decir, los consumidores de su API no tienen ninguna indicación de que estén trabajando con un conjunto. Entonces, mientras usted podría llamar al ICollection<T>.Add
y pasar, las personas se sentirán confundidas si intentan agregar un artículo dos veces y no funciona. Una interfaz establecida daría a las personas las expectativas correctas.
¿Qué 'ISet' tiene que 'ICollection ' no tiene? –
Oh, creo que veo ... un método 'Add' que devuelve un' bool', ¿eh? –
@dan - no puede agregar duplicados a un conjunto. – UpTheCreek