sirve - metodos abstractos java
Clases y métodos abstractos en Java, herencia (5)
Tengo la clase B, que hereda de la clase A. La superclase A es abstracta, que contiene un método abstracto. No quiero implementar el método abstracto en la clase B, por lo tanto, también debo declarar que la clase B es abstracta. Al declarar el resumen de la clase B, dos cosas me funcionan (los programas se compilan y ejecutan correctamente):
1.) No declaro ningún método abstracto en la clase B, aunque la clase sea abstracta. Esto funciona, supongo, porque la clase hereda el método abstracto de la clase A, y esto es suficiente para que la clase se declare como abstracta: no necesitamos ningún otro método abstracto declarado directamente en la clase.
2.) Declaro el mismo método abstracto en la clase B como se declara en la clase A. Esto es una especie de anulación (?), No en el mismo sentido que anulación en Java (usando el mismo encabezado, pero proporcionando una implementación diferente ), aquí solo uso de nuevo el mismo encabezado del método.
Ambas cosas funcionan, y no estoy seguro de si ambas están bien, y si algunas de ellas son preferidas (más correctas) que la otra. ¿Son las dos formas iguales (significan lo mismo para Java)?
Aquí doy algunas clases de ejemplo, de modo que lo que quiero decir es más claro para ti:
Caso 1.):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
}
Caso 2.):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
public abstract String giveSum();
}
Saludos
En Java, la anotación de clase abstract
indica que la clase no se puede instanciar directamente. Una clase podría declararse abstract
simplemente porque nunca debería ser instanciada (quizás contenga solo métodos estáticos), o porque sus subclases deberían ser instanciadas en su lugar.
No es un requisito que las clases abstract
contengan métodos abstract
(lo contrario es cierto: una clase que contiene uno o más métodos abstract
debe ser abstract
).
La cuestión de si debe duplicar la definición del método abstracto puede percibirse como una cuestión de estilo, pero sería muy difícil presentar un argumento a favor de la duplicación de la definición (el único argumento que se me ocurre es el del caso donde la jerarquía de clases podría cambiar la semántica o el uso del método, y por lo tanto, le gustaría proporcionar un javadoc adicional en la clase B.)
El argumento principal contra la redefinición del método abstract
es que el código duplicado es malo: hace que la refactorización sea más engorrosa y más (se aplican todos los argumentos clásicos de "no duplicar código").
Entonces, la pregunta es: ¿cuál es el preferido cuando se subclasifica una clase abstracta en Java y no se quiere proporcionar implementación?
a) marcar la subclase como abstracta también
b) marcar la subclase también como abstracta Y volver a escribir la firma del método marcada como abstracta?
Yo iría por el primero:
a) Marque la subclase como abstracta también.
El primero ya tiene la declaración del método abstracto, no tiene sentido repetirla.
Son funcionalmente iguales, pero el primero es preferido porque es más corto y no es extraño.
Tienes razón, los dos casos son equivalentes. Caso 1) es más simple, caso 2) es duplicación de código - evítelo. Pero puede haber una razón para hacerlo:
Si el método en la clase A no devuelve String
pero permite decir C, la clase B puede anularlo (desde Java 5) con un tipo de retorno más específico, digamos D (la clase se extiende C):
public abstract class A {
public abstract C giveSum();
}
public abstract class B extends A {
public abstract D giveSum();
}
public class C {
...
}
public class D extends C {
...
}
Ve con el # 1. Reescribir la declaración de método en la clase secundaria es confuso. Y realmente no necesita ningún método abstracto en una clase abstracta, independientemente de si el padre es abstracto o no.