2012-02-11 16 views
8

Hay dos formas de elegir entre la clase abstracta o la interfaz. solución de Microsoft y la solución de Oracle:Clase o interfaz abstracta. ¿Qué camino es correcto?


Microsoft, las directivas de diseño:

hace uso de resumen (MustInherit en Visual Basic) clases en lugar de interfaces para desacoplar el contrato de implementaciones.

http://msdn.microsoft.com/en-us/library/ms229013.aspx


Oracle, Los Tutoriales de Java:

Si una clase abstracta contiene sólo declaraciones de métodos abstractos, debe ser declarada como una interfaz en su lugar.

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


Mi pregunta es qué camino es el correcto? ¿Solución de Microsoft u Oracle? Tenga en cuenta que creo que elegir entre la clase abstracta o la interfaz no debe depender del lenguaje de programación (Java o C#).

Respuesta

10

Si recuerdo que mi blog está leyendo correctamente, los consejos de Microsoft para usar clases abstractas provienen de la capacidad de reutilizar la implementación con una clase abstracta, algo que no se puede hacer con una interfaz.

Tenga en cuenta también que la página de Microsoft a la que se vinculó es específicamente una guía para escribir bibliotecas de códigos para compartir/reutilizar en varios proyectos. La probabilidad en esta situación es que usted mismo escriba todas las implementaciones de la interfaz, probablemente dentro del mismo ensamblaje. Las buenas prácticas para trabajar en un solo producto o sistema variarán un poco.

Un enfoque común que he visto a través de una serie de bases de código en varios idiomas es la siguiente:

  • Definir una interfaz para especificar el contrato
  • Crear una clase abstracta aplicación del contrato de prestación de cualquier implementación común útil para todos los descendientes
  • Las implementaciones del contrato tienen la opción de comenzar desde la clase base por conveniencia, o simplemente implementar la interfaz si quieren control total

Un cuarto paso común en el mundo .NET es proporcionar convenientes funciones de extensión construidas en la interfaz.

+0

+1 "Las buenas prácticas para trabajar en un solo producto o sistema variarán un poco" –

1

Una interfaz no tiene implementación, es un contrato. Permite el desacople completo.

Iré de una interfaz a una clase abstracta (base) si deseo proporcionar alguna implementación común mientras forzo a la clase concreta de clase heredada a proporcionar alguna implementación específica para esa clase. Eso proporciona un poco menos de desacoplamiento.

También tenga en cuenta que muchos lenguajes como C# (y lenguajes .net como VB.net etc ...) así como Java no permiten herencia múltiple por lo que las interfaces se convierten en una forma de permitir que una clase tenga muchos comportamientos.

7

Son 2 declaraciones para diferentes contextos.

La guía de Microsoft que cita es para "Diseño de bibliotecas de clases". Y establece la razón para favorecer las clases abstractas allí: puede agregar funcionalidad sin romper nada.

Para separación y desacoplamiento sobre capas y otros límites, Microsoft también aconseja interfaces.

+0

+1 - Buena aclaración ... – bryanmac

+0

+1 - esto indica el motivo clave de la recomendación de Microsoft. – Joe

Cuestiones relacionadas