Supongamos que tenemos una clase abstracta A
y queremos obligar a todas las subclases a tener un campo determinado. Esto no es posible en Java, porque no podemos definir campos abstractos.¿Cómo evitar la falta de campos abstractos en Java?
Solución 1: Forzar subclases para implementar un método que proporcione el valor deseado.
abstract class A {
abstract int getA();
}
Inconveniente: Cada subclase tiene que implementar un método para cada campo abstracto que queremos tener. Esto puede conducir a muchas implementaciones de métodos.
Ventaja: Podemos utilizar el método getA
en la clase abstracta y aplicar métodos con él en A
sin implementar en cada subclase. Pero el valor detrás del método no puede ser sobrescrito por la clase abstracta.
Solución 2: Simule el campo abstracto forzando a la subclase a dar un valor a la clase abstracta.
abstract class A {
int a;
public A(int a) {
this.a = a;
}
}
Inconveniente: Cuando tenemos varios campos (> 10), la llamada súper constructor se verá un poco feo y confuso.
Ventaja: Se puede utilizar el campo a
en la clase abstracta y aplicar métodos con él en A
sin implementar en cada subclase. Además, la clase abstracta puede sobrescribir el valor a
.
Pregunta: ¿Qué solución alternativa es la forma común de alcanzar el objetivo? Tal vez hay uno mejor que los anteriores?
¿Me falta algo? ¿Por qué no simplemente dar a la clase abstracta un campo * concreto * protegido? ¿Por qué el deseo de un campo "* abstracto *"? ¿Para qué es un campo abstracto para comenzar? Nuevamente, ¿qué estoy perdiendo o no entendiendo? ¿Estoy sobre simplificando tu problema? ¿Y qué problema de comportamiento (no de código) estás tratando de resolver de todos modos? –
O puede proporcionar una implementación predeterminada de 'getA()' y simplemente anularla donde desee otro valor. – Keppil
_¿Por qué quieres forzar a todas las subclases a tener un campo? El problema generalmente se formula mejor en términos de forzarlos a tener un comportamiento específico, lo cual se hace con las especificaciones del método. –