2012-03-03 11 views
7

Digamos que hay la siguiente clase base:¿Por qué no puedo llamar a un método protegido de una clase heredada en otro paquete en Java?

package bg.svetlin.ui.controls; 

public abstract class Control { 
    protected int getHeight() { 
     //.. 
    } 
    //... 
} 

También, en el mismo paquete, hay una clase que hereda:

package bg.svetlin.ui.controls; 

public abstract class LayoutControl extends Control { 
    public abstract void addControl(Control control); 
    //... 
} 

Entonces, hay una tercera clase en otro paquete:

package bg.svetlin.ui.controls.screen; 

public abstract class Screen extends LayoutControl { 
    //... 
} 

Y, finalmente, está la clase de implementación, nuevamente en un paquete diferente:

package bg.svetlin.ui.controls.screen.list;  

public class List extends Screen { 

    private final Vector controls = new Vector(); 

    public void addControl(Control control) { 
     height += control.getHeight(); 
     controls.addElement(control); 
    } 
} 

A pesar de que List hereda de Control, y el getHeight() es protected, está el siguiente error:

getHeight() has protected access in bg.svetlin.ui.controls.Control

He comprobado que mis importaciones son correctas. Estoy usando NetBeans.

¿Alguna idea de qué pasa? Pensé que los campos y métodos protected son visibles para los niños, incluso si estos últimos están en un paquete diferente.

Gracias!

+1

En su clase abstracta es el método 'getWidth()', en la subclase que estés usando 'getHeight()'. ¿Esto es solo porque es un código de ejemplo? – Ash

+0

Sí. Gracias por descubrir esto. –

Respuesta

17

I thought protected fields and methods are visible to the children even if the latter are in a different package.

Correcto. La clase en sí tiene acceso a los miembros protegidos heredados. Pero, lo que está tratando de hacer para llamar al método getHeight en , algunos Referencia de control. ¡Puede llamarlo solo al esta instancia de!

Para una mejor comprensión, permítanme citar Kathy Sierra de SCJP Preparation Guide:

But what does it mean for a subclass-outside-the-package to have access to a superclass (parent) member? It means the subclass inherits the member. It does not, however, mean the subclass-outside-the-package can access the member using a reference to an instance of the superclass. In other words, protected = inheritance. The subclass can see the protected member only through inheritance.

+0

¿Cómo podría hacer que un método esté disponible solo para una clase y sus subclases, entonces? ¡Gracias! –

+0

Como dije, ** está ** disponible para su subclase. Pero solo permitiste invocar ** esta ** referencia, como 'this.getHeight()' (* this * es opcional, por supuesto). Sin embargo, es una práctica común hacer un método de acceso ** público **. – jFrenetic

+0

Las dimensiones y las posiciones se guardarían automáticamente en mi biblioteca, por lo que quería dejarlas en privado a la biblioteca. Parece que tendré que hacerlos públicos entonces. ¡Gracias! –

1

Tienes razón. Se puede acceder a cualquier miembro protected o method desde la clase secundaria, pero se desea acceder al método protegido de una instancia de parámetro en el método addControl. Se puede acceder solamente a protected método de List clase (this.getHeight())

Cuestiones relacionadas