urls tutorial template example design-patterns oop interface class-design

design-patterns - tutorial - django views



El punto de una interfaz (5)

Posible duplicado:
¿Cómo sabré cuándo crear una interfaz?

Me pregunto sobre el punto de usar una interfaz.

¿Usas interfaces? Si es así, ¿cuándo decide usarlos y cuándo decide NO usarlos?

Actualmente tengo interfaces definidas para mis capas de servicio y mis capas de repositorio, pero me pregunto si me estoy perdiendo de otros lugares donde serían útiles.

Supongo que simplemente no entiendo completamente su propósito.


Un punto que muchas otras respuestas omiten es que las interfaces permiten una forma muy limitada de herencia múltiple, en el sentido de que dos o más clases no relacionadas pueden implementar una interfaz común, y el código puede aceptar objetos que implementen esa interfaz sin tener en cuenta su tipo. De lo contrario, la única forma de que el código acepte múltiples tipos de objetos y explote cualquier funcionalidad común sería que todos descienden de un tipo base común que a su vez implementó dicha funcionalidad.


Una interfaz define un contrato. Cualquier clase que implemente una interfaz debe cumplir ese contrato. Esto significa que la clase debe implementar métodos definidos en la interfaz.

Una interfaz básicamente dice: "Estoy definiendo algo que todos los implementadores deben hacer. No me importa cómo lo hagas, pero debes respaldar estas operaciones que he especificado".

Otro uso de las interfaces es que puede usarlas en firmas de métodos o definiciones de tipos para especificar el tipo más genérico de un objeto. Por ejemplo, en Java Map es una interfaz implementada por otras clases como HashMap o LinkedHashMap . Tanto HashMap como LinkedHashMap son esencialmente del tipo Map . Implementan los mismos métodos, pero hacen las cosas de manera diferente ( LinkedHashMap preserva el orden de inserción).

Considere la situación en la que tiene un método que acepta mapas. Si no tenía interfaces, necesitaría especificar un método para cada tipo de mapa. De hecho, podrías hacerlo a través de métodos sobrecargados, pero ese enfoque no es muy bueno. La mejor manera es especificar el tipo de argumento del método como Map . Luego, cualquier clase que implemente Map se puede pasar al método. De esta manera, no tiene que especificar un método para cada tipo de mapa, y tampoco está restringiendo a la persona que usa su método, a implementaciones específicas del mapa.

Una interfaz también garantiza que la funcionalidad especificada está presente en la implementación de clases. Como tal, también proporciona una forma estándar de acceder a esa funcionalidad. Las interfaces también son útiles cuando está diseñando una API (de esa manera puede especificar una interfaz estándar para las cosas que desea exponer).

Otro beneficio de las interfaces es que facilita la refacturación. Digamos que quiere cambiar una implementación de algún tipo de objeto. El objeto puede ser un argumento de método o puede ser una propiedad de clase. Dado que ha escrito ese argumento u objeto como una interfaz, simplemente puede crear una nueva clase que implemente la interfaz y pase esa clase. Dado que usaste la interfaz, no hiciste suposiciones adicionales en cuanto a los detalles de la clase. La interfaz abstrae los detalles de implementación de la clase que está utilizando. De esta forma, no terminará haciendo suposiciones que hagan que su código esté demasiado unido a una implementación específica.

Para resumir, las interfaces son sobre abstracción y contratos . Con la abstracción , ocultas los detalles subyacentes y expones solo el mínimo que necesitas exponer. De esta forma, la persona que usa su clase o interfaz no está cargada con los detalles de la implementación. Toda esa información está cuidadosamente oculta dentro de la clase específica que implementa la interfaz. El contrato asegura la estandarización en todos los ámbitos; una persona que usa la interfaz está segura de que todas las clases que implementan la interfaz exponen los mismos métodos.


Una interfaz es como una lista de reglas. Usted designa los requisitos de una clase, y para cualquier clase que implemente esta interfaz, usted sabe que ellos seguirán estas reglas. Puede convertir esas clases como este tipo de interfaz y operarlas sabiendo que tienen los métodos, las propiedades y los eventos que decidió que son necesarios.

Algunas interfaces importantes en ASP.Net son:

  • ICallbackEventHandler
  • IDisposable

Creé mi propia interfaz recientemente cuando quería estar seguro de que todas las clases que se utilizaron para un propósito específico tienen un método y un evento específicos. Sabiendo eso, primero podría verificar que implemente la interfaz lanzándola y verificando:

IMyInterface myinterface = myclass as IMyInterface; if (myinterface == null) { //did NOT implement the interface } else { //did implement the interface //call the method we KNOW is there. myinterface.MyMethod(myparemeter); }


Una interfaz es para decirle a los demás que una clase hace algo.

Por ejemplo, si tienes una clase de SoccerPlayer que implementa IInjurable , ya sabes, desde la primera línea del código de la clase, una instancia de SoccerPlayer sabe qué hacer cuando está lesionado (probablemente lo sabías justo después del guión).

Ahora considere qué implementando IEnumerable , IQueryable o IDisposable le informa sobre un objeto, y eso sin saber nada sobre la implementación en sí.
Parece mucho ...


Como otros han dicho, una interfaz define un contrato que puede implementarse por clases y estructuras. Esto permite interfaces como la herencia de objetos para habilitar el polimorfismo.

Sin embargo, la implementación de una interfaz difiere de la herencia de un objeto en ese

  1. Las estructuras pueden implicarlos.
  2. Las interfaces no pueden tener implicaciones.
  3. Se puede implementar más de una interfaz. Lo que permite un tipo de herencia múltiple sin los problemas asociados (para bien o para mal C # no implementa herencia múltiple)

Entonces, en general, las interfaces son buenas si quieres polimorfismo y lo quieres para

  1. estructuras
  2. la implementación compartida no tiene sentido o podría llevar a una base frágil clas
  3. ya existe una herencia de objeto en su clase objetivo

Los ejemplos estándar son IDisposable, IComparable e IEnumerable y muestran los usos más obvios.

Algunas cosas que debe evitar son las interfaces de marcadores (interfaces sin métodos) y las interfaces que no son compatibles. Por el sistema Por ejemplo, tiene IPost, BasePost, Question, Answer y Comment, pero el sistema solo usa BasePost.