[Dúvida] Polimorfismo Cast

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:

[code]import java.util.Vector;
import javax.swing.*;
public class Loja{
public static void main(String[] args){
Vector artigos = new Vector();

	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!!
}

}[/code]

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

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

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 ^^

Obrigado Vini Fernandes e Lavieri!
:smiley: