Duvida sobre Interface e Abstract class

2 respostas
fcmorini

Surgiu uma grande duvida…
estou implementando um aplicativo onde vou usar herança e polimorfismo…
então aconteceu o seguinte…
tenho uma interface pessoa…

public interface IPessoa {
    public long getId();
    public void setId(long id);
    public String getNome();
    public void setNome(String nome);
    public Endereco getEndereco();
    public void setEndereco(Endereco endereco);
    public List<IContato> getContato();
    public void setContato(IContato contato);
    public String getDescricao();
    public void setDescricao(String descricao);
}

e tambem mais duas classes abstratas APessoaFisica e APessoaJuridica…
ai veio o problema pois essas classes extendi de IPessoa e agora terei que implementar os metodos na classe abstrata…
porem as classes concretas funcionario, cliente e fornecedor irão extender das classes abstratas e os metodos estão implementados nas ABSTRACTS…
gostaria de saber se é possivel tornar IPessoa em APessoa (classe abstrata) e as abstratas em interfaces para que os metodos sejam implementados
nas classes concretas… ISSO SERIA UM ERRO DE MODELAGEM…

public class APessoaFisica implements IPessoa {
    
    public long getId() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setId(long id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getNome() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setNome(String nome) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Endereco getEndereco() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setEndereco(Endereco endereco) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<IContato> getContato() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setContato(IContato contato) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getDescricao() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void setDescricao(String descricao) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

2 Respostas

davidbuzatto

Bem, eu não concordo com a forma que vc está fazendo as coisas.

Interfaces são usadas para vc fornecer um contrato para a implementação subjacente ou então atribuir um comportamento (Comparable, Serializable, Cloneable, etc) às classes.
Classes abstratas são usadas como modelos, que fornecem, ou não, um contrato parcial para as classes que as implementam. Uma característica de uma classes abstrata é ela não poder ser instanciada.

Enfim, o que eu faria no seu caso é. Teria Pessoa como classe abstrata, pois vc não vai instanciar pessoas, mas nessa classe vc pode ter alguma implementação para atribuição de atributos comuns a Pessoa Jurídia e Física, como endereço por exemplo.
Usaria então duas classes concretas, PessoaFisica e PessoaJuridica, que extendem Pessoa e que fornecem implementação para coisas específicas, como CPF para Física e CNPJ para Jurídica.

Não concordo em fazer uma hierarquia tão profunda para um problema que pode ser resolvido de forma muito mais simples.

[]´s

fcmorini

saquei…
eu sou pessimo em modelagem, e to iniciando em java…
MAS EU TENHO VONTADE E GOSTO MUITO DE PROGRAMAÇÃO!!!
obrigado pela força… tenho que lembrar sempre!!!
designPatterns “KISS”…
tenho tendencia a complexar por falta de experiencia!!!

Criado 24 de outubro de 2009
Ultima resposta 24 de out. de 2009
Respostas 2
Participantes 2