estudando pra certificacao pelo site javaranch, vi alguns testes que
mostravam situacoes como:
classe Pai ; classe Filho extends Pai
Pai p = new Filho();
pra que eu vou usar isso ???
alguem sabe alguma aplicacao pratica disso ae
estudando pra certificacao pelo site javaranch, vi alguns testes que
mostravam situacoes como:
classe Pai ; classe Filho extends Pai
Pai p = new Filho();
pra que eu vou usar isso ???
alguem sabe alguma aplicacao pratica disso ae
Uhm, separar interface da implementacao, uma das boas praticas da programacao orientada a objetos?
List<Usuario> usuarios = new LinkedList<Usuario>();
voce nao corre o risco de chamar metodos especificos da implementacao (como removeFirst nesse caso), assim na hora que mudar de implementacao, pra uma outra list, nao vai ter de tocar mais em nada
List<Usuario> usuarios = new ArrayList<Usuario>();
desculpe a burrice mas voce teria mais exemplos alem desses do List?
valeu
Eh o tal do “Program to an interface, not an implementation”.
http://www.javapractices.com/Topic123.cjp
Rafael
Tá eu devo programar pra Interfaces e nao classes concretas, mas qual a utilidade de instaciar um objeto desse jeito: Pai p = new Filho()?
[quote=pestinha]
Tá eu devo programar pra Interfaces e nao classes concretas, mas qual a utilidade de instaciar um objeto desse jeito: Pai p = new Filho()?[/quote]
Vc não fica preso aos métodos da classe Filho, vc usa os métodos da classe Pai
Se um dia vc precisar fazer algo como: Pai p = new Neto()
não precisará alterar mais anda no código.
Uma das utilidades da herança é polimorfismo.
Ex:
class Funcionario
{
public float salario() { return 500; }
}
class FuncionarioAdm extends Funcionario
{
public float salario() { return 1000; }
}
class FuncionarioFabrica extends Funcionario
{
public float salario() { return super.salario(); }
}
class GerenteAdm extends FuncionarioAdm
{
public float salario() { return super.salario() * 2; }
}
public float calculaBonus(Funcionario funcionario)
{
return funcionario.salario() * 0,1;
}
float bonusGerente = calculaBonus(new GerenteAdm());
float bonusAdm= calculaBonus(new FuncionarioAdm());
É um exemplo simples.
Mas o polimorfismo é isso.
Eu tenho muitas implementações para o mesmo método.
Repare que na funcção calcular bonus eu passo apenas o funcionario.
A implementação é que irá fornecer o valor.
Se um dia eu queiser exer no bonus só do Gerente eu mexo só lá.
Então o que interessa não é na realidade que se eu fizer:
Pai p = new Filho();
o objeto p pode usar só os métodos de Pai e não de Filho,
e sim a flexibilidade de existir uma rotina:
public class Pai { int anosTrabalhados=30; }
public class Filho extends Pai { int anosTrabalhados=20; }
public class Neto extends Filho { int anosTrabalhados=10; }
public class Bisneto extends Neto { int anosTrabalhados=1; }
public class Teste {
public int calculaAnoAposentadoria(Pai algumPai)
{
Date hoje=new Date();
return diferencaEmAnos(hoje,algumPai.getAnosTrabalhados());
}
}
Aí eu posso passar um Pai, Filho, Neto , Bisneto (cada um com sua
quantidade de anos trabalhados) que essa rotina vai calcular
pra mim o ano da aposentadoria.
Mais tarde se eu quiser adicionar Tio ou Sobrinho nessa hierarquia posso usar essa mesma rotina.
Pai p = new Pai();
Filho f = new Filho();
Neto n = new Neto();
Bisneto b = new Bisneto();
int AnoDeAposentadoriaDoMeuPai = calculaAnoAposentadoria(p);
int AnoDeAposentadoriaDoMeuFilho = calculaAnoAposentadoria(f);
int AnoDeAposentadoriaDoMeuNeto = calculaAnoAposentadoria(n);
int AnoDeAposentadoriaDoMeuBisneto = calculaAnoAposentadoria(b);
É essa a idéia?
Exato
So tome o cuidado de entender que nao eh soh de heranca que se faz polimorfismo - alias, uma das maiores pisadas de bola quando a gente ta comecando eh usar heranca pra “economizar codigo” em outras classes. Fica esperto pra entender o pq de nao fazer isso, e ta tranquilo
Como o pessoal disse uma funcção interessante também está em separar a interface da implementação e isso não necessariamente reprsenta uma hierarquia.
ex:
abstract class Mensagem
{
public static final Mensagem obterMensagem()
{
return new MensagemSMS():
}
public abstract void enviar();
}
class MensagemSMS extends Mensagem
{
public void enviar()
{
// envia SMS
}
}
class MensagemEmail extends Mensagem
{
public void enviar()
{
// envia EMAIL
}
}
Mensagem mensagem = Mensagem.obterMensagem();
mensagem.enviar();
Veja que para o sistema eu estou enviando mensagem, não importa como.
Atualmente ele envia por SMS, se eu precisar mudar para email fica mais fácil.
Esse exemplo do site do Prof. Jacques é bem interessante, e mostra a aplicação do polimorfismo em interfaces:
// Como queremos usar o resultado final que contruiremos num servlet:
ComponenteDeSelecao cds =
new ComponenteDeSelecao(umaColeçãoDeAlunos, "João");
response.out.println(cds.geraListBox());
cds = new ComponenteDeSelecao(umaColeçãoDeDisciplinas, "Programação");
response.out.println(cds.geraListBox());
// interfaces
interface SelecionavelPorNome {
Iterator getIteradorPorNome(String nome);
}
interface Nomeavel {
String getNome();
}
class ColecaoDeAlunos implements SelecionavelPorNome {
// ...
Iterator getIteradorPorNome(String nome) {
// ...
}
}
class Aluno implements Nomeavel {
// ...
String getNome() { ... }
}
class ColeCAoDeProfessores implements SelecionAvelPorNome {
// ...
Iterator getIteradorPorNome(String nome) {
// ...
}
}
class Professor implements Nomeavel {
// ...
String getNome() { ... }
}
class ColecaoDeDisciplinas implements SelecionavelPorNome {
// ...
Iterator getIteradorPorNome(String nome) {
// ...
}
}
class Disciplina implements Nomeavel {
// ...
String getNome() { ... }
}
class ComponenteDeSelecao {
Iterator it;
// observe o tipo do parâmetro (uma interface)
public ComponenteDeSelecao(SelecionavelPorNome coleção, String nome) {
it = coleção.getIteradorPorNome(nome); // chamada polimórfica
}
// ...
String geraListBox() {
StringBuffer resposta = new StringBuffer();
resposta.append("<select name=\"nome\" size=\"1\">");
while(it.hasNext()) {
int i = 1;
// observe o tipo do objeto
Nomeavel obj = (Nomeavel)it.next();
resposta.append("<option value=\"escolha" + i + "\">" +
obj.getNome() + // chamada polimórfica
"</option>");
}
resposta.append("</select>");
return resposta.toString();
}
}
blz valeu!!! :thumbup:
[quote=cv]Exato
So tome o cuidado de entender que nao eh soh de heranca que se faz polimorfismo - alias, uma das maiores pisadas de bola quando a gente ta comecando eh usar heranca pra “economizar codigo” em outras classes. Fica esperto pra entender o pq de nao fazer isso, e ta tranquilo ;)[/quote]
essa frase do cv falou tudo.
quando o pessoal aprender OO (estou facilmente incluido) sai achando que heranca eh o que ha pelo simples fato de ganhar toneladas de codigo da classe mae… bons tempos em 2000 quando eu estendia HashMap e teimava com o Tiago Silveira que era supimpa
Depende muito.
Se vc necessita de uma HashMap personalizada é útil…
Cara tudo depende da sua necessidade…
Talvez o problema que tenha gerado a sua dúvida tenha sido o próprio exemplo.
Realmente não é em qualquer caso que você desejaria misturar os conceitos de pai e filho. Para que essa herança faça sentido, é necessário que todo filho seja um pai também. O que nem sempre é verdade.
Se algum filho pode não ser pai, a herança colocada no exemplo está errada.
O exemplo de Funcionário ilustra melhor o conceito de herança, já que um FuncionarioAdm, um FuncionarioFabrica e um GerenteAdm sempre são funcionários.
Abraço.