Olá a todos
Vamos por partes:
Toda PessoaFisica é uma Pessoa
Toda PessoaJuridica é uma Pessoa
Uma Pessoa não é uma PessoaJuridica ou PessoaFisica
Todo Cliente é uma Pessoa
Todo Cliente é uma PessoaFisica ou uma Pessoa Juridica
Todo Fornecedor é uma Pessoa
Todo Fornecedor é uma PessoaFisica ou PessoaJuridica
Uma PessoaJuridica pode ou nao ser um Cliente
Uma PessoaFisica pode ou nao ser um Cliente
Uma PessoaJuridica pode ou nao ser um Fornecedor
Uma PessoaFisica pode ou nao ser um Fornecedor
Baseado nestes dados fiz o seguinte
Criei uma interface IPessoa com os metodos exclusivos da pessoa (ex setNome)
Criei uma interface IPessoaJuridica que herda da interface IPessoa com os métodos exclusivos da PessoaJuridica (ex setCNPJ)
O mesmo com IPessoaFisica
Criei uma interface ICliente com os metodos do exclusivos de um cliente (ex setLimiteCredito)
Criei uma interface IFornecedor com os metodos exclusivos de um fornecedor (ex setContato)
Criei 4 interfaces :
IPessoaFisicaCliente extends IPessoaFisica,ICliente
IPessoaFisicaFornecedor extends IPessoaFisica,IFornecedor
IPessoaJuridicaCliente extends IPessoaJuridica,ICliente
IPessoaJuridicaFornecedor extends IPessoaJuridica,IFornecedor
Crei uma classe PessoaGeral que implementa as 4 interfaces anteriores
assim posso usar:
IPessoa p = new PessoaGeral(); //terei apenas os metodos do pessoa
IPessoaFisica p = new PessoaGeral(); //terei apenas os metodos do pessoa e Fisica
IPessoaJuridica p = new PessoaGeral(); //terei apenas os metodos do pessoa e Juridica
IPessoaFisicaCliente p = new PessoaGeral(); //terei os metodos do pessoa, do pessoafisica e do cliente
IPessoaFisicaFornecedor p = new PessoaGeral(); //terei os metodos do pessoa, do pessoafisica e do fornecedor
IPessoajuridicaCliente p = new PessoaGeral(); //terei os metodos do pessoa, do pessoajuridica e do cliente
IPessoajuridicaFornecedor p = new PessoaGeral(); //terei os metodos do pessoa, do pessoajuridica e do Fornecedor.
Assim posso implementar apenas um codigo em PessoaGeral e o codigo serve para todas as pessoas definidas.
Quanto a composição não vejo como uma pessoafisica, juridica, cliente ou fornecedor pode compor uma pessoa, acho que uma pessoa é uma pessoa juridica e assim seria herança mesmo. Um cliente é uma pessoa ou tem uma pessoa, ou uma pessoa é um cliente ou tem um cliente??
Até agora, apesar de ser um codigo esquisito, dentro da poo acho o de modelagem mais correta.
Ainda tem um erro que eu poderia colocar assim:
ICliente p = new Pessoa(); // Isso não seria correto porque para ser um cliente ele teria que ser pessoa fisica ou pessoa juridica e por consequencia uma pessoa.
Gostaria que verificassem a modelagem com carinho para me ajudar a encontrar falhas e manter dentro dos paradigmas da poo como ter reutilização de código. Neste caso tentei isso, o mesmo método setCpf serve para PessoaFisica, PessoaFisicaCliente, PessoaFisicaFornecedor, o método setNome serve para todos, o metodo setLimiteCredito serve para PessoaFisicaCliente e PessoaJuridicaFornecedor.
Aguardo comentarios