2010-02-17 19 views

Respuesta

15

El tema de este post y el cuerpo dos preguntas diferentes:

  1. En caso de que tenga al menos un miembro abstracto?
  2. ¿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.

+0

Puede haber razones conceptuales por las que puede querer una clase abstracta que no tiene ningún método abstracto ... – thecoop

+0

¿Algún ejemplo de uno de esos escenarios donde no necesita un método abstracto en una clase abstracta? –

+0

@sai praveen, MouseAdapter es un ejemplo (si es un poco especial y altamente específico del idioma). – Yishai

6

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)

+3

+1 Esta respuesta es la más "al punto" y la respuesta concisa aquí. ¡Gracias! – AndHeCodedIt

14

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.

+0

+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

+0

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

9

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.

+2

+1 para la lección de historia. :) –

-1

Si una clase tiene un modificador abstract en su declaración, se convierte en la clase abstract.

+2

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

+0

@CPerkins - Lo digo diciendo "No al revés". – fastcodejava

+0

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

Cuestiones relacionadas