Polimorfismo - Java
24/10/2018
0
Pois eu estou com um pequeno problema na minha funcao fazerDecolar(), onde eu faco a verificacao se for Aviao ou Helicoptero, eu chamo o metodo de acordo com o tipo do objeto, usando o instanceof e depois fazendo o casting para minha classe mais especifica.
[code=java][/import java.util.*;
public class Principal {
public static int gerarNumeroAleatorio() {
Random gerador = new Random();
int num = gerador.nextInt(100);
return num;
}
public static int gerarTamanhoArray() {
Random gerador = new Random();
int index = gerador.nextInt(100);
return index;
}
public static Voador[] criaArray(Voador array[]) {
int index = Principal.gerarTamanhoArray();
for(int i=0;i<index;i++) {
int aux = new Principal().gerarNumeroAleatorio();// chamada da função que gerara numero aleatorio para decidir se sera criado objeto Aviao ou Helicoptero
if(aux%2==0) {
array[i] = new Aviao();
}else if(aux%2!=0) {
array[i] = new Helicoptero();
}
}
return array;
}
public static Voador[] fazerDecolar(Voador array[]) {
new Principal().criaArray(array);
for(int i=0;i<array.length;i++) {
if(array[i] instanceof Aviao) {
Aviao a = (Aviao)array[i].ligarTurbina(); -> erro aqui, compilador diz q ligarTurbina esta indefinido pra Voador
}else if(array[i] instanceof Helicoptero) {
Helicoptero h = (Helicoptero)array[i].ligarHelice(); -> msm erro de cima so q pra funcao ligarHelice
}
}
return array;
}
public static void main(String[] args) {
int index = Principal.gerarTamanhoArray();
Voador [] a1 = new Aeronave[index];
Principal.criaArray(a1);
Principal.fazerDecolar(a1);
}
}
]
Lembrando que eu tenho a classe abstract Aeronave, a interface Voador, e as minhas duas classe concretas Helicoptero e Aviao, sendo q estas duas herdam Aeronave e implementam Voador respectivamente.
Wendel Rios
Post mais votado
08/11/2018
- Primeiro seus métodos ligarTurbina() e ligarHelice() são void, então você nunca vai conseguir retornar um objeto Aviao ou Helicoptero para as variáveis 'a' e 'h'.
- Seu array é do tipo Voador e Voador não tem os métodos ligarTurbina() e ligarHelice(), embora eles também não retornem nada.
- Mesmo fazendo o cast com Aviao e Helicoptero, o retorno do cast vale para a variável de atribuição e não para o objeto array. Os métodos ligarXxx() existem só depois que o cast tiver sido retornado e não antes.
Então você tem duas formas de resolver, a primeira é essa:
/Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro Aviao a = (Aviao)array[i]; a.ligarTurbina();
Veja que primeiro fazemos o cast e o objeto Aviao é retornado a variável 'a'. Só depois a gente acessa o método ligarTurbina().
A segunda forma é mais direta, parecida com a que você estava usando:
/Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro ((Aviao) array[i]).ligarTurbina();
Note a diferença. Ela está nos parenteses. Primeiro temos o cast que vai retornar um objeto Aviao: (Aviao) array[i]
Depois colocamos esse retorno, ou seja, a própria declaração entre um par de parenteses: ( (Aviao) array[i] )
Agora sim tem um objeto Aviao e podemos acessar seu métodos: ( (Aviao) array[i] ).ligarTurbina();
Marcio Souza
Mais Posts
08/11/2018
Marcio Souza
08/11/2018
Wendel Rios
package faculdade.poo.arrays; public interface Voador { public abstract void voar(); }
Classe Aeronave
package faculdade.poo.arrays; public abstract class Aeronave implements Voador { public void ligarTurbina() { System.out.println("Aeronave ligando turbina"); } public void ligarHelice() { System.out.println("Aeronave ligando helice"); } }
Classe Aviao
package faculdade.poo.arrays; public class Aviao extends Aeronave implements Voador{ @Override public void ligarTurbina() { System.out.println("Aviao ligando turbina"); } public void voar() { System.out.println("Aviao voando"); } }
Classe Helicoptero
package faculdade.poo.arrays; public class Helicoptero extends Aeronave implements Voador{ @Override public void ligarHelice() { System.out.println("Helicoptero ligando helices"); } public void voar() { System.out.println("Helicoptero voando"); } }
Classe Principal
package faculdade.poo.arrays; import java.util.*; public class Principal { public static int gerarNumeroAleatorio() { Random gerador = new Random(); int num = gerador.nextInt(100); return num; } public static int gerarTamanhoArray() { Random gerador = new Random(); int index = gerador.nextInt(100); return index; } public static Voador[] criaArray(Voador array[]) { int index = Principal.gerarTamanhoArray(); for(int i=0;i<index;i++) { int aux = new Principal().gerarNumeroAleatorio();// chamada da função que gerara numero aleatorio para decidir se sera criado objeto Aviao ou Helicoptero if(aux%2==0) { array[i] = new Aviao(); }else if(aux%2!=0) { array[i] = new Helicoptero(); } } return array; } public static Voador[] fazerDecolar(Voador array[]) { new Principal().criaArray(array); for(int i=0;i<array.length;i++) { if(array[i] instanceof Aviao) { Aviao a = (Aviao)array[i].ligarTurbina();//trecho onde eh ocorre o erro }else if(array[i] instanceof Helicoptero) { Helicoptero h = (Helicoptero)array[i].ligarHelice();//trecho onde ocorre o erro } } return array; } public static void main(String[] args) { int index = Principal.gerarTamanhoArray(); Voador [] a1 = new Aeronave[index]; Principal.criaArray(a1); Principal.fazerDecolar(a1); } }
08/11/2018
Wendel Rios
08/11/2018
Marcio Souza
Isso mesmo e ainda tinha o problema dos seus métodos serem void e as variáveis precisavam de objetos Aviao e Helicoptero.
T+
08/11/2018
Wendel Rios
T+
Sim, sim tinha esse problema tb, ja acertei o codigo e rodou tudo certinho, brigadoo.
Clique aqui para fazer login e interagir na Comunidade :)