2010-12-13 9 views
0

J'ai une classe CircularBuffer qui étend AbstractList.Java: Accès aux membres protégés hérités d'une classe interne

J'ai une deuxième classe ExponentialUnrolledLinkedList qui a un nœud de classe interne qui étend CircularBuffer.

Je peux accéder à certains membres protégés de Noeud dans ExponentialUnrolledLinkedList (en dehors du Noeud), même s'ils sont déclarés en dehors du Noeud (par exemple, le champ de taille protégé déclaré dans CircularBuffer), mais pas le champ protégé modCount déclaré dans AbstractList.

Je peux accéder à modCount à partir de la définition de classe interne elle-même, mais pas de la classe englobante.

Par exemple

public class ExponentialUnrolledLinkedList<E> extends AbstractSequentialList<E> { 
    ... 
    private Node last = new Node(1){ 
      protected int firstIndex(){ 
       return 0; 
      } 
    }; 

    private class Node extends CircularBuffer<E> { 
      ... 
      private void dirty(){ 
       this.modCount++; // works 
      } 
      protected int firstIndex(){ 
       return store.length; 
      } 
    } 

    public int size(){ 
      return last.firstIndex() + last.size; // access to last.size works 
    } 

    public boolean add(E item){ 
      ... 
      last.modCount++; // can't access modCount, have to call last.dirty() 
      ... 
      return true; 
    } 
} 

Pourquoi puis-je accéder à la taille à la fois la classe interne et la classe outter, mais je ne peux accéder modCount dans la classe interne? J'étais sous l'impression (évidemment fausse) que les classes de l'extérieur ont accès à tout ce à quoi leurs classes internes ont accès. Il est clair que certains membres protégés sont accessibles aux deux mais certains ne le sont pas. J'ai une solution de contournement en enveloppant l'incrément modCount dans une méthode (privée) et en appelant cette méthode, mais cela semble inélégant.

Répondre

0

Quelle est la visibilité de CircularBuffer.size? (Ce n'est pas un membre de AbstractList ou de ses super classes).

Vous ne pouvez pas accéder à CircularBuffer.modCount car sa visibilité est "protégée" dans la classe AbstractList. Cela signifie que le membre ne peut être accédé que dans son propre paquet et par une sous-classe de sa classe dans un autre paquet (tel que CircularBuffer).

+0

CircularBuffer.size est protégé et déclaré dans CircularBuffer. Vous mentionnez que protect implique également un accès au niveau du package (par défaut). Je n'étais pas au courant. Cela expliquerait pourquoi je peux accéder à CircularBuffer.size dans ExponentialUnrolledLinkedList. ce n'est pas parce que j'ai une classe interne dérivée de CircularBuffer, c'est parce que CircularBuffer et ExponentialUnrolledLinkedList se trouvent dans le même paquet. Je suppose que ce à quoi une classe externe peut accéder n'a rien à voir avec ce à quoi ses classes internes peuvent accéder. – Nick

Questions connexes