Programação Orientada a Objectos

Transcrição

Programação Orientada a Objectos
Programação Orientada a Objectos
Herança, Polimorfismo
1
Programação -UEM
Maputo, 30 de Abril de 2014
Reutilização
Cenário: Um banco oferece diversos serviços que podem ser contratados individualmente pelos
clientes. Quando um serviço é contratado, o sistema do banco deve registrar quem foi o cliente que
contratou o serviço, quem foi o funcionário responsável pelo atendimento ao cliente e a data de
contratação. De modo a ser produtivo, a modelagem dos serviços do banco deve diminuir a
repetição de código. A ideia é reaproveitar o máximo do código já criado. Numa abordagem
podemos definir uma classe para todos serviços;
class Servico {
private Cliente contratante ;
private Funcionario responsavel ;
private String dataDeContratacao ;
// métodos
}
Maputo, 30 de Abril de 2014
2
Reutilização
• Empréstimo: O empréstimo é um dos serviços que o banco oferece. Quando um cliente contrata esse
serviço, são definidos o valor e a taxa de juros mensal do empréstimo. Devemos acrescentar dois atributos na
classe Servico: um para o valor e outro para a taxa de juros do serviço de empréstimo.
class Servico {
//GERAL
private Cliente contratante ;
private Funcionario responsavel ;
private String dataDeContratacao ;
// EMPRÉSTIMO
private double valor ;
private double taxa ;
//Métodos}
Maputo, 30 de Abril de 2014
3
• Seguro: Outro serviço oferecido pelo banco é o seguro de veículos. Para esse serviço devem ser definidas as seguintes
informações: veículo assegurado, valor do seguro e a franquia. Devemos adicionar três atributos na classe Servico.
• class Servico {
// GERAL
private Cliente contratante ;
private Funcionario responsavel ;
private String dataDeContratacao ;
//EMPRÉSTIMO
private double valor ;
private double taxa ;
// SEGURO DE VEICULO
private Veiculo veiculo ;
private double valorDoSeguro ;
private double franquia ;
// métodos
}
Maputo, 30 de Abril de 2014
4
Reutilização
• Para evitar a repetição do código, podemos recorrer ao conceito de herança,
donde definiremos uma classe genérica e várias específicas. Dessa forma
Servico
teríamos:
Emprestimo
Maputo, 30 de Abril de 2014
SeguroDeVeiculo
5
Herança
• É uma técnica onde uma classe passa a utilizar atributos e métodos definidos
numa outra classe tida como seu ancestral. A herança é o compartilhamento
de atributos e métodos entre classes baseado num relacionamento
hierárquico do tipo pai e filho, ou seja, a classe pai contêm definições que
podem ser utilizadas nas classes definidas como filho.
• A classe pai é denominada classe base (ou superclasse), sendo que as classes
filhas denominam-se classes derivadas (ou subclasses). Esta representação
sugere que uma classe poderia ser definida em termos mais genéricos e
depois refinada sucessivamente numa ou mais subclasses específicas.
Maputo, 30 de Abril de 2014
6
Herança
• Conforme isto, pode-se dizer que uma classe derivada é uma especialização da superclasse
correspondente.
• Em Java, para indicar que uma classe é derivada, utiliza-se a palavra reservada extends sendo
que a classe pai não recebe qualquer tipo de indicação.
• public class Superclass{
//superclasse java
.....}
• public class Subclass extends Superclass{
//subclasse java
.....}
Maputo, 30 de Abril de 2014
7
Herança
• Em princípio, todas as características e comportamentos definidos para uma
certa superclasse são na totalidade aplicáveis para seus descendentes, tais que,
não podem omitir ou suprimir tais características pois não seriam
descendentes. Por outro lado, uma subclasse pode modificar a
implementação de uma operação por questões de eficiência sem modificar a
implementação da classe pai.
• As subclasses podem adicionar novos métodos e atributos não existentes na
superclasse, criando uma especialização da classe base
Maputo, 30 de Abril de 2014
8
Herança
• Em UML a especialização pode ser expressa da seguinte forma:
Funcionario
-string nome
-int idade
-double salario
+tiraFerias()
+aumentaSalario()
+getBonus()
Maputo, 30 de Abril de 2014
Gerente
-int codigo
+tiraFerias()
+aumentaSalario(int taxa)
+getBonus()
9
Polimorfismo
• Previamente, afirmamos que herança oferece um mecanismo de
especialização, o polimorfismo por sua vez oferece mecanismo de
generalização que permite separar a interface de uma classe da sua efectiva
implementação.
• Portanto, polimorfismo é a capacidade de um objecto poder ser referenciado
de várias formas, lembrando que um objecto é criado sob um tipo e continua
sendo desse mesmo tipo até a sua destruição
Maputo, 30 de Abril de 2014
10
Polimorfismo
• Imagine-se que a cada final de ano atribui-se um bónus a cada funcionário dessa organização equivalente a
10%, sendo que o gerente recebe 5% a mais. Teríamos a classe Funcionario da seguinte forma
• class Funcionario {
private String nome;
Private int idade;
private double salario;
public double getBonus() {
return this.salario * 0.10;
}
// métodos
}
Maputo, 30 de Abril de 2014
11
Polimorfismo
• Quando um método é herdado, este pode ser prontamente utilizado ou reescrito de
acordo com as exigências dessa classe. Portanto, na classe Gerente o método
getBonus() ficaria da seguinte forma
• class Gerente extends Funcionario {
private int codigo;
public double getBonus() {
return super.getBonus()+this.getSalario()*0.05;
}}
Maputo, 30 de Abril de 2014
12
Construtores
• Quando se tem uma hierarquia de classes, pelo menos um construtor de cada classe de uma mesma
sequência hierárquica deve ser chamado ao instanciar um objecto. Por exemplo, quando um objecto da classe
Gerente é criado, pelo menos um construtor da própria classe Gerente e um da classe Funcionario devem ser
executados. Além disso, os construtores das classes mais genéricas são chamados antes dos construtores das
classes específicas.
• class Funcionario {
// ATRIBUTOS
public Funcionario () {
System . out . println (" Funcionario ");
}
}
Maputo, 30 de Abril de 2014
13
Construtores
• class Gerente extends Funcionario {
// ATRIBUTOS
public Gerente () {
//super(atributos separados por vírgulas conforme os parâmetros do construtor)
System . out . println (" Gerente ");
}
}
• Por padrão, todo construtor chama o construtor sem argumentos da superclasse se não
existir nenhuma chamada explícita do construtor.
Maputo, 30 de Abril de 2014
14
Resumo
•
public class Funcionario {
private String nome ;
private double salario ;
public Funcionario(String nome){
this.nome=nome;
}
// GETTERS AND SETTERS
public double getBonus () {
return this . salario * 0.1;
}
}
Maputo, 30 de Abril de 2014
15
Resumo
• class Gerente extends Funcionario {
private String senha ;
public Gerente(String nome){
super(nome);
}
// GETTERS AND SETTERS
public double getBonus () {
return super.getBonus() + this . getSalario () * 0.05;
}
}
Maputo, 30 de Abril de 2014
16
Fim
Maputo, 30 de Abril de 2014
17

Documentos relacionados