¿Es necesario que una clase abstracta tenga al menos un método abstracto?¿Debe una clase abstracta tener al menos un método abstracto?
Respuesta
El tema de este post y el cuerpo dos preguntas diferentes:
- En caso de que tenga al menos un miembro abstracto?
- ¿Es necesario tener al menos un miembro abstracto?
La respuesta al n. ° 2 es definitivamente no.
La respuesta al n. ° 1 es subjetiva y una cuestión de estilo. Personalmente, yo diría que sí. Si su intención es evitar que se cree una instancia de una clase (sin métodos abstractos), la mejor manera de manejar esto es con un constructor
private
protected
, no marcándolo abstract
.
Puede haber razones conceptuales por las que puede querer una clase abstracta que no tiene ningún método abstracto ... – thecoop
¿Algún ejemplo de uno de esos escenarios donde no necesita un método abstracto en una clase abstracta? –
@sai praveen, MouseAdapter es un ejemplo (si es un poco especial y altamente específico del idioma). – Yishai
No, puede declarar un resumen de clase sin tener ningún método abstracto. Puede que no tenga sentido conceptualmente que exista una instancia de esa clase, o puede asegurarse de que solo las subclases de esa clase puedan crearse instancias (por cualquier razón)
+1 Esta respuesta es la más "al punto" y la respuesta concisa aquí. ¡Gracias! – AndHeCodedIt
No, no es necesario. Verá esto a menudo en el patrón de diseño "template method", como HttpServlet
, donde cada método ya tiene definido el comportamiento predeterminado y puede anular solo uno (o más) de ellos en lugar de todos ellos.
+1 porque este es un buen punto al menos de vez en cuando, aunque me parece un poco extraño que cualquier clase de patrón de método de plantilla tenga un valor de sana para todo. – dsimcha
En el caso de 'HttpServlet' es útil, se devuelve el error HTTP 503" Método no permitido "en cualquiera de los métodos' doXXX() 'implementados por defecto, completamente según la especificación HTTP. – BalusC
En JDK 1.0 era necesario tener al menos un método abstracto en una clase abstracta. Esta restricción se eliminó en JDK 1.1 (1997? (Soy viejo)) y tales clases se agregaron a la biblioteca de Java, como java.awt.event.KeyAdapter
.
En C++ necesita al menos una función virtual pura para hacer necesaria una subclase y al menos una función virtual para agregar RTTI a la clase. Por lo general, tiene sentido usar el destructor.
Tenga en cuenta que al anular métodos no abstractos, usar @Override
es una buena idea. No solo le dice al lector información importante sobre lo que el código está intentando hacer, sino que también detecta errores comunes donde los errores tipográficos o los tipos de parámetros incorrectos impiden la anulación.
+1 para la lección de historia. :) –
Si una clase tiene un modificador abstract
en su declaración, se convierte en la clase abstract
.
Es perfectamente válido sintácticamente definir una clase como abstracta cuando no tiene métodos abstractos. No estoy bajoneando, pero esta respuesta es objetivamente incorrecta. Tenga en cuenta que el lenguaje para la pregunta es Java, no C++. – CPerkins
@CPerkins - Lo digo diciendo "No al revés". – fastcodejava
Y todavía estás equivocado. Si una clase tiene el modificador 'abstracto', es abstracto por definición, ya sea que tenga métodos abstractos o no. – EJP
- 1. Usando un método de una clase abstracta
- 2. C++: Crear clase abstracta con método abstracto y anular el método en una subclase
- 3. ¿Cómo escuchar un método abstracto?
- 4. método genérico en la clase abstracta
- 5. Método vacío en una clase abstracta
- 6. ¿Método abstracto o virtual?
- 7. La clase de contrato debe ser una clase abstracta
- 8. Al menos un objeto debe implementar IComparable
- 9. C# Desechar método abstracto
- 10. Método abstracto en Ruby
- 11. Método abstracto que devuelve una instancia de clase derivada
- 12. Método abstracto PHP versus método predeterminado
- 13. Java: Anulando un método abstracto en la subclase
- 14. Cómo llamar al método de clase abstracta en java
- 15. Clase/método abstracto, cómo C# -> VB.NET
- 16. Método abstracto C# con implementación de clase base solamente?
- 17. Especificación del tipo de retorno de un método abstracto de una clase base de acuerdo con un Clase Sub
- 18. ¿Es bueno tener un constructor en clase abstracta?
- 19. Definir un método abstracto sin especificar los parámetros
- 20. Un texto JSON debe contener al menos dos octetos
- 21. Haciendo una clase abstracta sin ningún método virtual puro
- 22. ArgumentError: Debe suministrar al menos una validación con: si
- 23. Clase 'Habitación' es abstracto; no se puede crear una instancia
- 24. ¿Cómo implementar una clase abstracta en F #?
- 25. Debe seleccionar al menos una plataforma para mostrar Listado
- 26. Validar usuario debe instalar al menos una de las subfunciones
- 27. ¿En qué casos la superclase no debe ser abstracta?
- 28. Sqlalchemy: evitar la herencia múltiple y tener clase base abstracta
- 29. Java: tipo de retorno polimórfico en un método abstracto?
- 30. Cómo crear una clase que sea abstracta, pero no internamente
Vea también http://stackoverflow.com/questions/362446/abstract-class-with-all-concrete-methods, pero no creo que sea * bastante * un duplicado. –