这是受保护方法的文档:

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

    }
}
有帮助吗?

解决方案

(编辑: 他们称之为记忆的答案 给出了避免您遇到此问题的实用建议。这个答案给出了您必须遵循该建议的原因,即为什么语言是这样设计的。)

您只能访问与访问代码(或子类)类型相同的另一个对象的受保护成员 - 即使该成员是 宣布 在超类型中。

来自 Java 语言规范,第 6.6.2 节:

令C为宣布受保护成员M的类。仅允许进入C的一个子类的体内。另外,如果ID表示实例字段或实例方法,则:

  • 如果访问是通过合格的名称q.id,其中q是一个expressionName,则允许访问访问,并且仅当extession q的类型是S或S的类型。
  • 如果访问是通过字段访问表达式E.ID,则e为主表达式或通过方法调用表达式e.id(。。。

这是为了允许类型访问与其自己的继承树相关的成员,而不破坏其他类的封装。例如,假设我们有:

     A
    / \
   B   Other
  /
 C

并且 A 声明为受保护成员 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