9

保護されたメソッドのドキュメントは次のとおりです。

/** 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;

    }
}
4

2 に答える 2

18

(編集:theycallmemortyの回答は、この問題を回避するための実用的なアドバイスを提供します。この回答は、そのアドバイスに従わなければならない理由、つまり言語がそのように設計されている理由を示しています。)

メンバーがスーパータイプで宣言されている場合でも、アクセスコード(またはサブクラス)と同じタイプの別のオブジェクトの保護されたメンバーにのみアクセスできます。

Java言語仕様のセクション6.6.2から:

保護されたメンバーmが宣言されているクラスをCとします。アクセスは、CのサブクラスSの本体内でのみ許可されます。さらに、Idがインスタンスフィールドまたはインスタンスメソッドを示す場合、次のようになります。

  • アクセスが修飾名Q.Id(QはExpressionName)による場合、式QのタイプがSまたはSのサブクラスである場合にのみ、アクセスが許可されます。
  • アクセスがフィールドアクセス式E.Id(Eはプライマリ式)による場合、またはメソッド呼び出し式E.Id(。..)(Eはプライマリ式)による場合、アクセスは次の場合にのみ許可されます。 EのタイプがSまたはSのサブクラスの場合。

これは、他のクラスのカプセル化を無効にすることなく、タイプが自身の継承ツリーに関連するメンバーにアクセスできるようにするためです。たとえば、次のようになります。

     A
    / \
   B   Other
  /
 C

およびAは保護されたメンバーを宣言しましたx。ルールがそのように機能していなくても、メンバーを次のように配置することで、ラウンドカプセル化を取得できますOther

public int getX(A a)
{
    return a.x;
}

Bまたは、またはのインスタンスを渡すことを呼び出すだけでC、メンバーは事実上公開されます。これは、別のクラスを導入することでいつでも回避できるためです...お勧めできません。現在のルールでは、サブクラス化BするC必要があります。これは、そもそもできない可能性があります。

于 2009-10-25T21:57:07.803 に答える
15

これを行うことによって:

MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score); 

MidiSynthクラスを拡張したという事実を実際に利用しているわけではありません。

あなたがしようとした場合

this.scoreToSec(score);

次に、保護された機能にアクセスできることがわかります。

于 2009-10-25T21:58:26.897 に答える