Ajuda com a classe Cliente usando herança

Bom dia,

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?

pessoa fisica e juridica ao mesmo tempo? oO

pode ser uma ou outra
isso vai ser definido na hora do cadastro

vc pode cria uma opção que e ambos

combo tipo Pessoa
1 Juridica
2 Fisica
3 Ambos

Disso eu sei, o problema

esta no diagrama da aplicação
para obter os atributos Pessoa Fisica e Juridica

Para mim o mais simples em termos de herança/composição é:

PessoaFisica É Pessoa
PessoaJuridica É Pessoa

Cliente TEM-UM Pessoa

daí você monta cadastros separados de Pessoa e Cliente. No cadastro do Cliente você simplesmente informa o código da pessoa.

Mendes,

Pensei nisso ao optar por herança

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?

Sinceramente, eu prefiro usar composição.
É mais simples e menos problemática

esse seu modelo é bem mais fácil mesmo

mas no meu modelo você enxerga alguma solução?

[quote=tmvolpato]Mendes,

Pensei nisso ao optar por herança

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 …

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;

Plenamente possivel.

você apagou o código?

[quote=rmendes08][quote=tmvolpato]Mendes,

Pensei nisso ao optar por herança

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.

Perai, fui alterar e acabei apagando.
Já recoloco.

Mendes como eu disse ali em cima

ele pode ser os dois mas não ao mesmo tempo
essa decisão seria tomada no cadastro do cliente

Segue.

//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
}

[quote=tmvolpato]Mendes como eu disse ali em cima

ele pode ser os dois mas não ao mesmo tempo
essa decisão seria tomada no cadastro do cliente[/quote]

Você pode usar Generics na sua classe Cliente, assim você parametriza o tipo do Cliente:

class Cliente<T extends Pessoa>{
   private T pessoa;

   public T getPessoa(){
   }
}

[quote=rmendes08][quote=tmvolpato]Mendes como eu disse ali em cima

ele pode ser os dois mas não ao mesmo tempo
essa decisão seria tomada no cadastro do cliente[/quote]

Você pode usar Generics na sua classe Cliente, assim você parametriza o tipo do Cliente:

class Cliente<T extends Pessoa>{
   private T pessoa;

   public T getPessoa(){
   }
}

[/quote]

Dessa maneira

eu consigo indicar apenas uma classe Fisica ou Juridica dessa maneira certo?

Foi como ele disse la em cima eu precisaria de uma herança múltipla "Mas isso não existe em java"
para poder estender as duas classes.

é complicado esse assunto

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.

@Mendes,
estou implementando essa sua ideia de generics

@Machado

machado nesse seu modelo você consegue dizer tranquilamente que tipo é o cliente
na classe produto por exemplo