Puis-je faire un membre protégé du public en Java? Je veux y accéder à partir d'une sous-classe

StackOverflow https://stackoverflow.com/questions/2198629

  •  25-09-2019
  •  | 
  •  

Question

Je suis nouveau à Java et POO,

J'utilisais une sous-classe privée (en fait une struct) B dans une classe A, et tout est bien passé jusqu'à ce que je décide de faire une classe parente C pour sous-classe B. Je veux rendre publics certains des membres protégés de la classe C.

Par exemple:

public class A {
   private class B extends C {
       public int product;
       public int x;
       public int y;
       public void add() {
             product=x+y;
       }
   }
   B b=new B;
   b.x=1;
   b.y=2;
   b.multiply();
   System.out.println(b.product+"="+b.x+"x"+b.y);

public class C {
   protected int x;
   protected int y;
   public int sum;
   public C(px,py) {
       x=px;
       y=py;
   }
   public void sum() {
       sum=x+y;
   }
}

Et je reçois

  

constructeur super C Implicite () est définie pour le constructeur par défaut.      Doit définir un constructeur explicite

Bien sûr, je pourrais enlever C étend, et revenir à ce que j'avais avant. Ou je pouvais faire un getter / setter. Mais je pense qu'il est compréhensible qu'un struct intérieur est acceptable, et il devrait être en mesure d'étendre d'autres classes.

Était-ce utile?

La solution

Le message du compilateur est assez clair - en B que vous avez efficacement got:

public B() {
    super();
}

et cela échoue parce qu'il n'y a pas de constructeur de C en parameterless appeler. Soit introduire un constructeur sans paramètre, ou fournir un constructeur explicite dans B, qui appelle le constructeur en C avec les arguments appropriés.

Je ne suis pas sûr que c'est une bonne idée d'avoir tous ces domaines non-privé, l'esprit vous - ni une bonne idée pour les champs B à cacher champs C. Avez-vous vraiment veulent une instance de B d'avoir deux champs x et deux champs de y? Vous vous rendez compte qu'ils seront des champs distincts, ne vous?

Si vous voulez juste de fournir efficacement l'accès du public, vous pourriez avoir:

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

(et même pour y) et de supprimer les champs supplémentaires de B. Vous ne pouvez pas modifier l'accessibilité réelle des champs en C cependant.

Autres conseils

D'accord, je fuddling avec mon propre code et trouvé que le problème est que je besoin d'un constructeur par défaut protégé pour superclasse C. Il travaille maintenant ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top