uso usar usan una que programacion porque orientada objetos las interfaz interfaces ejemplos definicion como atributos c# .net oop interface

c# - usar - ¿Por qué una interfaz implementaría otra interfaz?



que es una interfaz en programacion orientada a objetos (2)

Estaba viendo la declaración de List<T> y vi que implementa IList<T> , ICollection<T> e IEnumerable<T> (entre otros).

Luego fui a buscar la definición de IList<T> y vi que implementa ICollection<T> e IEnumerable<T> .

¿Cuál es el punto de una interfaz que implementa otra interfaz si funcionan solo como "contratos" y no les escribimos ningún código real ?

¿Esta implementación es acumulativa? Si lo es, dado que IList<T> implementa ICollection<T> e IEnumerable<T> , List<T> no debería implementar solo IList<T> ?

Lo siento si mi pregunta es confusa, estoy un poco desconcertado en este momento.


¿Cuál es el punto de una interfaz que implementa otra interfaz si funcionan solo como "contratos" y no les escribimos ningún código real?

Las interfaces admiten la herencia y facilitan el polimorfismo de la misma manera que las clases. Un IList<T> también es un ICollection<T> , de la misma manera que un TextBox es un Control .

¿Esta implementación es acumulativa? Si es así, dado que IList implementa ICollection e IEnumerable, List no debería implementar solo IList?

Como han señalado otros, esto es principalmente para legibilidad y mantenibilidad. Sí, la herencia es acumulativa. Pero, cuando una clase implementa múltiples interfaces que contienen miembros con la misma firma, solo necesita definir un miembro para todas las implementaciones. La implementación explícita de la interfaz se puede usar para definir explícitamente un miembro para una implementación dada.


Por lo menos, reduce la redundancia.

public interface INamedObject { string Name { get; } } public interface IValuedObject<T> { T Value { get; } } public interface INamedValuedObject<T> : INamedObject, IValuedObject<T> { }

Es mejor diseño que:

public interface INamedObject { string Name { get; } } public interface IValuedObject<T> { T Value { get; } } public interface INamedValuedObject<T> { string Name { get; } T Value { get; } }

Además, en el último caso, observe que un INamedValuedObject<T> ahora no es un INamedObject ni un IValuedObject<T> .

Puede leer el primer caso como "Algo que es un INamedValuedObject<T> es algo que es un INamedObject , un IValuedObject<T> , y también tiene los siguientes elementos".