java - the - programacion android pdf 2018
¿Por qué mi subclase no puede acceder a una variable protegida de su superclase cuando está en un paquete diferente? (4)
El problema es que está accediendo a otro miembro protegido de la instancia.
Puede aplicar múltiples soluciones; por ejemplo, si es posible, puede declarar en la clase principal estos dos métodos:
protected void copyRelationStructure(Relation r) {
this.copyStructure(r.mStructure);
}
protected void mergeRelationStructure(Relation r) {
for (final Header header: r.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
}
Y luego en el código del niño reemplaza:
this.copyStructure(mRelLeft.mStructure);
for (final Header header :mRelRight.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
Con:
this.copyRelationStructure(mRelLeft);
this.mergeRelationStructure(mRelRight);
Eso debería funcionar. Ahora, la relación tiene la responsabilidad de proporcionar métodos que permitan operar consigo mismos a sus hijos. Probablemente la razón detrás de esta política es que los niños no deben meterse con las partes internas de los padres a menos que sean parte del mismo paquete de software con el fin de limitar las incompatibilidades.
Tengo una clase abstracta, relation
en package database.relation
y una subclase de ella, Join
, en package database.operations
. relation
tiene un miembro protegido llamado mStructure
.
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 líneas
this.copyStructure(mRelLeft.mStructure);
y
for (final Header header : mRelRight.mStructure) {
Obtuve el siguiente error:
El campo Relation.mStructure no está visible
Si pongo ambas clases en el mismo paquete, esto funciona perfectamente. ¿Alguien puede explicar este problema?
Funciona, pero solo usted los niños intentan acceder a su propia variable, no a la variable de otra instancia (incluso si pertenece al mismo árbol de herencia).
Vea este código de muestra para entenderlo mejor:
//in Parent.java
package parentpackage;
public class Parent {
protected String parentVariable = "whatever";// define protected variable
}
// in Children.java
package childenpackage;
import parentpackage.Parent;
class Children extends Parent {
Children(Parent withParent ){
System.out.println( this.parentVariable );// works well.
//System.out.print(withParent.parentVariable);// doesn''t work
}
}
Si tratamos de compilar usando el withParent.parentVariable
, tenemos:
Children.java:8: parentVariable has protected access in parentpackage.Parent
System.out.print(withParent.parentVariable);
Es accesible, pero solo a su propia variable.
Si está protected
, su instancia de mStructure
no puede acceder a mStructure
en otras instancias ( relRight
, relLeft
) fuera del paquete.
EDITAR:
La tabla here explica esta situación bastante bien. Marqué al culpable en su pregunta con []
s
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y [Y] Y N
no modifier Y Y N N
private Y N N N
Una advertencia poco conocida sobre protected :
6.6.2 Detalles sobre acceso protegido
Se puede acceder a un miembro o constructor protegido de un objeto desde fuera del paquete en el que se lo declara solo por código que es responsable de la implementación de ese objeto.