Classes Abstratas, Polimorfismo, Instanciamento - Cadastro de Produtos

18 respostas
N

Amigos,

Tudo bem? Colocarei as classes aqui e depois perguntarei as minhas dúvidas.
public abstract class Produto {

    private int cod;
    private double preco;
    private String nome;
    private String marca;

    public Produto() {
    }

    public int getCod() {
        return cod;
    }

    public void setCod(int cod) {
        this.cod = cod;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public void cadastrarProduto() {
    }
    public static Scanner leitor = new Scanner(System.in);

    public void dadosDoProduto() {
        System.out.print("Codigo: ");
        this.cod = leitor.nextInt();
        System.out.print("Nome: ");
        this.nome = leitor.next();
        System.out.print("Marca: ");
        this.marca = leitor.next();
        System.out.print("Preco: ");
        this.preco = leitor.nextDouble();
    }

    public void exibirProduto() {
        System.out.println("\nCodigo:" + Integer.toString(cod)
                + "\nNome: " + nome + "\nMarca: " + marca
                + "\nPreco: " + Double.toString(preco));
    }
    public abstract void reajustarPreco();
}
public class Estoque{
    
  private ArrayList<Produto> listaProdutos = new ArrayList<Produto>();
  
  public ArrayList<Produto> getListaProdutos(){
      return listaProdutos;
  }
//  public void reajustarPreco(){
 // }
         
      public void cadastrarProduto(Produto p){          
           listaProdutos.add(p);      
       }
       
    public ArrayList<Produto> getProdutos(){
        return listaProdutos;
    }
            
       public void produtos(){
           for(int i=0;i<listaProdutos.size();i++){
               listaProdutos.get(i).dadosDoProduto();
           }
       }
       
       public void ListarProdutos(){
           for(int i=0;i<listaProdutos.size();i++){
               listaProdutos.get(i).exibirProduto();
           }
       }    
}
public class CestaDeCompras extends Estoque {

    private ArrayList<Produto> item = new ArrayList<Produto>();

    public CestaDeCompras() {
    }
    public static Scanner leitor = new Scanner(System.in);

    public void adicionarProduto(Estoque y) {
        System.out.print("Informe o codigo do produto: ");
        int codigo = leitor.nextInt();
        for (int i = 0; i < y.getListaProdutos().size(); i++) {
            Produto p = y.getListaProdutos().get(i);

            if (p.getCod() == (codigo)) {
                item.add(p);
            } else 
                System.out.println("Produto nao Cadastrado!");
            
        }
    }
    public void ListarProdutos() {
        for (int i = 0; i < item.size(); i++) {
            item.get(i).exibirProduto();
        }
    }
}
public class Televisao extends Produto {
    
    private int polegadas;
    private double novoPreco;
    private double desconto;
    
    public Televisao(){
        super();
    }
    
    //Gets e Setters

    public int getPolegadas() {
        return polegadas;
    }

    public void setPolegadas(int polegadas) {
        this.polegadas = polegadas;
    }
    
   //public static Scanner leitor = new Scanner(System.in);
  
    
    public void dadosDoProduto(){
        super.dadosDoProduto();
        System.out.println("Polegadas: ");
        this.polegadas = leitor.nextInt();
    }
    
    public void exibirProduto(){
        super.exibirProduto();
        System.out.print("Polegadas: "+Integer.toString(polegadas));
    }

    @Override
    public void reajustarPreco() {
        //this.getPreco() * (0.1+this.novoPreco/100);
        desconto = this.getPreco() * 1/100;
        novoPreco = getPreco() - desconto;
        System.out.println("O novo preço da televisão será: "+novoPreco);
    }
}
public class Menu {

    public static Scanner leitor = new Scanner(System.in);

    public static void main(String args[]) {
        Estoque novo = new Estoque();


        int op;

        do {
            System.out.println("1-Cadastrar Produto");
            System.out.println("2-Cesta de Compras");
            System.out.println("3-Sair");
            System.out.print("Opção: ");
            op = leitor.nextInt();
            switch (op) {
                case 1:
                    String nomeProduto = null;
                    System.out.println("Digite o nome do produto que queira cadastrar:");
                    nomeProduto = leitor.next();

                    if ("televisao".equals(nomeProduto)) {
                        Produto tv = new Televisao();
                        novo.cadastrarProduto(tv);
                        novo.produtos();
                        novo.ListarProdutos();
                        System.out.println("\n");
                        break;
                    }
                    if ("dvd".equals(nomeProduto)) {
                        Produto dvd = new DvdPlayer();
                        novo.cadastrarProduto(dvd);
                        novo.produtos();
                        novo.ListarProdutos();
                        System.out.println("\n");
                        break;
                    }
                    if ("Micro System".equals(nomeProduto)) {
                        Produto som = new MicroSystem();
                        novo.cadastrarProduto(som);
                        novo.produtos();
                        novo.ListarProdutos();
                        System.out.println("\n");
                        break;
                    }
                    if ("notebook".equals(nomeProduto)) {
                        Produto notebook = new Notebook();
                        novo.cadastrarProduto(notebook);
                        novo.produtos();
                        novo.ListarProdutos();
                        System.out.println("\n");
                        break;
                    }
                    if ("video game".equals(nomeProduto)) {
                        Produto videoGame = new VideoGame();
                        novo.cadastrarProduto(videoGame);
                        novo.produtos();
                        novo.ListarProdutos();
                        System.out.println("\n");
                        break;
                    }

                    break;

                case 2:
                    CestaDeCompras cesta = new CestaDeCompras();
                    /*Produto compra1 = new Televisao();
                    cesta.adicionarProduto(compra1);*/
                    cesta.adicionarProduto(novo);
                    cesta.ListarProdutos();
                    System.out.println("\n");
                    break;

                case 3:
                    Produto p = new Televisao();
                    p.reajustarPreco();

                    break;

                case 4:
                    System.out.println("Fim do Programa");
                    break;
                default:
                    System.out.println("Opcao Invalida!");
            }
        } while (op != 4);
    }
}

Coloquei a classe de apenas um produto para não alongar mais =/
Tem mais 4, mas a classe ficaria muito parecida, pra não falar igual, a da Televisão, que também é um produto a ser cadastrado.

As classes que eu postei não estão aparecendo erro, do jeito que está, mas dá erro ao compilar.

O programa está cadastrando, está adicionando à cesta e está listando corretamente o PRIMEIRO produto cadastrado. Quando ele faz o Loop e eu peço para cadastrar o segundo produto, da erro porque ele pede o código do produto, eu escolho Notebook e pede polegadas pra cadastro... umas coisas nada a ver.

Outra coisa que eu estou em dúvida: Na classe Produtos() eu fiz um método para reajustarPreco(), e eu não sei instanciar ele no menu...

Me ajudem, por favor! =)

Obrigado.
Att. Gustavo.

Desculpem o tamanho do post.
Se tiver outra forma de faze-lo, menor, no caso, falem que eu refaço.

18 Respostas

ViniGodoy

Tem vários problemas:

  1. O único método que deve ser usado para ler do teclado com o Scanner é o método nextLine(). Os outros, podem dar problema;
  2. Cuidado na parte da cesta. Você está criando uma nova cesta sempre que a opção 2 é pessionada;
  3. Ajuste o nome da variável do estoque. É melhor chamar de “estoque” do que de “novo”;
N

Eu estava lendo com o nextLine(), mas estava dando problema pois pulava uma linha. Pulava a outra pergunta…
Tipo:
nome da marca: 2
nome do processador:
codigo:2

Tipo assim.
Aí eu coloquei só next();

E quando for inteiro, como eu leria com o Scanner?

No estoque, mudarei o nome agora.

Quanto a cesta. Não sei fazer de outra forma. Poderia me ajudar?

fabiocortolan

Além do q foi dito pelo ViniGodoy, tem o problema da inserção do 2o. produto, qdo vc insere o segundo produto vc está percorrendo a lista de produtos já inseridos:

novo.produtos()

esse método está percorrendo toda a lista de produtos q vc já inseriu, ou seja, se vc inseriu uma TV ele vai pedir as polegadas.
No caso do método “reajustarPreco()”, coloque uma opção para ele no menu e qdo selecionado solicite o produto q deve ser reajustado, instancie o objeto referente ao produto e faça o reajuste.

ViniGodoy

Para ler um inteiro:

int op = Integer.parseInt(leitor.nextLine());

Sempre que o java rodar um comando “new”, ele está criando um novo objeto. Portanto, se você tiver um só carrinho na sua aplicação, nã pode dar new dentro do loop. Tem que fazer como você fez ali com a variável estoque.

ViniGodoy

O método dadosDoProduto() tem a função de exibir os dados do produto, não de perguntar por eles. Na sua classe TV, você está perguntando o número de polegadas.

N

novo.produtos() esse método está percorrendo toda a lista de produtos q vc já inseriu, ou seja, se vc inseriu uma TV ele vai pedir as polegadas.

Então eu tenho que mudar a lógica do método ?
Ou mudo o jeito que eu estou chamando no menu?

ViniGodoy

Tem que repensar no que esse método faz. Ele lista produtos? Se for o caso, o nome dele teria que ser “listarProdutos” e o método dadosProduto() deveria só exibir os dados do produto.

Se ele recadastra produtos o nome deveria ser recadastrarProdutos() e o método dadoProdutos() deveria solicitar os dados do produto.

O que não pode é ser inconsistente. Do jeito que está hoje, o método produtos() é usado para listar produtos, mas chama internamente o método dadoProdutos(), que solicita os dados da TV.

N

O método dadosDoProduto() tem a função de exibir os dados do produto, não de perguntar por eles. Na sua classe TV, você está perguntando o número de polegadas.

Não… o método está perguntando e na classe Televisão estou usando o super para puxar as perguntas e adicionar mais a pergunta das polegadas.
Pra exibir é exibirProduto();

ViniGodoy
Então o método produtos() está requisitando o recadastro de todos os produtos do estoque. Se você só quer perguntar do produto atual, ao invés de chamar produtos(), chame o método dadosProduto() do produto sendo cadastrado:
if ("televisao".equals(nomeProduto)) {  
                        Produto tv = new Televisao();  
                        tv.dadosProduto();  //Chama só o dessa TV

                        novo.ListarProdutos();  
                        novo.cadastrarProduto(tv);  
                        System.out.println("\n");  
                        break;  
                    }

Note que a classe Estoque representa o estoque todo.

N

O método produtos() pega os dadosDoProdutos(), que são as perguntas - polegadas, etc - e joga em um Array, na listaProdutos.

O método listarProdutos() vai percorrendo essa lista exibindo os dados do produto.

Pelo menos isso que eu tentei fazer.

N
ViniGodoy:
Então o método produtos() está requisitando o recadastro de todos os produtos do estoque. Se você só quer perguntar do produto atual, ao invés de chamar produtos(), chame o método dadosProduto() do produto sendo cadastrado:
if ("televisao".equals(nomeProduto)) {  
                        Produto tv = new Televisao();  
                        tv.dadosProduto();  //Chama só o dessa TV

                        novo.ListarProdutos();  
                        novo.cadastrarProduto(tv);  
                        System.out.println("\n");  
                        break;  
                    }

Note que a classe Estoque representa o estoque todo.

Mas fazendo isso eu não vou colocar os Dados na lista...

ViniGodoy

O método produtos() está perguntando os dados de todos os produtos em estoque (observe o for ali). Na hora do cadastro, você só quer cadastrar o dado do produto sendo lido.

Melhore o nome desse método. Ele deveria se chamar “atualizarProdutos()” e não só “produtos()”.

N

Melhorarei. Vou tentando aqui…

ViniGodoy

Como não? Veja ali:

  1. Você criou a TV;
  2. Você pediu os dados dessa TV;
  3. E no método cadastrarProduto, você colocou a TV criada na lista.
N

Fiz as modificações e deram, em partes, certo.

Não está mais pedindo no segundo produto os dados do primeiro produto inserido.
Mas na hora que eu listei o segundo aparece os dados do primeiro.

N

Erro meu. Está, sim, listando corretamente.

Vou ver mais problemas e já já eu pergunto.

N

Vou mudar o menu e, ao invés de listar toda vez o produto cadastrado, perguntar lá no menu se quer listar.
Fica mais ‘bonitim’. hehehe

N

Galera... Voltei!

Agora com a dúvida no método para reajustarPreco.

Como todos os produtos vão utilizar um novoPreco, fiz uma nova variável para usar como Herança.
Porém, não to conseguindo chama-la...
Na classe televisao, por exemplo.

Eu tinha feito em todas as classes de produtos um novo atributo declarado como novoPreco e fazia assim
novoPreco = this.getPreco() - (this.getPreco()*1/100);
        System.out.println("O preço reajustado da TV será de: "+novoPreco);

Porém vi que ficava fora do conceito de Herança, já que a matéria é essa e dá pra eu usa-la.

Só qeu eu não sei chamar.

Eu sobrescrevi o método
@Override
    public void reajustarPreco() {
      //  novoPreco = this.getPreco() - (this.getPreco()*1/100);
       // System.out.println("O preço reajustado da TV será de: "+novoPreco);
        super.reajustarPreco();
        
    super.getNovoPreco() = this.getPreco() - (this.getPreco()-(1/100));
    
    }

Estava testando algumas coisas...

Alguma sujestão?

Criado 27 de março de 2013
Ultima resposta 27 de mar. de 2013
Respostas 18
Participantes 3