Dúvida Sobre como Implementar Herança

Estou implementando um pequeno trabalho e me deparei com uma situação onde não sei como deve ser feito.
Tenho uma classe Pessoa e duas classes que herdam dela (cliente e funcionário).
Em meu trabalho prevê que um funcionário pode ser um cliente. Como implento isso? Imaginei que era apenas instanciar a classe cliente.

Mas bah tche, isso esse assunto da mais voltas que bolacha em boca de velha!!!

  1. Acho que esse seria o caso onde vc deveria optar por composição ao inves de herança SE vc não precisa de polimorfismo (vai passar o objeto cliente como sendo funcionario ou vice versa).

  2. Se vc precisa MESMO, crie 2 interfaces, uma Cliente e outra Funcionario. Mas isso tem um um jeitão de ser gambiarra em alguns momentos;

Fala milan, tbm sou de Vargem :smiley: Será que te conheço?

Então, se vc precisa mesmo usar herança, vc pode criar interfaces com o amigo acima. Eu resolveria assim:

[code]
// abstrata se Pessoa não for ser instanciada e tiver algum método
// com implementação. Se não tiver implementação vc pode usar uma interface (ou manter a classe abstrata)
public abstract class Pessoa {
}

// extends se Pessoa for classe, implements se Pessoa for interface
public class Cliente extends Pessoa {
}

// além de ser funcionário, ele é tbm um cliente
public class Funcionario extends Cliente {
}[/code]

Até mais!

[code]public class Pessoa{
private string nome;
private Date nascimento;

}

public class Funcionario{
private Pessoa pessoa;
private Date admissao;
}

public class Cliente{
private Pessoa pessoa;
private int codigo;
private boolean ativo;
}[/code]

Qual a vantagem? Vc trata um CLIENTE como CLIENTE. Ele pode ser funcionario, mendigo ou guarda de transito. Pense a respeito, talvez possa ser possível.

Sei lá… Não gostei dessa abordagem… Ainda acho mais vantajoso e lógico usar herança ao invés de composição, mas “cada louco com sua mania” hehehe

Até mais!

[quote=milan]Estou implementando um pequeno trabalho e me deparei com uma situação onde não sei como deve ser feito.
Tenho uma classe Pessoa e duas classes que herdam dela (cliente e funcionário).
Em meu trabalho prevê que um funcionário pode ser um cliente. Como implento isso? Imaginei que era apenas instanciar a classe cliente.[/quote]

Existe uma grande diferença entre "pode ser" e "é".
Se um funcionario é sempre um cliente, então a herança de fucnionario com cliente é a solução, mas como funcionario pode não ser um cliente a herança não cumpre seu papel. Tem que ser possivel fazer coisas como "se funcionario f é cliente então…"

Se Funcionario é uma classe e Cliente é outra, um Funcionario que é cliente será ambas - ao mesmo tempo - e portanto terá que haver uma classe FuncionarioCliente … ups, mas java não tem herança multipla… então o jeito é fazer funcionario uma interface e cliente outra e funcionariocliente outra que herda as duas.

Mas isto é meio… digamos… chato. Porque se de repente um funcionario pode ser um fornecedor, e um vendedor e um administrador e um regente… e - deus nos livre - um cliente vendedor e gerente é um rolo.

Podemos pensar de outra forma. Um funcionario é uma entidade ou um papel que um entidade desempenha no sistema. Em outras palavras qual é a superclasse de funcionario ? Pessoa ? E a de cliente ?
Pessoa é uma entidade , mas funcionario e cliente são papeis que ela desempenha numa determinada prespectiva. Uma pessoa num sistema pode sesenpenhar vários papeis. Ser Fornecedor eCleitne simultaneamente é um clássico.
A regra é então criar uma forma de saber qual(ais) o(s) papel(eis) da pessoa num certo contexto. A Pessoa não é um funcionario, ela tem o papel de funcionário. Portanto, como é um caso de "TEM-UM" e não um caso de "É-UM" fica mais facil Funcionário não é um cliente. Funcionário é uma pessoa que desempenha tb o papel de cliente


//um ator é uma entidade que desempenha papeis
interface Actor{

public boolean hasRole (Class&lt? extends Role&gt r)

public <T> inRoleOf(Class<T> r)

}

interface Role {} // marcador

class Pessoa implements Actor{

nome, 
datanascimento, 
...

}

interface Funcionario extends Actor, Role{

String funcionarioID()
}

interface Cliente extends Actor,Role{

String clienteID()
}


// uso 

Pessoa p = new Pessoa ("Joao" , Date.day(12,10,1986))
// a pessoa é um funcionario ?
if (p.hasRole(Funcionario.class)){
 Funcionario f = p.inRoleOf(Funcionario.class)
 System.out.print(f.funcionarioID());

  // se o funcionario é tb um cliente
 if (f.hasRole(Cliente.class)){
        System.out.print(f.clienteID());
 }
}

Herança é normalmente algo muito forte e só pode ser usado quando uma coisa É outra. Mas É outra todo o tempo, sem exceções. Mecanismos de Associação / Relacionamento , facilmente pode “deixar de existir” e portanto são mais flexiveis

Obrigado pela ajuda. A minha dúvida era qual solução usar (Interface ou Herança). Esse assunto é bem polêmico… parece mais claro utilizar Interface.

Muito Obrigado