Warum kann ich nicht auf die geschützte Java-Methode zugreifen, obwohl ich die Klasse erweitert habe?

7

Hier ist die Dokumentation für die geschützte Methode:

%Vor%

Und ich habe diese kleine Klasse gemacht, um die Klasse zu erweitern, aus der die Methode scoreToSeq kommt:

%Vor%     
Matt 25.10.2009, 21:54
quelle

2 Antworten

16

(BEARBEITEN: theycallmemortys Antwort gibt den praktischen Rat zur Vermeidung dieses Problems in Ihrem Fall. Diese Antwort gibt die Gründe dafür, warum Sie diesem Rat folgen müssen, dh warum die Sprache so gestaltet wurde."

>

Sie können nur auf ein geschütztes Member eines anderen Objekts zugreifen, das denselben Typ wie der zugreifende Code (oder eine Unterklasse) hat - obwohl das Member in einem Supertyp deklariert ist.

Aus der Java-Sprachspezifikation, Abschnitt 6.6.2 :

  

Sei C die Klasse, in der a   Geschütztes Mitglied m ist deklariert. Zugriff   ist nur innerhalb des Körpers eines erlaubt   Unterklasse S von C. Zusätzlich, wenn Id   bezeichnet ein Instanzfeld oder eine Instanz   Methode, dann:

     
  • Wenn der Zugriff über einen qualifizierten Namen Q.Id erfolgt, wobei Q ein ExpressionName ist,   dann ist der Zugriff erlaubt, wenn und   nur wenn der Typ des Ausdrucks Q   ist S oder eine Unterklasse von S.
  •   
  • Wenn der Zugriff über einen Feldzugriffsausdruck E.Id erfolgt, wobei E eine Primärdatenbank ist   Ausdruck oder durch einen Methodenaufruf   Ausdruck E.Id (...), wobei E ein ist   Primärer Ausdruck, dann ist der Zugriff   nur dann erlaubt, wenn der Typ von E   ist S oder eine Unterklasse von S.
  •   

Dies ermöglicht es einem Typ, auf Member zuzugreifen, die für seinen eigenen Vererbungsbaum relevant sind, ohne die Kapselung anderer Klassen zu vereiteln. Angenommen, wir haben:

%Vor%

und A haben ein geschütztes Mitglied x deklariert. Wenn die Regel nicht so funktioniert, wie Sie es tun, können Sie die Kapselung umgehen, indem Sie ein Mitglied in Other :

einfügen %Vor%

und nur aufrufen, dass eine Instanz von B oder C weitergegeben wird - das Mitglied würde effektiv öffentlich werden, weil Sie es immer umgehen könnten, indem Sie eine andere Klasse einführen ... keine gute Idee. Mit der aktuellen Regel müssten Sie die Unterklasse B oder C - die Sie möglicherweise nicht in der Lage sind, ableiten.

    
Jon Skeet 25.10.2009, 21:57
quelle
12

Indem Sie dies tun:

%Vor%

Sie nutzen eigentlich nicht die Tatsache aus, dass Sie die MidiSynth-Klasse erweitert haben.

Wenn Sie es versuchen sollten

%Vor%

Dann werden Sie feststellen, dass Sie Zugriff auf die geschützte Funktion haben.

    
theycallmemorty 25.10.2009 21:58
quelle

Tags und Links