Duvida sobre Herança

9 respostas
S

Olá pessoal, estou com uma duvida, eu tenho 2 classes que herdam de Pessoa apenas o atributo nome, essas classes são PessoaFisica e PessoaJuridica, pessoa
fisica tem CPF e PessoaJuridica tem CNPJ, em um objeto Processo eu tenho uma variavel Pessoa, que pode ser tanto PessoaFisica ou PessoaJuridica no caso está assim =>

public class Processo {
Pessoa pessoa;
public Processo(Pessoa pessoa) {
this.pessoa = pessoa;
}
}

Só que no programa eu tenho uma condição que faz isso

if(juridico)
pessoa = new PessoaJuridica(nome, cnpj);
else
pessoa = new PessoaFisica(nome, cpf);

E depois eu crio um objeto processo

processo = new Processo(pessoa);

Depois, como eu pego o atributo cpf ou cnpj se no processo não tá especificado de que tipo é a pessoa? não estou conseguindo
desde já agradeço

9 Respostas

tnaires

Olá

Sugestão de design, livrando-se da herança - e livrando-se também do instanceof, que fatalmente você precisaria usar:
enum TipoPessoa {
    FISICA, JURIDICA;
}

class Pessoa {
    private String nome;
    private TipoPessoa tipo;
    private String cadastroNacional;
}
Dessa forma você pode colocar métodos de validação, formatação, e tudo o que for específico para o tipo da pessoa no enum.
marcosharbs

podes fazer um cast tipo:

Pessoa pessoa = new PessoaFisica(nome, cpf);
PessoaFisica pf = (PessoaFisica)pessoa;
pf.getCpf();
S
tnaires:
Olá Sugestão de design, livrando-se da herança - e livrando-se também do instanceof, que fatalmente você precisaria usar:
enum TipoPessoa {
    FISICA, JURIDICA;
}

class Pessoa {
    private String nome;
    private TipoPessoa tipo;
    private String cadastroNacional;
}
Dessa forma você pode colocar métodos de validação, formatação, e tudo o que for específico para o tipo da pessoa no enum.

Muito obrigado, não tinha pensado em usar enum para o caso, mas mesmo assim poderia explicar como eu queria fazer? Gosto de saber os metodos bons de fazer alguma coisa, mas para isso também gosto de conhecer os ruins para saber o motivo do desenvolvimento dessa solução de design obrigado!

wbdsjunior

a solução do amigo tnaires é melhor, mas outra solução seria criar uma interface Pessoa:

interface Pessoa {
    String getCadastroNacional();
}

class PessoaFisica implements Pessoa {
    String cpf;

    public PessoaFisica(String cpf) {
        this.cpf = cpf;
    }

    public String getCadastroNacional() {
        return cpf;
    }
}

class PessoaJuridica implements Pessoa {
    String cnjp;

    public PessoaJuridica(String cnpj) {
        this.cnpj = cnpj;
    }

    public String getCadastroNacional() {
        return cnjp;
    }
}

public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        Pessoa pessoa1 = new PessoaFisica("[CPF removido]");
        t.imprimeCadastroNacional(pessoa1);
        Pessoa pessoa2 = new PessoaJuridica("123.123.123/1234-12");
        t.imprimeCadastroNacional(pessoa2);
    }

    public void imprimeCadastroNacional(Pessoa pessoa) {
        System.out.println(pessoa.getCadastroNacional());
    }
}
wbdsjunior

marcosharbs:
podes fazer um cast tipo:

Pessoa pessoa = new PessoaFisica(nome, cpf); PessoaFisica pf = (PessoaFisica)pessoa; pf.getCpf();


mas como ele não sabe que tipo de pessoa recebeu por parâmetro, isso não funciona.

teria que ser algo como:

Pessoa pessoa = new PessoaFisica(nome, cpf);

if (pessoa instanceof PessoaFisica) {
    PessoaFisica pf = (PessoaFisica)pessoa;
    pf.getCpf();
}
tnaires

Como falei, você precisaria do instanceof para saber o tipo de pessoa que você está lidando. Observe o código do wbdsjunior no post anterior.

S

Como falei, você precisaria do instanceof para saber o tipo de pessoa que você está lidando. Observe o código do wbdsjunior no post anterior.

Muito obrigado, entendi sim, no caso eu estava usando herança em uma hora errada, já que pessoaFisica e pessoaJuridica são tipos, no caso a herança seria valida se eu criasse uma classe funcionario e extendesse ela a pessoa!
Aproveitando o tópico alguem tem alguma indicação de livro ou material sobre padrões de projeto, design e afins? Sou novo em OO e as vezes me pego com essas duvidas! Obrigado!

S

Outra duvida no enum eu crio metodos de set e get do cadastro nacional? e depois atribuo ele a variavel no objeto pessoa?

tnaires
Santhell:
Aproveitando o tópico alguem tem alguma indicação de livro ou material sobre padrões de projeto, design e afins? Sou novo em OO e as vezes me pego com essas duvidas! Obrigado!
A referência na área é o livro da gangue dos quatro: http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/[telefone removido]/ref=sr_1_1?ie=UTF8&s=books&qid=[telefone removido]&sr=8-1

Porém eu achei o livro Head First Design Patterns mais digerível:
http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/[telefone removido]/ref=sr_1_2?ie=UTF8&s=books&qid=[telefone removido]&sr=8-2

Mas antes de começar a estudar padrões de projeto, estude Java e orientação a objetos em si.
Santhell:
Outra duvida no enum eu crio metodos de set e get do cadastro nacional? e depois atribuo ele a variavel no objeto pessoa?
Não, o setter e o getter você cria na classe Pessoa mesmo, pois é lá que fica o atributo cadastroNacional. No enum você cria métodos específicos para o tipo da pessoa. Por exemplo, se você quiser inserir código para validar um CPF ou um CNPJ:
public enum TipoPessoa {
    FISICA {
        boolean validar(String cadastroNacional) {
            // Retorna false se o CPF for inválido
        }
    },
    JURIDICA {
        boolean validar(String cadastroNacional) {
            // Retorna false se o CNPJ for inválido
        }
    };

    abstract boolean validar(String cadastroNacional);
}
E na classe Pessoa você cria um método que apenas delega a validação para o enum:
public class Pessoa {
    // Definições mostradas anteriormente

    public boolean validar(String cadastroNacional) {
        return this.tipoPessoa.validar(cadastroNacional);
    }
}
Criado 7 de outubro de 2009
Ultima resposta 8 de out. de 2009
Respostas 9
Participantes 4