2015-07-07 8 views
5

Also, wir habenKann nicht geschützte Methode von Kind Klasse zugreifen

public abstract class A{ 
    protected abstract String f(); 
} 

public class B extends A{ 
    protected String f(){...} 
} 

public class C extends A{ 
    protected String f(){ 
     A b = (A) Class.forName("B", true, getClass().getClassLoader()).newInstance(); 
     return b.f(); 
} 

Das bin ich nicht zulässt, dass b.f() zuzugreifen und sagte, dass B.f() im geschützten Bereich ist, wurde jedoch f durch A geschützt, und da C erweitert A, sollte es auch Zugriff auf f() bekommen.

+0

Warum nicht neue Instanz erstellen wie: A b = (A) neue B(); ? – Dmitry

+0

B ist nur zur Laufzeit verfügbar. Wenn Sie wirklich wissen wollen, B ist 'com.android.okhttp.HttpsHandler' und A ist' URLStreamHandler' –

+0

Sie können Ihren Fall durch Reflexion lösen, aber es wäre hilfreicher, wenn Sie Ihr * ursprüngliches * Problem bekanntgegeben hätten. Welche Methode von 'HttpsHandler' versuchen Sie anzurufen und warum brauchen Sie sie? Siehe [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Erwäge, eine neue Frage mit deinem ursprünglichen Problem zu öffnen. –

Antwort

2

Der geschützte Modifizierer gibt an, dass auf das Element nur innerhalb seines eigenen Pakets (wie bei Paket-privat) und zusätzlich durch eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann.

Wenn Sie die B.f() zugreifen wollen, sollten Sie die C-Klasse im selben Paket wie B. definiert haben

+0

aber diese Ebene der Zugänglichkeit kann erreicht werden, indem keine Modifikatoren verwendet werden (bekannt als "Paket privat"). Wenn eine Unterklasse, die auf geschützte Methoden zugreift, im selben Paket enthalten sein muss, bedeutet dies, dass Paket private und geschützte Modifizierer dasselbe tun? Ich denke, Unterklasse, die auf geschützte Methoden zugreifen kann in jedem Paket sein. Korrigiere mich, wenn ich nicht richtig liege. – Dmitry

+0

Sie haben Recht. Die Antwort versuchen das Problem zu lösen, wie es in der Frage steht. –

+1

Jetzt sehe ich. Aber Variable b ist vom Typ A, und Instanz von B() wird an A gegossen. Dieser Moment ist interessant, warum der Zugriff illegal ist – Dmitry

0

Nein, weil der Compiler nicht weiß, ob b eine Instanz von B, C oder anderen externen Klassen ist.

Angenommen, es gibt eine Klasse so dass D extends A in einem anderen Paket. Wenn b eine Instanz von ist (der Compiler weiß es nicht), sollte b.f() verboten sein, wenn der Zugriff protected ist (auf Klassen in anderen Paketen kann nicht zugegriffen werden).

+0

Solange b ein A ist, und A hat 'f', was ist es wichtig? –

+0

@ doom777 Angenommen, jetzt ist "b" ein "D", wobei "D erweitert A" ist und in einem anderen Paket mit einer 'protected'' f() 'Methode definiert ist. Betrachtet man "D", ist "A" in "ein anderes Paket", so dass "A" nicht auf "geschützte" Methoden in "D" zugreifen kann. Die Kompilierung weiß jedoch nicht, ob "b" ein "B", "C" oder "D" ist, also muss "b.f()" verboten sein (falls "b" eine Instanz von "D" ist). – tony200910041

+0

Ich würde denken, dass, weil 'f' ursprünglich in' A' definiert wurde, es immer als ein Kind von 'A' oder freier bleiben sollte, und für alle' A's und seine Unterklassen verfügbar sein sollte –

Verwandte Themen