tenho um método em uma classe “Filho” que sobrepôs o método da classe “Pai” e o mesmo método da classe “Pai” sobrepôs o método da classe “Avo”. A implementação do método da classe “Filho” necessita invocar o método da classe “Avo”. Alguém saberia me disser como fazer isto sem criar uma instância da classe “Avo”. Para acessar o método da classe “Pai” é somente usar “super.metodo()”, mas como se faz para acessar o método da classe “Avo” ?
Exemplo:
public class Avo {
public void msg(){
System.out.println(“Avo”);
}
}
public class Pai extends Avo {
public void msg(){
System.out.println(“Pai”);
}
}
public class Filho extends Pai {
public static void main(String[] args) {
Filho filho = new Filho();
filho.msg();
}
public void msg(){
System.out.println(“Filho”);//Imprime Filho
super.msg();//Imprime Pai
//Como imprime Avo ?
}
}
Isto não resolve o meu problema na prática, pois obtive da internet uma classe especializada que faz muitas coisas que necessito no entanto um determinado método da classe é que eu teria que substituir e necessitaria chamar o método que foi sobreposto pela classe que obtive. Para a nova funcionalidade que necessito fiz uma cópia da classe e apenas modifiquei o método, tentei tirar um maior proveito da orientação a objetos, mas desta vez não deu.
class Avo{
public Avo(){}
public void print(){
System.out.println("Avo");
}
}
class Pai extends Avo{
public Pai(){}
public void print(){
System.out.println("Pai");
}
}
class Filho extends Pai{
public Filho(){}
public void print(){
System.out.println("Filho");
try{
Pai p = (Pai)getClass().getSuperclass().newInstance();
p.print();
Avo a = (Avo)p.getClass().getSuperclass().newInstance();
a.print();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
O problema é que você está usando overrided de métodos para determinar qual classe está sendo usada, neste caso bastaria um getClass. Esse caso não é muito comum, talvez por isso não exista super.super.
Se o método msg foi sobreescrito no pai não é normal que você use no neto o método do avô, provavelmente o filho deveria ser, na verdade, o irmão (ou tio, irmão do pai) e herdar de avô. Mas se elementos do pai fossem necessários no filho esses elementos talves ficassem melhor como uma interface qua ambos implementariam. Depende do caso.
Mas eu acredito que deva existir solução mais elegante para o que você está tentando fazer.
Isso vai contra o implementation hiding. Tipo, se sua classe X extende a classe A, não importa como A foi implementada pra vc.
Se A sobrescreveu um método do pai dela, é pq ela precisa disso pra funcionar direito. Se sua X conhece o pai dela, isso não quer dizer nada, pq quem provê os “serviços” que vc usa é A.
Esse talvez seja mais um exemplo onde herança não é um bom negócio.