보호 된 Java 방법에 액세스 할 수없는 이유는 내가 수업을 연장했다고 생각 했습니까?

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

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

그런 다음 보호 기능에 액세스 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top