1
resposta

Polimorfismo em Java

Estou com uma dúvida: Tenho esta super classe:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

class OrdemServico {
    private Cliente cliente;
    private Veiculo veiculo;
    private Date data;
    private String mecanico;
    private List<Peca> pecas;
    private List<Servico> servicos;
    public OrdemServico(Cliente cliente, Veiculo veiculo, String mecanico, Date data) {
        this.cliente = cliente;
        this.veiculo = veiculo;
        this.mecanico = mecanico;
        this.data = data;
        this.pecas = new ArrayList<>();
        this.servicos = new ArrayList<>();
    }
    public void addPeca(Peca peca) {
        pecas.add(peca);
    }
    public void addServico(Servico servico) {
        servicos.add(servico);
    }
    public double calcularValorTotal() {
        double valorTotal = 0.0;
        for (Item peca : pecas) {
            valorTotal += peca.getValor();
        }
        for (Item servico : servicos) {
            valorTotal += servico.getValor();
        }
        return valorTotal;
    }


}

E tenho duas classes filhas dela que herdam:

class Item {
    private String codigo;
    private String descricao;
    private double valor;
    public Item(String codigo, String descricao, double valor) {
        this.codigo = codigo;
        this.descricao = descricao;
        this.valor = valor;
    }
    public String getCodigo() {
        return codigo;
    }
    public String getDescricao() {
        return descricao;
    }
    public double getValor() {
        return valor;
    }
}

E esta outra:

class Servico extends Item {
    private int horasDeReparo;
    public Servico(String codigo, String descricao, double valor, int horasDeReparo) {
        super(codigo, descricao, valor);
        this.horasDeReparo = horasDeReparo;
    }
    public int getHorasDeReparo() {
        return horasDeReparo;
    }
}

Como eu poderia reescrever este método, que transcrevo abaixo, em cada uma das subclasses de tal forma que eu tivesse o polimorfismo por sobrescrita ou sobrecarga:

 public double calcularValorTotal() {
        double valorTotal = 0.0;
        for (Item peca : pecas) {
            valorTotal += peca.getValor();
        }
        for (Item servico : servicos) {
            valorTotal += servico.getValor();
        }
        return valorTotal;
    }

De tal forma que eu tivesse na subclasse "peça" o cálculo total de peças, e na subclasse "serviço" o cálculo total com serviços, e o método da super classe tivesse a soma do total com peça e serviço. Todos os métodos com o mesmo nome e assinatura mas com implementação diferente. Por favor, poderiam me ajudar?

1 resposta

E aí, Henrique! Beleza?

Primeiro, saca só: Sobrecarga (overloading) é quando temos dois ou mais métodos com o mesmo nome na classe, mas com listas de parâmetros diferentes. Já a sobrescrita (overriding) é quando um método numa classe filha tem o mesmo nome e a mesma lista de parâmetros de um método na classe mãe.

No seu caso, você quer mandar ver na sobrescrita, porque quer que o método calcularValorTotal() faça coisas diferentes nas subclasses Peca e Servico.

Dá uma olhada nessa sugestão de como você pode fazer isso:

Na classe Item, manda ver num método calcularValorTotal() que só retorna o valor do item:

public double calcularValorTotal() {
    return valor;
}

Na classe Peca, que é filha da Item, manda ver na sobrescrita do método calcularValorTotal() pra retornar o valor total das peças:

@Override
public double calcularValorTotal() {
    // Aqui é o lugar pra você botar a lógica das peças
}

Na classe Servico, também filha da Item, manda ver na sobrescrita do método calcularValorTotal() pra retornar o valor total dos serviços:

@Override
public double calcularValorTotal() {
    // Aqui é o lugar pra você botar a lógica dos serviços
}

Aí, na classe OrdemServico, é só chamar o método calcularValorTotal() de cada item na lista de peças e serviços. O polimorfismo vai garantir que o método certo seja chamado, dependendo se o item é uma peça ou um serviço:

public double calcularValorTotal() {
    double valorTotal = 0.0;
    for (Item peca : pecas) {
        valorTotal += peca.calcularValorTotal();
    }
    for (Item servico : servicos) {
        valorTotal += servico.calcularValorTotal();
    }
    return valorTotal;
}

Talvez precise dar uns ajustes de acordo com o que seu projeto pede. Espero ter ajudado e manda bala nos estudos!