Dúvida com Polimorfismo

8 respostas Resolvido
java
luizlaljr

Procurei está duvida em outros tópicos deste fórum e em outros fóruns também, mas não obtive êxito, sendo assim vamos a minha dúvida.

Suponhamos as seguintes classes: Produto, ItemMercado, ItemMercadoPorPeso, ItemMercadoPorUnidade e suas implementações abaixo.

[b]public class Produto[/b] {
    
    private String nomeproduto;
    
    private int preco;

// Construtor com os dois parametros e getters e setters.

}

[b]public interface ItemMercado[/b] {

    public abstract Produto getProduto();
    
    public abstract [color=#FF0000]??????[/color] getQuantidade();
    
}

[b]public class ItemMercadoPorPeso implements ItemMercado[/b] {

    private float quantidade;

    public ItemVendaPorPeso(Produto produto, float quantidade) {
        super(produto);
        this.quantidade = quantidade;
    }

    @Override
    public Produto getProduto() {
        return produto;
    }

    [s]@Override[/s]
    public float getQuantidade() {
        return quantidade;
    }

}

[b]public class ItemMercadoPorUnidade implements ItemMercado[/b]{
    
    private final int quantidade;

    public ItemVendaPorUnidade(Produto produto, int quantidade) {
        super(produto);
        this.quantidade = quantidade;
    }  
    
    @Override
    public Produto getProduto() {
        return produto;
    }

  [s]@Override[/s]
   public int getQuantidade() {
        return quantidade;
    }
       
}

A minha dúvida é sobre como devo fazer com este método getQuantidade() na interface para que eu possa programar orientado a interface dentro das demais classes do sistema: Estoque, Compras, Relatórios, Caixas, que teriam o atributo

ItemMercado item

e eu poderia receber tanto um ItemMercadoPorPeso ou ItemMercadoPorUnidade.

OBS1.: Sei que da forma que eu estou fazendo posso estar modelando as classes de forma errada, aceito sugestões.

OBS2.: Já vi em sistemas por aí, sendo implementado tudo só com a classe ItemMercado com quantidade float, porém didaticamente não é o certo.

Desde já, obrigado pela atenção.

8 Respostas

Guto_Magalhaes

Acho que não entendi bem a dúvida, mas vamos lá, se quiser uma implementação específica dentro de uma classe filho, basta sobrescrever o método getQuantidade com a implementação desejada, caso só queira chamar, basta referenciar o método getQuantidade.

luizlaljr

Então @Guto_Magalhaes, acredito que vc não percebeu, eu não coloquei o tipo do retorno do método getQuantidade na interface, pois em cada uma das classes filhas tem um retorno de tipo diferente.

Na classe filha ItemMercadoPorPeso o atributo quantidade é do tipo float e na classe filha ItemMercadoPorUnidade o atributo quantidade é do tipo int.

Desta forma, eu não consigo estipular um retorno, pois na hora de sobreescrever o método por um método com retorno diferente da interface, dá erro de compilação.

FacaNaCaveira

luizlaljr boa tarde, nao pensou em incluir na class o atributo peso? dai se for utilizar por peso utiliza esse atributo caso seja por quantidade utiliza o atributo quantidade. Pois ai sim vc teria quantidade como int e peso como float

luizlaljr

Caro @FacaNaCaveira, esta sua sugestão resolveria, porém acredito que não seja uma solução que faça uso do polimorfismo. E entendo uma classe que não use todos os seus métodos, mas imaginá-la, ora usando um atributo, ora usando o outro, me parece um desperdício.

javaflex

Não coloque a tecnologia na frente da necessidade.

FacaNaCaveira
Solucao aceita

luizlaljr boa noite, mas se considerarmos que peso eh uma unidade e quantidade é outra e que o poliformismo tem haver com os metodos que vc cria, as diferentes formas de saida, e não com um atributo de classe que hora eh int e hora eh float. Pesnsando dessa forma, poderia entao definir quantidade como float e quando fosse utilizar o medoto por peso utilizaria somente a parte inteira do atributo e no caso de peso seria o atributo por inteiro.

javaflex

Faz o que @FacaNaCaveira falou.

Nao complique só para forçar o uso de orientação a objetos. Você só precisa de uma classe ItemMercado. Inclusive não precisa de Interfaces, só está burocratizando pelo que mostrou. E por fim, trocaria de float para BigDecimal, pois float não tem precisão.

Guto_Magalhaes

Bom, então neste caso é simples de resolver. Caso você queira acessar o método pela interface, terá que colocar nela todos os getQuantidade que pretende utilizar, e deve void ou o tipo que você quer, como por exemplo:

public abstract void getQuantidade();

public abstract String getQuantidade();

public abstract Integer getQuantidade();

Caso não faça questão de acessar pela interface, mas pela classe concreta em si, então coloque o método getQuantidade na classe pai e sobrescreva nas classes filho através de herança, soluções é o que não falta. E tem ainda uma terceira opção, caso queira uma implementação padrão para o método da interface, a partir do java 8 já é possível criar implementação de métodos dentro da interface.

Criado 23 de janeiro de 2018
Ultima resposta 24 de jan. de 2018
Respostas 8
Participantes 4