dinossauro = (Dinossauro) sapossauro;
dinossauro.falar()
Aí seria preciso "jogar fora" a parte Sapo do objeto sendo 'casteado'.
nao... eu disse um cast especial... algo que serve apenas para a maquina virtual saber qual método estamos usando
[code]
public class A {
public void x() {
System.out.println("Método x da classe A");
}
}
public class B {
public void x() {
System.out.println("Método x da classe B");
}
}
public class C extends A, B {
...
}
----
public void metodoQualquer() {
C obj = new C();
obj.x();
}
/* Não compila, o compilador nao sabe se deve chamar o método x da classe A ou da classe B */
public void metodoQualquer() {
C obj = new C();
[A]obj.x(); /* Imprime "Método x da classe A" */
}
/* Aqui vc não transforma um objeto da classe C(A, B) em um objeto da classe A, desprezando a sua porção da classe B, mas instrui o compilador dizendo 'compilador, eu sei que existem dois métodos iguais nas minhas superclasses, mas eu estou explicitando que quero usar o método da classe A, sacou? */
mas reconheço q isso iria complicar muito se acontecesse algo assim, por exemplo:
uma classe A q implementa o método x()
uma classe B q implementa o método x()
uma classe C q estende A e B
uma classe D q implementa o método x()
uma classe E q estende C e D
a minha classe E tem 3 metodos x(), vai ficar complicado usar a sintaxe q eu sugeri para especificar qual método queremos usar.. até é possivel, mas fica mto feio, ainda mais se houvessem mais classes implementando o método x().
outra abordagem, é simplesmente nao compilar, uai...
com o uso de interfaces, pode ocorrer um conflito de métodos e o programa simplesmente não compila, pq com classes nao poderia ser igual?
[code]
interface InterfaceA {
public void x();
}
interface InterfaceB {
public int x();
}
public class MinhaClasse implements InterfaceA, InterfaceB {
/* Iae, como implementar o método x()?
Se eu tentar escolher apenas um, ou o da InterfaceA ou o da InterfaceB, o programa nao compila... se eu implementar os dois, tb não compila, pq vai ter dois métodos iguais, mudando apenas o tipo de retorno, e isso não basta para o compilador saber qual vc estará querendo usar em determinado momento.. */
}[/code]