Eu sei que esse assunto já foi discutido em outros tópicos, mas não existe uma definição clara a ser tomada diante desse assunto
varia conforme a necessidade da aplicação
Preciso de um nível de abstração alto, para a classe Cliente
a aplicação está dessa maneira abaixo, estou usando Herança JOINED e separei PessoaFisica de PessoaJuridica
não vou usar essas 2 duas classes apenas para Cliente usarei em outras tbm por isso resolvi separar dessa maneira
mas o Cliente pode ser os 2 (ai que complica )como posso tratar isso, sem mexer na minha aplicação?
Camarada, não enxergo. Primeiro que esta regra de um cliente poder ser PJ e PF está, no MEU ponto de vista, errada.
Afinal, o cadastro será feito por CPF/CNPJ, não? Um PF associado a um CPF, um PJ a um CNPJ.
Além do mais, um Cliente podendo ser PJ e PF ao mesmo tempo, requeriria herança múltipla. Inexiste no java.
Há meios sim, de se obter um objeto filho a partir de uma instância da classe Pai, utilizando cast
Pessoa p = new PessoaFisica();
PessoaFisica pf = (PessoaFisica) p;
mas o problema surgiu por que Cliente pode ser Fisica e Juridica
e meus atributos estão nessas classes que são (SuperClasses) e se eu estender Pessoa eu não tenho como obter esses atributos
tem como implementar a Classe Cliente nesse modelo que estou usando hoje?
[/quote]
Cara, me dê um exemplo de um Cliente que pode ser Pessoa Física e Jurídica ao mesmo tempo, sério mesmo, gostaria de entender isso …[/quote]
++
Como eu disse, há um problema de lógica nesta afirmação. Até onde sei, um Cliente É PJ ou PF, onde o OU é exclusivo.
//Pessoa
public class Pessoa{
private Long codigo;
private String nome;
private Collection<Endereco> enderecos;
private Collection<Telefone> telefones
//getters e setters
}
//IPessoa -- não use I antes de uma interface, neste caso, é um exemplo apenas.
public interface IPessoa{
public void setPessoa(Pessoa pessoa);
public Pessoa getPessoa();
public void setCadFederal(String cadFederal);
public String getCadFederal();
public void setCadEstadual(String cadEstadual);
public String getCadEstadual();
public void setRenda(Double renda);
public Double getRenda();
}
//PessoaFisica
public class PessoaFisica implements IPessoa{
private Pessoa pessoa;
private String cpf;
private String rg;
private Double renda;
//implementações
public void setPessoa(Pessoa pessoa){
this.pessoa = pessoa;
}
public Pessoa getPessoa(){
return this.pessoa;
}
public void setCadFederal(String cadFederal){
this.cpf = cadFederal;
}
public String getCadFederal(){
return this.cpf;
}
public void setCadEstadual(String cadEstadual){
this.rg = cadEstadual;
}
public String getCadEstadual(){
return this.rg;
}
public void setRenda(Double renda){
this.renda = renda;
}
public Double getRenda(){
return this.renda;
}
}
//PessoaFisica
public class PessoaJuridica implements IPessoa{
private Pessoa pessoa;
private String cnpj;
private String inscEst;
private Double renda;
//implementações
public void setPessoa(Pessoa pessoa){
this.pessoa = pessoa;
}
public Pessoa getPessoa(){
return this.pessoa;
}
public void setCadFederal(String cadFederal){
this.cnpj = cadFederal;
}
public String getCadFederal(){
return this.cnpj;
}
public void setCadEstadual(String cadEstadual){
this.inscEst = cadEstadual;
}
public String getCadEstadual(){
return this.inscEst;
}
public void setRenda(Double renda){
this.renda = renda;
}
public Double getRenda(){
return this.renda;
}
}
Apenas uma idéia.
Ah, e o Cliente terá uma propriedade IPessoa
//Cliente
public class Cliente{
private IPessoa iPessoa;//pode receber PessoaJuridica ou PessoaFisica
//demais atributos
//getters e setters
}
Complicado por que você está vendo assim.
Como o rmendes indicou, a utilização de generics permitirá que apenas a instância da classe adequada, PF ou PJ seja utilizada.
Isso poderá ser definido no momento do cadastro e alterado psoteriormente, sem maiores problemas.