Appel de méthode protégée à partir d'une sous-classe d'une autre instance de différents forfaits
Je veux appeler une méthode protégée d'une autre instance de l'intérieur d'une sous-classe de la classe cette méthode protégée. Voir l'exemple suivant:
public class Nano {
protected void computeSize() {
}
}
public class NanoContainer extends Nano {
protected ArrayList<Nano> children;
}
public class SomeOtherNode extends NanoContainer {
//{Nano} Overrides
protected void computeSize() {
for (Nano child: children) {
child.computeSize(); //<< computeSize() has protected access in nanolay.Nano
}
}
}
javac
me dit que computeSize() has protected access in Nano
. Je ne vois pas la raison à cela (je pensais que je faisais déjà présent dans d'autres codes). J'aimerais garder cette méthode de protection, que puis-je faire?
javac version "1.7.0_09"
Modifier
J'ai voulu donner une version allégée, mais je ne pense pas que le fait que les classes se trouvent dans différents paquets.
nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
Vous pouvez également afficher les paquets, les classes sont dans?
Ahh, les paquets.. ne pense pas à ce sujet. J'ai voulu donner une version allégée du code. J'ai édité la question.
Pouvez vous s'il vous plaît ajouter le package de qualification à la question titre, puisque cela semble être pertinente?
Ce correct? J'ai aussi remplacé la
Oui, c'est bon. BTW la accepté de répondre à des besoins de certaines corrections.
Ahh, les paquets.. ne pense pas à ce sujet. J'ai voulu donner une version allégée du code. J'ai édité la question.
Pouvez vous s'il vous plaît ajouter le package de qualification à la question titre, puisque cela semble être pertinente?
Ce correct? J'ai aussi remplacé la
instance-methods
avec le packages
tag.Oui, c'est bon. BTW la accepté de répondre à des besoins de certaines corrections.
OriginalL'auteur Niklas R | 2013-01-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez accéder à la protégée des méthodes, soit par sous-classement et dominante; mais aussi quand ils sont disponibles dans le même package. Je vais ajouter quelques détails.
Vous pouvez lire détails ici.
L'exemple que vous avez est sur les lignes de la
protected clone()
méthode de la classe Object en java; vous ne pouvez pas appeler directement sur n'importe quel objet (bien que tous les objets implicitement étendre à partir de la classe de l'Objet).Une instance de someothernode objet a accès à l'protégé computeSize méthode, mais pas d'une autre instance de someothernode donc pas dans la boucle for.
qui semble incorrect. Cette compile sans erreur si ils sont tous dans le même paquet.
clone
ne peut pas être appelé ainsi parce qu'il estprotected
dansObject
, qui est dans le paquetjava.lang
et cette classe n'est pas dans le paquet.Oui, il faudrait compiler correctement si toutes les classes sont dans le même package. Le clone exemple illustre une méthode protégée dans un autre package ne peut pas être invoquée; ainsi, vous créez une classe d'employés en dehors de java.lang, de sorte que la méthode clone sur cette classe d'employés objet ne peut pas être invoquée à moins qu'il expose par public modificateur
OriginalL'auteur Scorpion
Ne sais pas la justification, mais JLS confirme ce dans 6.6.2. Détails sur l'Accès protégé (l'emphase est mienne):
Donc:
Dans
P2A.bar
un appel àthis.foo()
est accessible, carthis
est responsable de la mise en œuvre deP2
maisother.foo()
est pas accessible en raisonother
ne peut pas être unP2A
.bar2
sur l'autre main a uneP2A
c'est tout bon.Maintenant, pourquoi tout est OK si ils sont tous le même paquet, mais s'ils sont différents forfaits? Quelle est la logique? Je ne sais pas et je voudrais savoir.
Méta-Commentaire j'ai roulé une récente mise à jour par un autre utilisateur en tant qu'il modifie sensiblement la réponse est probablement plus approprié qu'un haut niveau de réponse elle-même.
Peut-être vous pouvez poser une autre question au sujet de la justification> Il peut ne pas être adapté à ce forum, mais les programmeurs aime ces types de questions
pourquoi les autres doit être
P2A
n'est-il pas assez pour qu'il soitP2.P2
pour accéder àfoo();
depuis foo est déclarée dans P2.P2. veuillez préciser"pour accéder aux membres protégés protégés ou de méthodes à partir de l'extérieur de la même package, vous ne pouvez pas utiliser la classe parent de l'objet, seule la mise en œuvre de la classe de l'objet peut être utilisé pour accéder aux membres protégés de la classe parente en dehors même package"
OriginalL'auteur Miserable Variable