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!!!
-
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).
-
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 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<? extends Role> 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