[Dúvida] Polimorfismo Cast

3 respostas
P

Super Classe Artgo:

import javax.swing.JOptionPane;
public class Artigo {
	protected String descricao;
	protected int codigo_identificador;
	protected String marca;
	protected int quantidade_stock;
	protected double preco;
	//constructor
	public Artigo(){	
		descricao=JOptionPane.showInputDialog("introduza descricao");
		codigo_identificador=Integer.parseInt(JOptionPane.showInputDialog("introduza codigo identificador"));
		marca=JOptionPane.showInputDialog("introduza marca");
		quantidade_stock=Integer.parseInt(JOptionPane.showInputDialog("introduza quantidade stock"));
		preco=Integer.parseInt(JOptionPane.showInputDialog("introduza preco"));
	}
}

Sub Classe Lentes:

import javax.swing.JOptionPane;
public class Lentes extends Artigo{
	protected int distancia_focal;
	protected String zom;
	//constructor
	public Lentes(){	
		super();
		distancia_focal=Integer.parseInt(JOptionPane.showInputDialog("introduza distancia (ex: 200mm)"));
		zom=JOptionPane.showInputDialog("introduza zom (ex: v/f)");
	}
	public void getInformacao(){
		System.out.println("descricao: "+descricao);
		System.out.println("codigo: "+codigo_identificador);
		System.out.println("marca: "+marca);
		System.out.println("quantidade: "+quantidade_stock);
		System.out.println("preco: "+preco);
		System.out.println("distancia: "+distancia_focal);
		System.out.println("zom: "+zom);
	}
}

Sub Classe Filmes:

import javax.swing.JOptionPane;
public class Filmes extends Artigo{
	protected int sensibilidade;
	protected int n_fotos;
	//constructor
	public Filmes(){	
		super();
		sensibilidade=Integer.parseInt(JOptionPane.showInputDialog("introduza sensibilidade (ex: ISO 32"));
		n_fotos=Integer.parseInt(JOptionPane.showInputDialog("introduza numero de fotos (ex: 100"));
	}
	public void getInformacao(){
		System.out.println("descricao: "+descricao);
		System.out.println("codigo: "+codigo_identificador);
		System.out.println("marca: "+marca);
		System.out.println("quantidade: "+quantidade_stock);
		System.out.println("preco: "+preco);
		System.out.println("sensibilidade: "+sensibilidade);
		System.out.println("fotos: "+n_fotos);
	}
}

Sub Classe Camaras:

import javax.swing.JOptionPane;
public class Camaras extends Artigo{
	protected String lente;
	protected String cor;
	//constructor
	public Camaras(){	
		super();
		lente=JOptionPane.showInputDialog("introduza lente (ex: s/n)");
		cor=JOptionPane.showInputDialog("introduza cor (ex: preto)");
	}
	public void getInformacao(){
		System.out.println("descricao: "+descricao);
		System.out.println("codigo: "+codigo_identificador);
		System.out.println("marca: "+marca);
		System.out.println("quantidade: "+quantidade_stock);
		System.out.println("preco: "+preco);
		System.out.println("lente: "+lente);
		System.out.println("cor: "+cor);
	}
}

Programa principal:

import java.util.Vector;
import javax.swing.*;
public class Loja{
	public static void main(String[] args){
		Vector<Artigo> artigos = new Vector<Artigo>(); 
		
		artigos.add(new Lentes());
		artigos.add(new Filmes());
		artigos.add(new Camaras());
		
		artigos.elementAt(0).getInformacao(); //ERRO!!
		artigos.elementAt(1).getInformacao(); //ERRO!!
		artigos.elementAt(2).getInformacao(); //ERRO!!
	}
}

A minha dúvida é como chamar o método getInformacao().
Tenho de fazer obrigatoriamente o cast ou não?
Se eu fizer...
((Lentes) artigos.elementAt(0)).getInformacao();
((Filmes) artigos.elementAt(1)).getInformacao();
((Camaras) artigos.elementAt(2)).getInformacao();
...assim funciona, mas eu queria fazer sem o cast.

Obrigado

3 Respostas

Vini_Fernandes

Cara, voce tem um erro de orientacao a objeto. Polimorfismo é um mecanismo em OO que utiliza uma caracteristica comum entre classes para realizar uma acao, no seu caso voce quer que sua acao seja a execucao do metodo getInformacao(), mas para isso a sua superclasse deve ter uma declaracao/implementacao do metodo getInformacao(). Resumindo: inclua getInformacao() na superclasse!
Outra coisa, evite a classe Vector! Faca algo como :

List<Artigo> artigos = new ArrayList<Artigo>();   
           
        artigos.add(new Lentes());   
        artigos.add(new Filmes());   
        artigos.add(new Camaras());   
        
        for(Artigo meuArtigo : artigos)
            meuArtigo.getInformacao();

Abracao

Lavieri

O problema que vc esta tendo… é que sua classe Artigo não tem getDescricao(), portanto vc não tem como chamar getDescricao() diretamente dela…

existem algumas soluções para tornar isso possivel…

  • criar 1 método getDescricao() dentro de Artigo … e não fazer nada nele… e assim o método seria sobrescrito nas classes seguintes…
  • vc poderia tb se quiser, mudar a classe artigo para 1 classe abstrata, criar um método abstrato getDescricao() … desta forma tornaria obrigatorio que toda classe que a extenda (ou seja todas as suas sub-classes) implementem o getDescricao() …

existem outras soluções… mais o seu problema é que Artigo não tem o método getDescricao ^^

P

Obrigado Vini Fernandes e Lavieri!
:smiley:

Criado 8 de fevereiro de 2009
Ultima resposta 8 de fev. de 2009
Respostas 3
Participantes 3