Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Iaew galera, eu nem programo muito em Java, uso mais PHP e Object Pascal. Mas tenho uma dúvida que vale para qualquer linguagem que tenha suporte completo à orientação a objetos.
Seguinte, se eu tenho uma classe A, e nessa classe tenho um método doSomething, uma classe B que extenda essa classe A, herdará o método doSomething, certo? Ou seja
public class A {
public void doSomething() {
System.out.println("Do something");
}
}
public class B extends A {
public void doNothing() {
System.out.println("Do nothing...");
}
}
Se eu instanciar a classe A e chamar o método doSomething, simplesmente irá executar, e se eu chamar tanto o método doNothing quanto doSometing na classe B, simplesmente executará, certo? Mas se eu quiser chamar o método doSomething da classe A como um objeto da classe B, uso o upcasting e downcasting, assim:
A a = new B();
B b = (B)a;
b.doSomething();
Mas se eu fizer isso, eu tenho o mesmo efeito:
B b = new B();
b.doSomething();
pois doSomething é um método herdado da classe A. Então nesse caso eu não ganho nada com isso?
Se eu quisesse algo, então a classe A, na verdade deveria ser uma interface ou classe abstrata, onde eu definiria um método que seria implementado em outras diversas classes, certo? Assim:
public interface A {
public void doSomething();
}
public class B implements A {
public void doSomething() {
System.out.println("Do something...");
}
public void doNothing() {
System.out.println("Do nothing...");
}
}
public class C extends B { }
A[] a = new A[2];
a[0] = new B();
a[1] = new C();
for(int i = 0; i < a.lenght; i++) {
if(a[i] instanceof B) {
B b = (B)a[i];
b.doNothing();
}
else if(a[i] instanceof C)
a[i].doSomething();
}
Nesse caso, eu não "sei" em tempo de execução quem é B ou C, mas se for B, eu faço downcasting e executo doNothing. Já se for C, não faço downcasting e eu executo doSomething().
Enfim, gostaria de saber quando é melhor usar o downcasting e upcasting, pois lá no meu primeiro exemplo, fica meio sem sentido, já nesse segundo exemplo, seria mais usual?
Vlw!
Edit --
Talvez tenha um erro, porque não tenho um compilador/IDE Java aqui para testar os códigos, e não sou especialista em Java.
Carregando comentários...