2015-07-07 25 views
5

Così, abbiamoImpossibile accedere metodo protetto dalla classe figlia

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

Questo non mi permette di accedere b.f(), dicendo che B.f() è nel campo di applicazione protetta, tuttavia f era protetto da A, e poiché C estende A, dovrebbe anche ottenere l'accesso a f().

+0

perché non creare nuova istanza come: A = B (A) nuova B(); ? – Dmitry

+0

B è disponibile solo in fase di esecuzione. Se vuoi davvero sapere, B è 'com.android.okhttp.HttpsHandler', e A è' URLStreamHandler' –

+0

Puoi risolvere il tuo caso tramite riflessione, ma sarebbe più utile se hai postato il tuo problema * originale *. Quale metodo di 'HttpsHandler' stai cercando di chiamare e perché ne hai bisogno. Vedi il [problema XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Prendi in considerazione l'idea di aprire una nuova domanda con il tuo problema originale. –

risposta

2

Il modificatore protetto specifica che è possibile accedere al membro solo all'interno del proprio pacchetto (come con package-private) e, inoltre, da una sottoclasse della relativa classe in un altro pacchetto.

Se si desidera accedere alla B.f(), si dovrebbe avere la classe C definito nello stesso pacchetto come B.

+0

ma questo livello di accessibilità può essere ottenuto utilizzando nessun modificatore (noto come "pacchetto privato"). Se una sottoclasse che accede ai metodi protetti deve nello stesso pacchetto significa che il pacchetto di modificatori privati ​​e protetti fa lo stesso? Penso che la sottoclasse che accede ai metodi protetti possa essere in qualsiasi pacchetto. Correggimi se non ho ragione – Dmitry

+0

Sei corretto. La risposta tenta di risolvere il problema come indicato nella domanda. –

+1

Ora capisco. Ma la variabile b è di tipo A, e l'istanza di B() è castata in A. Questo momento è interessante perché l'accesso è illegale – Dmitry

0

No perché il compilatore non sa se b è un'istanza di B, C o altre classi esterne.

Supponiamo che esista una classe D tale che D extends A in un altro pacchetto. Se è un'istanza di D (il compilatore non lo sa) b.f() dovrebbe essere vietato se l'accesso è protected (non è possibile accedere alle classi in altri pacchetti).

+0

finché b è un A e A ha 'f', che importa? –

+0

@ doom777 supponiamo che 'b' sia un' D', dove 'D estende A' ed è definito in un altro pacchetto con un metodo' protected' 'f()'. Considerando 'D',' A' è in "un altro pacchetto", quindi 'A' non può accedere ai metodi' protected' in 'D'. Comunque la compilazione non sa se 'b' è un' B', 'C' o' D', quindi 'b.f()' deve essere vietato (nel caso in cui 'b' sia un'istanza di' D'). – tony200910041

+0

Penso che poiché 'f' è stato definito originariamente in' A', dovrebbe sempre rimanere come un figlio di 'A' o più libero, e disponibile per tutti' A's e le sue sottoclassi –

Problemi correlati