Perché la mia sottoclass non può accedere a una variabile protetta della sua superclass, quando si trova in un pacchetto diverso?

Ho una class astratta, relation nel pacchetto database.relation e una sottoclass di essa, Join , nel pacchetto database.operations . relation ha un membro protetto chiamato mStructure .

In Join :

 public Join(final Relation relLeft, final Relation relRight) { super(); mRelLeft = relLeft; mRelRight = relRight; mStructure = new LinkedList
(); this.copyStructure(mRelLeft.mStructure); for (final Header header :mRelRight.mStructure) { if (!mStructure.contains(header)) { mStructure.add(header); } } }

Sulle linee

 this.copyStructure(mRelLeft.mStructure); 

e

 for (final Header header : mRelRight.mStructure) { 

Ottengo il seguente errore:

    Il campo Relation.mStructure non è visibile

    Se metto entrambe le classi nello stesso pacchetto, questo funziona perfettamente. Qualcuno può spiegare questo problema?

    Funziona, ma solo tu i bambini cercano di accedere alla propria variabile, non variabile di altra istanza (anche se appartiene allo stesso albero di ereditarietà).

    Guarda questo esempio di codice per capirlo meglio:

     //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 } } 

    Se proviamo a compilare usando withParent.parentVariable abbiamo:

     Children.java:8: parentVariable has protected access in parentpackage.Parent System.out.print(withParent.parentVariable); 

    È accessibile, ma solo alla sua variabile.

    Un avvertimento poco noto sulla protezione :

    6.6.2 Dettagli sull’accesso protetto

    È ansible accedere a un membro o costruttore protetto di un object dall’esterno del pacchetto in cui è dichiarato solo dal codice responsabile dell’implementazione di tale object.

    Se protected , l’istanza di Join non può accedere a mStructure in altre istanze ( relRight , relLeft ) all’esterno del pacchetto.

    MODIFICARE:

    La tabella qui spiega questa situazione abbastanza bene. Ho contrassegnato il colpevole nella tua domanda con [] s

     Access Levels Modifier Class Package Subclass World public YYYY protected Y [Y] YN no modifier YYNN private YNNN 

    Il problema è che stai accedendo ad altri membri protetti da istanze.

    È ansible applicare più soluzioni, ad esempio se ansible è ansible dichiarare nella class padre questi due metodi:

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

    E poi nel codice childs sostituire:

     this.copyStructure(mRelLeft.mStructure); for (final Header header :mRelRight.mStructure) { if (!mStructure.contains(header)) { mStructure.add(header); } } 

    Con:

     this.copyRelationStructure(mRelLeft); this.mergeRelationStructure(mRelRight); 

    Questo dovrebbe funzionare Ora Relation ha la responsabilità di fornire metodi che consentano le operazioni con sé stesso ai suoi figli. Probabilmente la ragione di questa politica è che i bambini non dovrebbero scherzare con gli interni dei genitori a meno che non facciano parte dello stesso pacchetto software per limitare le incompatibilità.