por que não pode o acesso i método java protegidos mesmo pensamento que eu tenho estendido a classe?
-
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;
}
}
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.