warum kann ich nicht den Zugriff auf geschützte java-Methode auch gedacht, ich habe erweitert die Klasse?
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)
Gemacht und ich dieses kleine Klasse, die Klasse zu erweitern, dass scoreToSeq-Methode stammt von:
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;
}
}
- Von Najib Tounsi (nicht genug rep Kommentar) : Auch wenn
synth.scoreToSeq(score);
sollte legal sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(EDIT: theycallmemorty Antwort gibt praktische Ratschläge zur Vermeidung dieses problem in Ihrem Fall. Diese Antwort gibt die Gründe, warum Sie haben zu Folgen, dass die Beratung, d.h. warum die Sprache, die entworfen wurde, Weg.)
Können Sie nur den Zugriff auf ein geschütztes Mitglied eines anderen Objekts, die von der gleichen Art wie der Zugriff auf code (oder einer Subklasse) - auch wenn das Mitglied erklärt in einem obertyp.
Aus der Java Language Specification, Abschnitt 6.6.2:
Dies ist zu erlauben, geben Sie für den Zugriff auf Mitglieder relevant für seine eigene Vererbung zu Baum, ohne zu besiegen Kapselung von anderen Klassen. Zum Beispiel, nehmen wir an, wir haben:
und Einer deklariert einen geschützten member
x
. Ohne die Regel so zu arbeiten, wie Sie es tut, könnte man umgehen Kapselung, indem Sie Mitglied inOther
:und nur den Aufruf, dass man in einer Instanz von
B
oderC
- Mitglied würde effektiv an die öffentlichkeit, da konnte man immer arbeiten, um es durch die Einführung einer anderen Klasse... keine gute Idee. Mit der aktuellen Regel, man müsste UnterklasseB
oderC
- die Sie möglicherweise nicht in der Lage sein in den ersten Platz.A
und bietet Zugang für eine Instanz von anderen Unterklasse vonA
.public static void getX(A a) {return a.x;}
Dadurch:
Sind Sie nicht tatsächlich nutzen die Tatsache, dass Sie ' ve erweitert die MidiSynth Klasse.
Wenn Sie versuchen,
Dann werden Sie finden, haben Sie Zugriff auf die geschützte Funktion.