Te damos la solución a este asunto, al menos eso creemos. Si sigues con inquietudes dínoslo, para nosotros será un gusto responderte
Solución:
Defina un constructor en la clase abstracta que establece el campo para que las implementaciones concretas sean según la especificación requerida para llamar/anular el constructor.
P.ej
public abstract class AbstractTable
protected String name;
public AbstractTable(String name)
this.name = name;
cuando te extiendes AbstractTable
la clase no se compilará hasta que agregue un constructor que llame super("somename")
.
public class ConcreteTable extends AbstractTable
private static final String NAME = "concreteTable";
public ConcreteTable()
super(NAME);
De esta manera, los implementadores están obligados a establecer name
. De esta manera también puedes hacer (null) verifica el constructor de la clase abstracta para hacerlo más robusto. P.ej:
public AbstractTable(String name)
if (name == null) throw new NullPointerException("Name may not be null");
this.name = name;
Creo que su confusión es con las propiedades de C# frente a los campos/variables. En C# no puede definir campos abstractos, ni siquiera en una clase abstracta. Sin embargo, puede definir propiedades abstractas ya que estos son métodos efectivos (por ejemplo, compilados para get_TAG()
y set_TAG(...)
).
Como algunos han recordado, nunca debe tener campos/variables públicos en sus clases, incluso en C#. Varias respuestas han insinuado lo que recomendaría, pero no lo han dejado claro. Debe traducir su idea a Java como una propiedad JavaBean, usando getTAG(). Luego, sus subclases tendrán que implementar esto (también he escrito un proyecto con clases de tabla que hacen esto).
Así que puedes tener una clase abstracta definida así…
public abstract class AbstractTable
public abstract String getTag();
public abstract void init();
...
Luego, en cualquier subclase concreta, necesitaría definir un static variable final (constante) y devuelve eso de la getTag()
algo como esto:
public class SalesTable extends AbstractTable
private static final String TABLE_NAME = "Sales";
public String getTag()
return TABLE_NAME;
public void init()
...
String tableName = getTag();
...
EDITAR:
No puede anular los campos heredados (ya sea en C# o Java). Tampoco puedes anular static miembros, ya sean campos o métodos. Así que esta también es la mejor solución para eso. Cambié mi ejemplo de método init anterior para mostrar cómo se usaría esto; nuevamente, piense en el método getXXX como una propiedad.
No existen variables abstractas en Java (o C++).
Si la clase principal tiene una variable y una clase secundaria amplía la clase principal, entonces el elemento secundario no necesita implementar la variable. Solo necesita acceso a la instancia de los padres. Ya sea obtener/establecer o acceso protegido servirá.
“…entonces se me debe pedir que implemente los resúmenes”? Si extiende una clase abstracta y no implementa un método abstracto, el compilador le indicará que lo implemente o que marque la subclase como abstracta. Eso es todo lo que recibirá.
Acuérdate de que tienes permiso de decir si te ayudó.