Warum kann ich nicht Zugriff geschützt Java-Methode selbst dachte, dass ich die Klasse erweitert haben?
-
06-07-2019 - |
Frage
Hier ist die Dokumentation für die geschützte Methode:
/** Converts jmusic score data into a MIDI Sequence */
protected javax.sound.midi.Sequence scoreToSeq(Score score)
Und ich habe diese kleine Klasse, um die Klasse zu erweitern, die scoreToSeq Methode kommt aus:
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;
}
}
Lösung
(EDIT: theycallmemorty Antwort zur Vermeidung dieses Problems in Ihrem Fall der praktischen Ratschläge gibt. gibt diese Antwort die Gründe dafür, warum Sie diesen Rat folgen, das heißt, warum die Sprache auf diese Weise entwickelt wurde.)
Sie nur ein geschütztes Mitglied eines anderen Objekts zugreifen kann, die von der gleichen Art wie der zugreifenden Code (oder eine Unterklasse.) - auch wenn das Element erklärt in einem Supertyp
Von der Java Language Specification, Abschnitt 6.6.2 :
Es sei C die Klasse, in der ein geschützt Mitglied m deklariert. Zugriff nur innerhalb des Körpers eines zulässigen wird Unterklasse S von C. Darüber hinaus, wenn Id bezeichnet ein Instanzenfeld oder Instanz Verfahren, dann:
- Wenn der Zugriff durch einen qualifizierten Namen Q.Id ist, wobei Q ein ExpressionName ist, dann wird der Zugriff erlaubt, wenn und nur, wenn der Typ des Ausdrucks Q S ist oder eine Unterklasse von S.
- Wenn der Zugriff durch einen Feldzugriffsausdruck E.Id, wobei E einen primären Expression oder durch einen Methodenaufruf E.Id Ausdruck (...), Wobei E a ist Primärer Ausdruck, dann ist der Zugriff zulässig, wenn und nur wenn die Art der E S ist oder eine Unterklasse von S.
Dies ist eine Art zu den Mitglieder erlauben, die in ihren eigenen Vererbungsbaum zugreifen zu können, ohne Verkapselung von anderen Klassen zu besiegen. Angenommen, wir haben:
A
/ \
B Other
/
C
und A erklärte ein geschütztes Mitglied x
. Ohne die Regel arbeitet, wie es funktioniert, könnte man rund Verkapselung erhalten, indem ein Element in Other
setzen:
public int getX(A a)
{
return a.x;
}
und nur fordern, dass in einer Instanz von B
oder C
vorbei - das Mitglied wirksam öffentlich werden würde, weil man immer um es funktionieren könnte durch eine andere Klasse Einführung ... keine gute Idee. Mit der aktuellen Regel müßten Sie B
oder C
Unterklasse -., Die Sie nicht in der Lage sein können, um in erster Linie
Andere Tipps
Auf diese Weise:
MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score);
Sie sind nicht wirklich Vorteil der Tatsache, dass Sie die MidiSynth Klasse erweitert haben.
Wenn Sie sind versuchen
this.scoreToSec(score);
Dann werden Sie feststellen, haben Sie Zugriff auf die geschützte Funktion haben.