Warum kann ich nicht Zugriff geschützt Java-Methode selbst dachte, dass ich die Klasse erweitert haben?

StackOverflow https://stackoverflow.com/questions/1622219

  •  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;

    }
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top