2010-11-10 7 views
1
package portale.interfaccia; 
public class PageIndex extends FlowPanel { 
    protected Integer prova; 

    private PageCenter center; 
    public PageIndex() { 
     this.center=new PageCenter(); 
     this.add(center);  
    } 
} 

package portale.interfaccia; 
public class PageCenter extends FlowPanel { 
    public PageCenter() { 
     super.prova=2; 
    } 
} 

pourquoi, si prova est protégé, je ne peux pas y accéder en utilisant super? BravoJava - Pourquoi protégé ne fonctionne pas sur cette fonction

Répondre

3

PageCenter s'étend de FlowPanel, pas de PageIndex. Il semble que FlowPanel n'a pas d'attribut nommé prova

Si vous voulez PageCenter d'accéder à un attribut protégé de PageIndex en utilisant le mot-clé super, alors vous devriez prolonger de PageIndex.

public class PageCenter extends PageIndex{ 

    public PageCenter(){ 
     prova = 2; 
    } 
} 

Si vous voulez que les deux classes vont de FlowPanel, essayez refactorisation votre code afin que PageIndex et PageCenter connaissent une certaine classe utilitaire.

public class ProvaUtility{ 

    private Integer prova; 

    public Integer getProva(){} 

    public void setProva(Integer p){} 
} 

Ensuite, vous pouvez l'utiliser comme ceci:

public class PageIndex extends FlowPanel{ 

    private ProvaUtility utility; 

    private PageCenter center; 

    public PageIndex(ProvaUtility pu){ 

     this.utility = pu; 
     this.center = new PageCenter(pu); 
     this.add(this.center); 
    } 

    public Integer getProva(){ 
     return this.utility.getProva(); 
    } 
} 

public class PageCenter extends FlowPanel{ 

    private ProvaUtility utility; 

    public PageCenter(ProvaUtility u){ 
     this.utility = u; 
     this.utility.setProva(2); 
    } 
} 

Si cette référence passe autour ne fait pas pour vous, essayez d'utiliser un Singleton

class ProvaSingleton{ 

    private static ProvaSingleton instance = null; 

    private Integer prova; 

    private ProvaSingleton(){ 
     prova = 2; 
    } 

    public static ProvaSingleton getInstance(){ 

     if (instance == null){ 
      instance = new ProvaSingleton(); 
     } 
     return instance; 
    } 

    public Integer getProva(){ return this.prova;} 

    public void setProva(Integer p){this.prova = p;} 
} 

Ensuite, appelez par :

ProvaInstance.getInstance().getProva()

+0

uhm..mais l'attribut protected devrait montrer chaque variable dans le même paquet non? – markzzz

+1

même paquet, tant que c'est une extension du même objet. PageCenter n'a absolument rien à voir avec PageIndex. –

+0

ouais, votre solution fonctionne !!! Le seul problème est que je dois passer à chaque fois la référence, et j'ai beaucoup d'extension. Merci l'homme :) – markzzz

1

super dans votre classe PageCenter fait référence à FlowPanel parce que c'est ce qu'il étend.

PageCenter n'a aucun moyen de savoir qu'il est membre de PageIndex sans référence à cet objet. Je crois que vous confondez les variables d'héritage et d'instance.

protected permettra l'accès par la classe en cours et toute classe qui en hérite. Il n'autorise pas les autres classes du même package à y accéder.

+0

Arghhh ... c'est vrai, super se référer à FlowPanel comme superclasse. Uhm ...! Alors, comment puis-je partager cette variable pour l'ensemble du paquet? – markzzz

+0

Si vous souhaitez qu'une variable soit partagée entre les classes, vous devez soit injecter un objet le contenant dans tous les objets qui veulent le partager, soit créer une variable statique avec une protection par défaut et y accéder. (Rappelez-vous - Avec la statique, méfiez-vous des threads) – Knubo

+0

Uhm je n'ai pas de problème avec la concurrence. Comment puis-je accéder à une variable statique? – markzzz

0

Vous devez faire en sorte que PageCenter étende PageIndex.

Questions connexes