Baixe o app para aproveitar ainda mais
Prévia do material em texto
HERANÇA Thaís Alves Burity Rocha Agenda Herança Múltipla Modificador protected Classe Object Composição Boas práticas de programação OO Exercícios Herança Múltipla Em Java, uma classe pode estender apenas uma superclasse diretamente Herança simples Outras linguagens OO permitem que uma classe estenda mais de uma superclasse diretamente Herança múltipla Exemplo: Conta Poupanca ContaBonificada OvíparoMamífero Ornitorrinco Herança Múltipla No geral, parece vantajoso, pois maximiza a capacidade de reuso Mas pode causar problema de ambiguidade Exemplo Duas classes implementam o mesmo método Se uma subclasse herdar de ambas, herdará ambos os métodos Ao chamar o método, qual versão será utilizada? Modificador de Acesso protected Atributos e métodos definidos com o modificador protected podem ser acessados: Na classe em que foram declarados Nas subclasses de classes em que foram declarados Em classes no mesmo pacote da classe em que foram declarados Em síntese: protected = default + subclasses Modificador de Acesso protected package pacoteA; public class ClassA { protected int valor; } package pacoteB; import pacoteA.ClassA; public class ClassB extends ClassA{ public void copiar(){ int x = this.valor; } } package pacoteB; public class ClassC { public void copiar(){ ClassB b = new ClassB(); int x = b.valor;} } package pacoteA; public class ClassD { public void copiar(){ ClassA a = new ClassA(); int x = a.valor;} } Classe Object Toda classe em Java é subclasse de Object (java.lang.Object) Principais métodos (para a disciplina) equals() toString() Esses métodos devem ser sobrescritos Vamos estudá-los para entender melhor sobre herança (e conceitos relacionados) Classe Object: Método equals() Assinatura: public boolean equals(Object obj) Sinaliza se dois objetos são semânticamente equivalentes Se não for sobrescrito, se comporta de maneira equivalente ao operador == Classe Object: Método equals() public class Conta { private String numero; private double saldo; private Cliente cliente; ... public boolean equals(Object obj){ if(obj instanceof Conta){ Conta conta2 = (Conta)obj; if( numero.equals(conta2.getNumero()) ){ return true; } } return false; } } Classe Object: Método toString() Assinatura: public String toString() Retorna uma representação em String do objeto Quando não é sobrescrito, gera um “código” <Nome da classe do objeto>@<representação em hexadecimal do hash code do objeto> public class Cliente{ private String nome; private String cpf; ... public String toString(){ return "Nome: " + nome + "CPF: " + cpf; } } Composição Herança não é a única forma de reutilizar classes Composição (ou Delegação) Conta possui um atributo do tipo Cliente Cliente possui um atributo do tipo Endereco Cada classe tem sua responsabilidade e é usada por outra classe Relacionamento TEM-UM (HAS-A) Boas Práticas de Programação OO Considere usar herança quando tiver um comportamento compartilhado entre várias classes creditar(), debitar() e transferir() são comportamentos comuns à toda conta Não use herança se a subclasse e a superclasse não passarem no teste É-UM Chá É-UMA Bebida (OK) Bebida É-UM Chá (ERRADO) Boas Práticas de Programação OO Não use herança apenas para poder reusar código Alarme emite som Piano emite som Utilizar anotação na sobrescrita de métodos Alarme Piano Não faz sentido! Apesar do reuso do método de emitir som! @Override public void creditar(double valor){...} Exercícios Lista 6, Questão 16 (adaptada) Escreva uma superclasse Funcionario e duas subclasses, Gerente e Atendente. A classe Funcionario deve possuir os atributos nome, CPF, salario e dataNascimento. A classe Atendente deve ter ainda o atributo comissao. Crie um método getSalario que deve retornar o salário do Funcionario. No caso de Gerente, deve ser retornado o salário acrescido de uma bonificação de R$2000,00. Crie uma classe para testar o seu código, que demonstre o comportamento polimórfico pela chamada do método getSalario. Lista 6, Questão 10 Implemente a classe Poupanca utilizando herança. Em seguida, teste a inserção de poupanças em um repositório do tipo RepositorioContasVetor. Lista 6, Questão 11 Utilizando a classe RepositorioContasVetor, procure por uma conta e tente chamar o método renderJuros(), específico de poupanças. O que acontece se a procura retornar um objeto do tipo Conta e não do tipo Poupanca? Em caso de ocorrência de erro, ajuste a sua implementação para preveni-lo.
Compartilhar