Classe - herança ou atributo

ola pessoal

sei que o java nao aceita herança multipla, entao fiquei meio que na dúvida.

eu tenho a classe pessoaFisica que herda pessoa, ate ai tudo bem
agora vou ter a classe Funcionario, que vai ter os dados de PessoaFisica e Departamento.
a duvida é,
na hora de criar a classe Funcionario
1-herdo os dados de PessoaFisica e coloco Departamento como um atributo
2-coloco PessoaFisica e Departamento como atributo.

eu acho o 1 caso mais correto, porem, queria a opiniao de vcs

abs
T+

Bem, depende do negócio:

  1. cada pessoa está necessariamente alocada num departamento?
  • se cada pessoa está num departamento, é melhor colocar o departamento como atributo, do meu ponto de vista.
  1. o que mais teria esse departamento?
  2. já pensou em usar um banco de dados e fazer essa alocação no banco?
  • daí, qdo vc precisasse dos dados, era só fazer um jogo de consultas no BD para encontrar o resultado.

Abraços

A classe funcionário herdaria de Departamento? Isso significaria que Funcionario é uma especialização de Departamento, acha isso correto?
Como é o relacionamento? Um funcionário está alocado em um departamento? Se for assim, vai ser um atributo.
Seu Funcionario vai ser uma especialização de PessoaFisica? Você precisa de dados de pessoa física para seu funcionário? Então é.

Veja bem,

É importante primeiramente entender qual a necessidade de criar uma classe funcionário e uma classe pessoa física:

Em algum momento haverá um cadastro ou algo do genero onde você vai precisar reaproveitar os dados de somente pessoa física? se sim bom ai temos que manter como está feito e buscar uma solução, porém talvez você não precise criar estas duas classes, e a classe PessoaFisica poderia se juntar com a classe Funcionario tornando-se uma única classe onde teria todos os dados de pessoa física e mais os dados de departamento, eu particularmente não consigo ver um caso em que seja diferente disso.

Acredito que a melhor solução é esta e o problema está na sua modelagem das classes.

:smiley:

bem vou tentar explicar melhor
bem, minhas classe

public class Pessoa  implements Serializable {

	private static final long serialVersionUID = 1094580938504398L;
	private int 			id;
    private String 			nome 			= "";
	private CpfCnpj 		documento 		= new CpfCnpj();
    private Date 			nascimento;
.....
}

public class PessoaFisica extends Pessoa {

	private static final long serialVersionUID = 10945832438504390L;
	private String rg;
	private EstadoCivil estadoCivil;
    private Escolaridade escolaridade;
    private CursoSuperior cursoSuperior;
    private Profissao profissao;
    private Sexo sexo;
....
}

tenho este exemplo pra ficar mais facil
Pessoa<-PessoaFisica = significa que PessoaFisica herda pessoa

Pessoa<-PessoaFisica<-Funcionario

a classe Funcionario e Departamento eu ainda nao criei, porem, ela vai ter o atributo Departamento, id, salario por exemplo
e os mesmo dados de PessoaFisica Funcionario deve ter, por isso pensei da heranca.
e como Funcionario tem que pertencer a um departamento, eu pensei em Departamento como atributo

abs
T+

Oi Krusst,

Coisas que percebi:

  1. Na classe Pessoa vc tem um atributo documento que é do tipo CpfCnpj, isso tá estranho porque vc tem uma classe que descreve 2 coisas ao mesmo tempo.

  2. Na classe PessoaFisica tem o atributo sexo. Tá dando a impressão que só quando a pessoa se torna pessoa física é que ela ganha um sexo. Talvez fosse melhor vc mover esse atributo para a classe Pessoa.

  3. As relações das classes tambem não parece bacana.

  4. Talvez essa classe PessoaFisica não deva existir, e se existir talvez deva exisitir tambem a classe PessoaJuridica. Temos que pensar nisso.

Sugestão.

a) Monte as classes Pessoa, PessoaFisica, Funcionario, Departamento ( se já montou blz).

b) Associe Pessoa à PessoaFisica (se exisitir), associe Pessoa a PessoaJuridicia (se existir), associe a classe Pessoa ou PessoaJuridica (verificar o contexto) à classe Departamento.

P.S. A classe Pessoa deixou de ser super classe para dimiuir o acoplamento (pesquinar no google e no guj sobre o assunto herança vrs agregação).

Sei que faltou alguns detalhes mas acho que isso vai colocar o papo em uma direção mais interessante.

[]s

extends is evil.

Sempre prefira composição (colocar um atributo para fazer o serviço). Só use herança quando ou não restar outra saída, ou você tiver a mais completa, total e absoluta certeza que deve fazer isso.

Aliás, recentemente o James Gosling disse que se pudesse voltar na época que ele estava começando o java, ele teria retirado a herança. Herança normalmente acaba criando mais problemas do que resolvendo.

vamos la
fantomas

1-sim pode ser os 2, estou usando um jar onde ele ja tem todos os tipos de validacoes e conversoes brasileiras, agora nao me recordo o nome mas depois eu posto aqui, e documento é uma atributo mais generico mesmo, pra guardar CPF ou CPNJ, a principio, eu ir criar uma classe Documentos e adiconar uma lista de Documentos como atributo, para guartar todos os tipos de documentos(cpf,cnpj, RG, IM,IR e outros que possam ser solicitados so sistema, mas como o cliente disse que nao necessita de outros eu deixei desta forma)
2-sim sexo é uma atributo de pessoa fisica, e so pessoa fisica tem sexo
3-por que nao parece bacana?
4-sim, pessoa juridica existe, porem, nao coloquei no exemplo para simplificar

sobre “herança vrs agregação” ja vou dar uma olhada no google

victorwss

bem, isso eu nunca tinha escutado, tem algum artigo falando do pq a herança ser tao demoniaca?

obrigado a todos

abs
T+

[quote=victorwss]extends is evil.

Sempre prefira composição (colocar um atributo para fazer o serviço). Só use herança quando ou não restar outra saída, ou você tiver a mais completa, total e absoluta certeza que deve fazer isso.

Aliás, recentemente o James Gosling disse que se pudesse voltar na época que ele estava começando o java, ele teria retirado a herança. Herança normalmente acaba criando mais problemas do que resolvendo.[/quote]

achei esse artigo

http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/herancavscomposicao.htm

oq acha da ideia de abrir um post sobre isso para um discução mais especifica?

abs
T+

[quote=krusst] 1-sim pode ser os 2, estou usando um jar onde ele ja tem todos os tipos de validacoes e conversoes brasileiras, agora nao me recordo o nome mas depois eu posto aqui, e documento é uma atributo mais generico mesmo, pra guardar CPF ou CPNJ, a principio, eu ir criar uma classe Documentos e adiconar uma lista de Documentos como atributo, para guartar todos os tipos de documentos(cpf,cnpj, RG, IM,IR e outros que possam ser solicitados so sistema, mas como o cliente disse que nao necessita de outros eu deixei desta forma)
2-sim sexo é uma atributo de pessoa fisica, e so pessoa fisica tem sexo
3-por que nao parece bacana?
4-sim, pessoa juridica existe, porem, nao coloquei no exemplo para simplificar [/quote]

Foco em seus pontos:

  1. Entendi, mas…eu acho estranho classes com esses nomes CpfCnpj, dá a impressão de que tem algo errado (tipo algo que faz tudo), talvez uma interface, enum etc… pudesse deixar mais orientado a objeto.
  2. Verdade rsrsrsrs.
  3. As associações entre as classes não me pareceu boas, acheia associação melhor que herança na classe PessoaFisica NESTE SEU CASO.
  4. Deveria ter colocado porque esse tema é recorrente e a classe PessoaJuridica sempre está presente, não que tenha que estar é claro.

Acho que já tem topico(s) sobre o assunto aqui no guj dá uma olhada rápida antes.

flws