Olá, li muitos tópicos sobre essa questão da PF e PJ (e herança em geral) aqui no GUJ e em outro lugares… Mas ainda me resta algumas dúvidas que não vi respostas que sejam consideradas “elegantes”. =)
De acordo com o que eu li, eu estou usando o padrão Strategy. Está ficando assim:
Tenho as classes Vendedor e Cliente.
Tenho a interface Pessoa que vai ser um atributo de Vendedor e Cliente.
Tenho as classes PessoaFisica e PessoaJuridica (Pessoa vai referenciar uma PF ou PJ).
Abaixo uma implementação básica delas para poder tirar minhas dúvidas.
public interface Pessoa {
public String tipo(); // retornar se pessoa é jurídica ou física
//outros métodos necessários
}
[code]public class Cliente {
private int id;
private String nome;
private Pessoa p;
// gets e sets
}
// Vendedor no mesmo padrão de classe do Cliente
[/code]
[code]public class PessoaJuridica implements Pessoa {
private String nomeFantasia;
private String cnpj;
private String ie;
private String dataFundacao;
// gets e sets
public PessoaJuridica(String nomeFantasia, String cnpj, String ie, String dataFundacao) {
this.nomeFantasia = nomeFantasia;
this.cnpj = cnpj;
this.ie = ie;
this.dataFundacao = dataFundacao;
}
public String tipo(){
return "Pessoa Jurídica";
}
}[/code]
[code]public class PessoaFisica implements Pessoa {
private String cpf;
private String rg;
private String sexo;
private String dataNascimento;
// gets e sets
public PessoaFisica(String cpf, String rg, String sexo, String dataNascimento) {
this.dataNascimento = dataNascimento;
this.sexo = sexo;
this.cpf = cpf;
this.rg = rg;
}
public String tipo(){
return "Pessoa Física";
}
}[/code]
Se eu for instanciar um Cliente PF e um PJ seria assim:
[code]//…
Cliente cPF = new Cliente(1, “Maria”, new PessoaFisica(“123”, “456”, “F”, “01/01/1990”));
Cliente cPJ = new Cliente(1, "Pao com Ovo LTDA", new PessoaJuridica("PCO", "456789", "45678", "01/01/1994"));
//…[/code]
Bom, é o seguinte, se eu quiser saber o tipo de pessoa que meu cliente é só usar “cPF.getP().tipo();”. Mas se eu quiser recuperar os atributos que são específicos de PF?
Usaria cast? Ex.: ((PessoaFisica) cPF.getP()).getCPF();
Qual forma você acham mais “elegante”?
E no caso de métodos que fazem alterações no banco (seja update, insert, etc…)? Pois no meu caso o banco será representado por duas tabelas (ClientePF e ClientePJ), mas acho que não mudaria mesmo que fosse três). Pois os dados que serão armazenados e uma possível validação seria diferente no caso de um UPDATE em PF e PJ.
Seria melhor eu colocar esses métodos na interface Pessoa e implementá-los nas Classes PessoaJurida e PessoaFisica? Ex.:
public interface Pessoa {
public String tipo(); // retornar se pessoa é jurídica ou física
public boolean salvar(Cliente cliente);
//outros métodos necessários
}
// salvando...
cPF.getP().salvar(cPF);
//...
E então? Seria uma solução aceitável? Teria uma melhor opção? Talvez uma melhor modelagem para este caso?
Desde já o meu Muito Obrigado! Abraço!