pourquoi ne puis-je pas accès protégé java de la méthode même de la pensée, je l'ai étendu la classe?
Voici la documentation de la méthode protégée:
/** Converts jmusic score data into a MIDI Sequence */
protected javax.sound.midi.Sequence scoreToSeq(Score score)
Et j'ai fait cette petite classe pour étendre la classe que scoreToSeq méthode vient de:
public class MidiSequence extends MidiSynth{
public Sequence getSequence(Score score){
MidiSynth synth = new MidiSynth();
Sequence sequence = null;
try
{
//Here I get the error saying that the method has
//protected access in MidiSynth
sequence = synth.scoreToSeq(score);
}
catch (InvalidMidiDataException e)
{
/*
* In case of an exception, we dump the exception
* including the stack trace to the console.
* Then, we exit the program.
*/
e.printStackTrace();
System.exit(1);
}
return sequence;
}
}
De Najib Tounsi (pas assez de rep pour le commentaire) : Même si,
synth.scoreToSeq(score);
devrait être légal.OriginalL'auteur Matt | 2009-10-25
Vous devez vous connecter pour publier un commentaire.
(EDIT: theycallmemorty réponse donne des conseils pratiques pour éviter ce problème dans votre cas. Cette réponse donne les raisons pour lesquelles vous devez suivre les conseils, c'est à dire pourquoi le langage a été conçu de cette façon.)
Vous ne pouvez accéder à un membre protégé d'un autre objet qui est du même type que l'accès à code (ou une sous-classe) - même si le membre est déclaré dans un supertype.
De la Java Langage de Spécification, la section 6.6.2:
C'est pour permettre à un type d'accéder aux membres pertinents à son propre arbre d'héritage, sans vaincre l'encapsulation des autres classes. Par exemple, supposons que nous avons:
et A déclaré un membre protégé
x
. Sans la règle fonctionne de cette façon, vous pourriez aller faire un tour encapsulation par mettre un membre dansOther
:et appeler juste que le passage en une instance de
B
ouC
- le membre serait effectivement devenu public, parce que vous pouvez toujours le contourner par l'introduction d'une autre classe... pas une bonne idée. Avec la règle actuelle, vous auriez à la sous-classeB
ouC
- qui vous ne pouvez pas être en mesure de, en premier lieu.Qu'entendez-vous par "parce que vous pouvez toujours le contourner par l'introduction d'une autre classe" dans la deuxième ligne?
Quelqu'un pourrait il suffit de créer une autre classe qui s'étend
A
et offre l'accès à une instance de sous-classe deA
.J'ai demandé à un question connexe ici. Pouvez-vous veuillez donner une réponse?
Je pense que le dernier exemple devrait être:
public static void getX(A a) {return a.x;}
OriginalL'auteur Jon Skeet
En faisant ceci:
Vous n'êtes pas réellement en tirant parti du fait que vous avez prolongé la MidiSynth classe.
Si vous essayez
Alors vous trouverez que vous avez accès à la fonction protégée.
OriginalL'auteur theycallmemorty