por que não pode o acesso i método java protegidos mesmo pensamento que eu tenho estendido a classe?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Aqui está a documentação para o método protegido:

/** Converts jmusic score data into a MIDI Sequence */
protected  javax.sound.midi.Sequence scoreToSeq(Score score)

E eu fiz esta pequena classe estender a classe que o método scoreToSeq vem de:

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;

    }
}
Foi útil?

Solução

(EDIT: a resposta de theycallmemorty dá conselhos práticos para evitar este problema no seu caso. essa resposta dá as razões pelas quais você tem que seguir esse conselho, ou seja, por que a linguagem foi projetado que) caminho.

Você só pode acessar um membro protegido de outro objeto que é do mesmo tipo que o código de acesso (ou uma subclasse) -. Mesmo que o membro é declarou em um supertipo

A partir da Java Language Specification, seção 6.6.2 :

Seja C a classe em que um protegido membro m é declarada. Acesso só é permitida no interior do corpo de um subclasse S de C. Além disso, se Id indica um campo de instância ou instância método, então:

  • Se o acesso é por um nome qualificado Q.Id, onde Q é um ExpressionName, em seguida, o acesso é permitido se e somente se o tipo da expressão Q S ou uma subclasse de S.
  • Se o acesso é por uma expressão acesso de campo E.Id, onde E é um primário expressão, ou por um método de invocação expressão E.Id (...), em que E é um expressão primária, então o acesso é permitida se e somente se o tipo de E S ou uma subclasse de S.

Esta é permitir que um tipo para acessar membros relevantes para a sua própria árvore de herança, sem derrotar encapsulamento de outras classes. Por exemplo, suponha que temos:

     A
    / \
   B   Other
  /
 C

e A declarado x membro protegido. Sem a regra de trabalho da maneira que faz, você pode obter encapsulamento rodada, colocando um membro em Other:

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

e apenas chamando que passar em uma instância do B ou C - o membro efetivamente se tornar público, porque você sempre pode trabalhar em torno dele através da introdução de uma outra classe ... não é uma boa ideia. Com a regra atual, você teria que B subclasse ou C -. Que você pode não ser capaz de, em primeiro lugar

Outras dicas

Ao fazer isso:

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

Você não está realmente aproveitando o fato de que você estendeu a classe MidiSynth.

Se você estava a tentar

this.scoreToSec(score);

Em seguida, você vai achar que você tem acesso à função protegida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top