Tengo una clase abstracta, relation
en el paquete database.relation
y una subclase de ella, Join
, en el paquete database.operations
. relation
tiene un miembro protegido llamado mStructure
.¿Por qué mi subclase no puede acceder a una variable protegida de su superclase, cuando está en un paquete diferente?
En Join
:
public Join(final Relation relLeft, final Relation relRight) {
super();
mRelLeft = relLeft;
mRelRight = relRight;
mStructure = new LinkedList<Header>();
this.copyStructure(mRelLeft.mStructure);
for (final Header header :mRelRight.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
}
En las líneas
this.copyStructure(mRelLeft.mStructure);
y
for (final Header header : mRelRight.mStructure) {
me sale el siguiente error:
The field Relation.mStructure is not visible
Si pongo ambas clases en el mismo paquete, esto funciona perfectamente. ¿Alguien puede explicar este problema?
¿Será una solución adecuada definir un descriptor de acceso protegido? –
Lo mismo sucedería. Más interesante sería saber si 'Join' IS-A' Relation' y si es así, ¿por qué deberían ir en diferentes paquetes? Probablemente, usar un objeto intermedio para abstraer la estructura y lo haría. Le sugiero que los mueva en el mismo paquete por el momento, solo para evitar entrar en una parálisis de codificación. – OscarRyz
Creo que su primera frase sería un poco más precisa si dice que dentro de la clase hija puede acceder a ese miembro en cualquier instancia de la clase secundaria, * o cualquier instancia de una clase que hereda de la clase secundaria *, pero no cualquier instancia de una clase de la cual la clase hija hereda. (Consulte la sección 6.6.2.1 de la especificación: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2). Por lo tanto, puede verlo en miembros derivados del árbol de herencia, pero no en miembros menos derivados. –