보호 된 Java 방법에 액세스 할 수없는 이유는 내가 수업을 연장했다고 생각 했습니까?
-
06-07-2019 - |
문제
보호 된 방법에 대한 문서는 다음과 같습니다.
/** Converts jmusic score data into a MIDI Sequence */
protected javax.sound.midi.Sequence scoreToSeq(Score score)
그리고 나는이 작은 클래스를 만들어 scoretoSeq 방법이 다음과 같은 수업을 확장했습니다.
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;
}
}
해결책
(편집하다: 그들은 Callmemorty의 대답입니다 귀하의 경우이 문제를 피하기위한 실질적인 조언을 제공합니다. 이 답변은 그 조언을 따라야하는 이유, 즉 언어가 그런 식으로 설계된 이유를 제시합니다.)
멤버가 있는데도 액세스 코드 (또는 서브 클래스)와 동일한 유형의 다른 객체의 보호 된 멤버 만 액세스 할 수 있습니다. 선언 슈퍼 형에서.
로부터 Java 언어 사양, 섹션 6.6.2:
C를 보호 된 멤버 M이 선언 한 클래스라고하자. 액세스는 C의 서브 클래스의 본문 내에서만 허용됩니다. 또한 ID가 인스턴스 필드 또는 인스턴스 메소드를 나타내는 경우 :
- 액세스가 자격을 갖춘 이름 Q.Id에 의한 경우 Q는 표현식 이름 인 경우, 표현식 Q의 유형이 S 또는 서브 클래스 인 경우에만 액세스가 허용됩니다.
- 액세스가 필드 액세스 표현식 E.ID에 의한 경우, 여기서 e는 1 차 표현식 인 경우, 또는 메소드 호출 표현식 E.ID (...)에 의해 E가 1 차 표현 인 경우 액세스는 허용되면 허용됩니다. E의 유형이 S 또는 서브 클래스 인 경우
이는 유형이 다른 클래스의 캡슐화를 물리 치지 않고 자체 상속 트리와 관련된 멤버에 액세스 할 수 있도록하는 것입니다. 예를 들어, 우리가 가지고 있다고 가정합니다.
A
/ \
B Other
/
C
그리고 보호 된 회원을 선언했습니다 x
. 규칙이 작동하지 않으면 회원을 넣어 캡슐화를 얻을 수 있습니다. Other
:
public int getX(A a)
{
return a.x;
}
그리고 그것을 인스턴스로 전달한다고 부릅니다 B
또는 C
- 회원은 효과적으로 공개 될 것입니다. 왜냐하면 다른 수업을 소개하여 항상 일할 수 있기 때문입니다. 좋은 생각은 아닙니다. 현재 규칙을 사용하면 서브 클래스가 필요합니다 B
또는 C
- 처음에는 할 수 없을 수도 있습니다.
다른 팁
이것을함으로써 :
MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score);
당신은 실제로 당신이 Midisynth 클래스를 연장했다는 사실을 이용하지 않습니다.
당신이 시도한다면
this.scoreToSec(score);
그런 다음 보호 기능에 액세스 할 수 있습니다.