Polimorfismo - Java

24/10/2018

0

Criar uma classe principal com o método main. ¢  Criar um outro método estático em principal com a seguinte assinatura: —  public static Airplane [] retornaAleatorio() ¢  Esse método deve criar um array com o tamanho sendo calculado por Math.random de 0 a 100. Esse método deve ser preenchido com instâncias de Helicopter e Seaplane. Cada posição do array deverá conter um Helicopter ou Seaplane. Para saber qual instância será criada, crie um terceiro método estático chamado alea() que deverá retornar aleatoriamente um número. Utilize esse método para preencher o array. Se o retorno do metodo ale() for impar, crie um Helicopter, se for par, um Seaplane.

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

Wendel Rios

Responder

Post mais votado

08/11/2018

Wendel, no método que você indicou o erro ele acontece pelo seguintes motivos:
- 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

Marcio Souza
Responder

Mais Posts

08/11/2018

Marcio Souza

Seria necessário você postar o conteúdo da interface e das classes, senão não tenho como saber da onde vem os métodos. Use marcação de código fonte que tem no editor, selecione o código e pressione o primeiro botão a direita no topo do formulário.
Responder

08/11/2018

Wendel Rios

Interface Voador

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);

	}

}
Responder

08/11/2018

Wendel Rios

Ahh sim, entendi o lance. Tipo nas linhas onde eu estava tentando fazer os castings, na verdade eu estava atribuindo o valor retornado dos meus metodos, as minhas variaveis, em vez de retornar o objeto do array ja ''casteado''. Por isso que nas linhas onde os erros ocorriam, ele dizia que tais metodos nao estavam definidos em Voador, pois naquela altura eu estava chamando um metodo nao definido no meu tipo da minha variavel de referencia que eh Voador. Entendi, primeiro eu faco o casting pra dps eu chamar o metodo da minha classe mais especifica. Valeu, Ballem
Responder

08/11/2018

Marcio Souza

Ahh sim, entendi o lance. Tipo nas linhas onde eu estava tentando fazer os castings, na verdade eu estava atribuindo o valor retornado dos meus metodos, as minhas variaveis, em vez de retornar o objeto do array ja ''casteado''. Por isso que nas linhas onde os erros ocorriam, ele dizia que tais metodos nao estavam definidos em Voador, pois naquela altura eu estava chamando um metodo nao definido no meu tipo da minha variavel de referencia que eh Voador. Entendi, primeiro eu faco o casting pra dps eu chamar o metodo da minha classe mais especifica. Valeu, Ballem

Isso mesmo e ainda tinha o problema dos seus métodos serem void e as variáveis precisavam de objetos Aviao e Helicoptero.
T+
Responder

08/11/2018

Wendel Rios

Isso mesmo e ainda tinha o problema dos seus métodos serem void e as variáveis precisavam de objetos Aviao e Helicoptero.
T+


Sim, sim tinha esse problema tb, ja acertei o codigo e rodou tudo certinho, brigadoo.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar