Resgatar níveis menores de abstração.É possível?

7 respostas
el_loko_pepe

Eu estou com uma enumeração(enum) que tem como parâmetro no construtor um objeto que extende em outros.
Esse parâmetro começa como null e eu seto ele como sendo alguma classe que extende esse objeto do parâmetro.
Uma outra classe pega algum dado da enumeração e manda esse objeto parâmetro executar um método dele.

O problema é que esse método está no nível de abstração mais baixo, ou seja, nesse nível de abstração que ele está definido ele não reconhece este método.

Então surgiu a seguinte dúvida:
Existe alguma maneira de eu mandar esse parâmetro resgatar seu nível de abstração mais baixo(que é o que ele era quando o passei pelo set deste enum) e então reconhecer seus métodos?

PS: esse problema surgiu porque inicialmente os dados deste enum tem parametro null (_Exemplo(null) ) , então se eu não abstraisse esse parâmetro ficaria ambiguo.Se alguém souber outra maneira de resolver este problema também agradeço.

7 Respostas

el_loko_pepe
wellington.nogueira:
el_loko_pepe:
Eu estou com uma enumeração(enum) que tem como parâmetro no construtor um objeto que extende em outros. Esse parâmetro começa como null e eu seto ele como sendo alguma classe que extende esse objeto do parâmetro. Uma outra classe pega algum dado da enumeração e manda esse objeto parâmetro executar um método dele.

O problema é que esse método está no nível de abstração mais baixo, ou seja, nesse nível de abstração que ele está definido ele não reconhece este método.

Então surgiu a seguinte dúvida:
Existe alguma maneira de eu mandar esse parâmetro resgatar seu nível de abstração mais baixo(que é o que ele era quando o passei pelo set deste enum) e então reconhecer seus métodos?

PS: esse problema surgiu porque inicialmente os dados deste enum tem parametro null (_Exemplo(null) ) , então se eu não abstraisse esse parâmetro ficaria ambiguo.Se alguém souber outra maneira de resolver este problema também agradeço.


Cara, sinceramente, não entendi exatamente o que você precisa.
O método que você quer acessar está privado ou você está usando alguma interface que não tem esse método na assinatura?

Por exemplo:
public enum Veiculos {

  Carro(null), //comeca como null e eu seto depois
  Moto(null);

 private Veiculo veiculo;

  private Veiculos(Veiculo veiculo){
     this.veiculo = veiculo; // a idéia era passar um 'Carro carro' ou 'Moto moto' , mas como comeca como null os dados ficariam ambíguos, então eu tive que abstrair pra Veiculo veiculo, que //sera um "Carro extends Veiculo" ou "Moto extends Veiculo" passado por um método set
}

public class teste {

Veiculos[] listaDeVeiculos = Veiculos.values();

public testar{
 listaDeVeiculos[0].ligarParaBrisa() //nao funciona porque um objeto Veiculo nao tem o método ligarParaBrisa  que uma moto por exemplo não tem parabrisa

}
}

Se tiver outra maneira de fazer isso também seria de grande ajuda.

el_loko_pepe

Deu certo agora, valeu.

WellingtonRamos

el_loko_pepe:
Eu estou com uma enumeração(enum) que tem como parâmetro no construtor um objeto que extende em outros.
Esse parâmetro começa como null e eu seto ele como sendo alguma classe que extende esse objeto do parâmetro.
Uma outra classe pega algum dado da enumeração e manda esse objeto parâmetro executar um método dele.

O problema é que esse método está no nível de abstração mais baixo, ou seja, nesse nível de abstração que ele está definido ele não reconhece este método.

Então surgiu a seguinte dúvida:
Existe alguma maneira de eu mandar esse parâmetro resgatar seu nível de abstração mais baixo(que é o que ele era quando o passei pelo set deste enum) e então reconhecer seus métodos?

PS: esse problema surgiu porque inicialmente os dados deste enum tem parametro null (_Exemplo(null) ) , então se eu não abstraisse esse parâmetro ficaria ambiguo.Se alguém souber outra maneira de resolver este problema também agradeço.


Cara, sinceramente, não entendi exatamente o que você precisa.
O método que você quer acessar está privado ou você está usando alguma interface que não tem esse método na assinatura?

WellingtonRamos

Agora entendi o que você quer :)

Vou colocar um exemplo de como deve fazer:
package br.com.testes;

public class EnumTest {
	public static void main(String[] args) {
		Veiculos[] values = Veiculos.values();
		for (Veiculos veiculo : values) {
			try {
				veiculo.getVeiculo().ligarLimpadorParaBrisa();
			} catch (ComponentException e) {
				System.out.println("O Veiculo " + veiculo + " falhou em ligar o limpador");
			}
		}
	}
}

enum Veiculos {
	//Enum
	carro(new Carro()),
	moto(new Moto());
	
	//Corpo comum a todos os veículos
	private Veiculo v;

	Veiculos(Veiculo v) {
		this.v = v;
	}
	public Veiculo getVeiculo() {
		return v;
	}
}

interface Veiculo {
	void ligarLimpadorParaBrisa() throws ComponentException;
	
}

class Carro implements Veiculo {

	public void ligarLimpadorParaBrisa() throws ComponentException {
		System.out.println("Liguei parabrisa");
	}
}
class Moto implements Veiculo {

	public void ligarLimpadorParaBrisa() throws ComponentException {
		throw new ComponentException("Não existe limpador de parabrisa em moto");
	}
}

class ComponentException extends Exception {

	public ComponentException(String message) {
		super(message);
	}
	
}

Estou fazendo outro exemplo. logo postarei aqui.

WellingtonRamos
Segue o outro exemplo.
package br.com.testes;

public class EnumTest {
	public static void main(String[] args) {
		
		VeiculosAutomotores[] values = VeiculosAutomotores.values();
		for (VeiculosAutomotores veiculo : values) {
			try {
				veiculo.ligarLimpadorParaBrisa();
			} catch (ComponentException e) {
				System.out.println("O Veiculo " + veiculo + " falhou em ligar o limpador");
			}
		}		
	}
}


enum VeiculosAutomotores implements Veiculo {
	
	carro() {
		public void ligarLimpadorParaBrisa() throws ComponentException {
			System.out.println("Liguei parabrisa");
		}
	}, 
	
	moto() {
		public void ligarLimpadorParaBrisa() throws ComponentException {
			throw new ComponentException("Não existe limpador de parabrisa em moto");
		}
	};
	
}

interface Veiculo {
	void ligarLimpadorParaBrisa() throws ComponentException;
}

class ComponentException extends Exception {

	public ComponentException(String message) {
		super(message);
	}
	
}
WellingtonRamos

Veja que no primeiro, criei uma interface e as classes que as implementam e depois passei por parâmetro para cada item do enum.
Já o segundo exemplo, o próprio enum implementa a interface e cada item faz sua própria implementação do método da interface.

Há outras formas de resolver mas vou deixar para você pesquisar (caso nenhum dos exemplos sirva).
http://download.oracle.com/javase/1,5.0/docs/guide/language/enums.html

Porém, acho que o enum não deva ser a melhor alternativa, caso esse código cresça muito para cada um dos itens do enum.

WellingtonRamos

el_loko_pepe:
Deu certo agora, valeu.
:thumbup:

Criado 30 de junho de 2011
Ultima resposta 1 de jul. de 2011
Respostas 7
Participantes 2