Puis-je faire un membre protégé du public en Java? Je veux y accéder à partir d'une sous-classe
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.
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 ...