En Java, puede crear una clase abstracta que contenga solo métodos abstractos. Por otro lado, puede crear una interfaz que declare los mismos métodos. Siendo ese el caso, ¿puedes usar clases abstractas en lugar de interfaces?¿Las clases abstractas de Do/can reemplazan las interfaces?
Respuesta
No siempre:
- una clase puede extender único clase
- una clase puede implementar más de un interfaz
Sun docs hacer una comparación más detallada:
Clases abstractas frente a interfaces
A diferencia de las interfaces, las clases abstractas pueden contener campos que no son estáticos y finales, y pueden contener métodos implementados. Dichas clases abstractas son similares a las interfaces, excepto que proporcionan una implementación parcial, dejándola en subclases para completar la implementación. Si una clase abstracta contiene solo declaraciones de métodos abstractos, debe declararse como una interfaz.
Se pueden implementar múltiples interfaces por clases en cualquier parte de la jerarquía de clases, independientemente de si están relacionadas entre sí de alguna manera. Piense en Comparable o Cloneable, por ejemplo.
En comparación, las clases abstractas se subclasan más comúnmente para compartir piezas de implementación. Una clase abstracta única se subclasifica por clases similares que tienen mucho en común (las partes implementadas de la clase abstracta), pero también tienen algunas diferencias (los métodos abstractos).
En algunos casos, puede utilizar una clase abstracta en lugar de la interfaz. Sin embargo, casi nunca es una buena idea hacerlo. En general, debe usar la regla:
- Las interfaces especifican el comportamiento.
- Las clases abstractas especifican la implementación.
El otro "problema" con el uso de clases abstractas es que ya no puede implementar mixins, es decir, puede implementar múltiples interfaces, sin embargo, solo puede extender una clase abstracta.
Para responder a su pregunta, sí podría utilizar una clase abstracta (siempre y cuando no aplicación) en lugar de una interfaz, pero me gustaría considerar esta mala práctica:
- Usted ha utilizado su "uno -shot "en herencia (sin obtener ningún beneficio).
- No puede heredar de múltiples clases abstractas, pero puede implementar múltiples interfaces.
Recomendaría el uso de clases abstractas más en situaciones en las que desee proporcionar una implementación parcial de una clase, posiblemente delegando algún comportamiento a implementaciones concretas de subclases.
Una clase en java puede heredar de múltiples interfaces, pero solo de una clase abstracta.
Una interfaz no puede definir cualquier código, en una clase abstracta, puede definir código (es decir, el comportamiento por defecto de los métodos)
clases abstractas e interfaces son complementarios.
Por ejemplo, al crear una API, deseará presentar interfaces para el cliente, de modo que siempre puede cambiar completamente la implementación mientras que no tiene que cambiar su código y el usuario no confía en la implementación cuando construye usando su API, pero solo en contratos de métodos.
, entonces tendrá clases abstractas se integra parcialmente estas interfaces, a fin de
- cuota de un código común que podría ser utilizado en todas (o casi todas) las implementaciones de interfaz, lo cual es obvio
- proporcionar un comportamiento predeterminado que podría anularse en implementaciones 'reales', por ejemplo, un método toString() utilizando métodos de interfaces para crear una representación textual de la implementación
- preservar la compatibilidad de implementaciones después de los cambios de interfaz, por ejemplo cuando agrega un nuevo método en su interfaz, usted al por lo que añadir una implementación por defecto en la clase abstracta de modo que las implementaciones (por ejemplo, las realizadas por el usuario) que se extiende la clase abstracta siguen funcionando sin cambios
Uno de los puntos que faltan en las respuestas aquí es la idea de que se implementar la interfaz
Si el componente de retorno quiere instancias de tipos abstractos a sus llamadas, donde los tipos de hormigón son definido internamente y oculta a las personas que llaman, utilizar una interfaz. Por el contrario, si su componente consume o acepta instancias de tipos abstractos que sus llamadores debe implementar, clases abstractas son generalmente una mejor opción.
Anticipar la evolución y mantener la compatibilidad binaria da un puntaje a las escalas aquí. Con una clase abstracta, puede agregar métodos y, si proporciona una implementación base, las implementaciones existentes de de la clase abstracta continuarán funcionando bien. Con una interfaz, agregar un método rompe la compatibilidad binaria, ya que es posible que ninguna implementación existente continúe compilando correctamente sin cambiar para definir el nuevo método.
Apache Cactus project tiene a good discussion sobre cómo resolver estas obligaciones.
Las interfaces son mucho más limpias y livianas. Las clases abstractas te hacen depender mucho de él ya que no puedes extender ninguna otra clase.
Tenga una mirada en el interesante artículo "Why extends is evil" para tener una idea acerca de las diferencias entre la aplicación y la interfaz de la herencia de clases (al lado de las obvias restricciones múltiples individuales)
Las clases abstractas son la aplicación parcial de la abstracción mientras que las interfaces son la implementación completa de Abstraction.Means en clases abstractas podemos poner métodos de declaración, así como el cuerpo del método. No podemos crear un objeto de clases abstractas (asociación) y reutilizar la clase por herencia (no por asociación). Por defecto en las interfaces, todas las variables declaradas son estáticas finales y Todos los métodos son públicos.
Por ejemplo: En el JDK sólo hay pocas clases abstractas y HttpServlet es uno de ellos que se utiliza en Servlet.So no podemos crear el objeto de HttpServlet y puede ser utilizado sólo por sucesiones.
¿Cuál debería usar, clases abstractas o interfaces?
considerar el uso de clases abstractas si alguna de estas afirmaciones se pueden aplicar a su situación:
- desea compartir código entre varias clases estrechamente relacionadas.
- Espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o que requieran modificadores de acceso que no sean públicos (como los protegidos y los privados).
- Quiere declarar campos no estáticos o no finales. Esto le permite definir métodos que pueden acceder y modificar el estado del objeto al que pertenecen.
considerar el uso de interfaces de si alguna de estas afirmaciones se pueden aplicar a su situación:
- Se espera que las clases no relacionadas podrían implementar su interfaz. Por ejemplo, las interfaces Comparable y Cloneable son implementadas por muchas clases no relacionadas.
- Desea especificar el comportamiento de un tipo de datos en particular, pero no le preocupa quién implementa su comportamiento.
- Desea aprovechar la herencia de tipo múltiple.
Consulte la documentación de Oracle para obtener más detalles link
El uso principal de la interfaz es cuando se crea la referencia de interfaz y llamar al método de la clase particular que se resuelve en tiempo de ejecución. Por lo tanto, siempre es mejor idea crear una referencia de interfaz para llamar al método.
Las interfaces solo pueden contener el método abstracto, también las interfaces pueden implementar múltiples interfaces para cualquier clase. Pero un resumen contiene métodos abstractos y no abstractos, y los métodos abstractos no pueden extenderse a más de una clase.
- 1. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 2. Interfaces vs. clases abstractas
- 3. .net Herencia múltiple de las clases abstractas
- 4. Qt interfaces o clases abstractas y qobject_cast()
- 5. ¿Por qué crear clases e interfaces abstractas?
- 6. Pruebas unitarias clases abstractas y/o interfaces
- 7. ¿Insinúa el tipo de php no llevarse bien con las interfaces y las clases abstractas?
- 8. Cómo crear propiedades abstractas en las clases abstractas de Python
- 9. Cómo probar las clases abstractas de unidad
- 10. ¿Es pitónico utilizar interfaces/clases base abstractas?
- 11. Java: variables finales en las clases abstractas
- 12. ¿Las clases abstractas pueden implementarse en C#?
- 13. ¿Las clases abstractas tienen un VTABLE?
- 14. Alternativas a java.lang.reflect.Proxy para la creación de proxies de clases abstractas (en lugar de las interfaces)
- 15. sun.org.mozilla Rhino y se extienden las clases abstractas Java
- 16. estilo de código Java - Interfaces vs. clases abstractas
- 17. C# tiene clases e interfaces abstractas, ¿debería tener también "mixins"?
- 18. Grandes clases base abstractas
- 19. de Python(), las clases base abstractas y NotImplementedError
- 20. ¿Las clases de ayudante/utilidad deben ser abstractas?
- 21. Delegados (expresiones Lambda) Vs Interfaces y clases abstractas
- 22. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 23. php clases e interfaces abstractas que implican métodos estáticos?
- 24. ¿Por qué XmlSerializer serializa clases abstractas pero no interfaces?
- 25. Java genéricos, genéricos extendidas y las clases abstractas
- 26. ¿Por qué las clases abstractas en Java tienen constructores?
- 27. Clases selladas abstractas
- 28. ¿Las interfaces son redundantes con herencia múltiple?
- 29. ¿Por qué las clases de Java no heredan las anotaciones de las interfaces implementadas?
- 30. referencias abstractas a interfaces genéricas
Pero ... al menos puede agregar un método a una clase abstracta sin romper todas las subclases que alguien haya creado. – Trejkaz
@Trejkaz En Java v8 que (probablemente) también será el caso: http://www.javabeat.net/2012/05/virtual-extension-methods-in-java-8/ –
Interesante, finalmente los rasgos entrarán en Java sí mismo, reduciendo la tentación de cambiar a Scala.:) (Por cierto, esquivo este problema en mis API basadas en interfaz al poner todos los métodos de extensión en una clase de utilidad separada ... pero se ve más feo cuando lo llamas). – Trejkaz