2012-03-03 12 views
7

Say nie dodaje klasy bazowej:Dlaczego nie można wywołać metody chronionej z klasy dziedziczącej w innym pakiecie w języku Java?

package bg.svetlin.ui.controls; 

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

Ponadto, w tym samym opakowaniu, jest to klasa, która dziedziczy:

package bg.svetlin.ui.controls; 

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

Następnie, nie ma trzeciej klasy w innym opakowaniu:

package bg.svetlin.ui.controls.screen; 

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

I wreszcie jest klasa implementacji, również w innym pakiecie:

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); 
    } 
} 

chociaż List dziedziczy z Control, a getHeight() jest protected, jest następujący błąd:

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

Sprawdziłem, że moi import rację. Używam NetBeans.

Każdy pomysł, co jest nie tak? Myślałem, że pola i metody są widoczne dla dzieci, nawet jeśli te ostatnie znajdują się w innym pakiecie.

Dzięki!

+1

W swojej klasy abstrakcyjnej metoda jest 'getWidth()', w podklasie używasz 'getHeight()'. Czy to dlatego, że jest to przykładowy kod? – Ash

+0

Tak. Dzięki, że to zauważyłeś. –

Odpowiedz

17

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

Zgadza się. Sama klasa ma dostęp do odziedziczonych chronionych członków. Ale, co próbujesz zrobić, aby zadzwonić do metody getHeight na niektóre odniesienia. Możesz go wywołać tylko na instancji z tego!

Dla lepszego zrozumienia, zacytuję Kathy Sierra na 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

Jak mogę udostępnić metodę tylko klasie i jej podklasom? Dzięki! –

+0

Tak jak powiedziałem, ** jest ** dostępne dla twojej podklasy. Ale możesz tylko wywołać to na ** this ** reference, na przykład 'this.getHeight()' (* to * jest opcjonalne oczywiście). Jednak powszechną praktyką jest uczynienie metody dostępowej ** publicznym **. – jFrenetic

+0

Wymiary i pozycje będą automatycznie przechowywane przez moją bibliotekę, więc chciałem pozostawić je w bibliotece prywatnie. Wygląda na to, że będę musiał je upublicznić. Dzięki! –

1

Masz rację. Dowolny element protected lub method dostępny z klasy potomnej, ale użytkownik chce uzyskać dostęp do chronionej metody instancji parametru w metodzie addControl. można uzyskać dostęp tylko do protected metody List klasy (this.getHeight())

Powiązane problemy