Você está na página 1de 22

Programação

Orientada a Objetos
HER A NÇA E PO LIMOR FISMO
Programação Orientada a Objetos
Polimorfismo

“Classes derivadas de uma única classe base são capazes de invocar métodos que, embora
apresentem a mesma assinatura, comportam-se de maneira diferente para cada uma das
classes derivadas”
Fonte: BALBO Wellington – Conceitos e Exemplos – Polimorfismo: Programação Orientada a Objetos. Devmedia

Mecanismo por meio do qual se selecionam as funcionalidades que serão usadas


dinamicamente por um programa sendo executado

Atributos e objetos podem ser utilizados por objetos distintos, com implementações lógicas
diferentes

Exemplo:
Bola de futebol Artigos Esportivos Cálculo das vendas diferente
Camisa de um time
Programação Orientada a Objetos
Polimorfismo

Outro exemplo:
Vendedor Pessoas Calcular Vendas
Gerente

CalcularVendas
Implementado na classe base e com comportamento
diferente nas chamadas das classes Método Polimórfico
Programação Orientada a Objetos
Polimorfismo

public decimal CalcularVendas()


{
decimal valorUnitario = decimal.MinValue; Implementado na classe base
decimal produtosVendidos = decimal.MinValue;

return valorUnitario * produtosVendidos;


}
Programação Orientada a Objetos
Polimorfismo

public decimal CalcularVendas()


{ Implementado na classe
decimal valorUnitario = 50; Vendedor
decimal produtosVendidos = 1500;

return valorUnitario * produtosVendidos;


}
Programação Orientada a Objetos
Polimorfismo

public decimal CalcularVendas()


{ Implementado na classe Diretor
decimal valorUnitario = 150;
decimal produtosVendidos = 3800;
decimal taxaAdicional = 100;

return taxaAdicional + (valorUnitario *


produtosVendidos);
}
Programação Orientada a Objetos
Polimorfismo – Mais detalhes class Gerente {
String nome;
class Funcionario { String cpf;
String nome; double salario;
String cpf; int senha;
double salario; int numeroDeFuncionariosGerenciados;
// métodos devem vir aqui
} public boolean autentica(int senha) {
if (this.senha == senha) {
System.out.println("Acesso Permitido!");
return true;
} else {
System.out.println("Acesso Negado!");
return false;
}
}
// outros métodos
}
Programação Orientada a Objetos
Polimorfismo - Herança
Gerente como extensão de um Funcionário

class Gerente extends Funcionario {


int senha;
int numeroDeFuncionariosGerenciados;

public boolean autentica(int senha) {


if (this.senha == senha) {
System.out.println("Acesso Permitido!");
return true;
} else {
System.out.println("Acesso Negado!");
return false;
}
}
// setter da senha omitido
}
Programação Orientada a Objetos
Então....

class TestaGerente {
static void main(String[] args) {
Gerente gerente = new Gerente();

// podemos chamar métodos do Funcionario:


gerente.setNome("João da Silva");

// e também métodos do Gerente!


gerente.setSenha(4231);
}
}

A classe Gerente herda atributos e métodos da classe mãe, inclusive os privados, mas não
acessa-os diretamente
Programação Orientada a Objetos
Herança

E como acessar atributos e métodos herdados?

public? protected ? private?

protected!

class Funcionario {
protected String nome;
protected String cpf;
protected double salario;
// métodos devem vir aqui
}
Programação Orientada a Objetos
Herança
Programação Orientada a Objetos
Reescrevendo Métodos

class Funcionario {
classe Gerente vai herdar o método getBonificacao:
protected String nome;
protected String cpf;
Gerente gerente = new Gerente();
protected double salario;
gerente.setSalario(5000.0);
System.out.println(gerente.getBonificacao());
public double getBonificacao() {
return this.salario * 0.10;
}
// métodos
}
Quanto o gerente vai receber de bônus?
Quanto ele deveria receber?
Programação Orientada a Objetos
Melhorando

class Gerente extends Funcionario {


int senha;
int numeroDeFuncionariosGerenciados;

public double getBonificacao() {


return this.salario * 0.15;
}
// ...
}

.......

Gerente gerente = new Gerente();


gerente.setSalario(5000.0);
System.out.println(gerente.getBonificacao());
Programação Orientada a Objetos
Ou

@Override
public double getBonificacao() {
return this.salario * 0.15;
}
Programação Orientada a Objetos
Como chamar um método reescrito

class Gerente extends Funcionario {


int senha;
int numeroDeFuncionariosGerenciados;

public double getBonificacao() {


return this.salario * 0.10 + 1000;
}
// ...
}

Problema: quando getBonificacao do Funcionario mudar, deverá ser mudado o


método do Gerente para acompanhar a nova bonificação
Programação Orientada a Objetos
Como chamar um método reescrito - melhorando

class Gerente extends Funcionario {


int senha;
int numeroDeFuncionariosGerenciados;
public double getBonificacao() {
return super.getBonificacao() + 1000;
}
// ...
}
Programação Orientada a Objetos
Voltando...Herança - Polimorfismo

Gerente gerente = new Gerente();


Funcionario funcionario = gerente;
funcionario.setSalario(5000.0);
Programação Orientada a Objetos
Herança- Polimorfismo

O que é retornado quando se chama:


funcionario.getBonificacao();

500,00 ou 750,00 ?

Em Java a invocação é decidida em tempo de execução


Programação Orientada a Objetos
Herança - Polimorfismo

class ControleDeBonificacoes {
private double totalDeBonificacoes = 0;

public void registra(Funcionario funcionario) {


this.totalDeBonificacoes += funcionario.getBonificacao();
}

public double getTotalDeBonificacoes() {


return this.totalDeBonificacoes;
}
}
Programação Orientada a Objetos
Herança – Polimorfismo
Em algum lugar da aplicação....

ControleDeBonificacoes controle = new


ControleDeBonificacoes();

Gerente funcionario1 = new Gerente();

funcionario1.setSalario(5000.0);
controle.registra(funcionario1);

Funcionario funcionario2 = new Funcionario();


funcionario2.setSalario(1000.0);

controle.registra(funcionario2);
System.out.println(controle.getTotalDeBonificacoes());

Se passou um Gerente para um método que recebe um Funcionario como argumento


Programação Orientada a Objetos
Herança - Polimorfismo
No dia em que for criada uma classe Secretaria, por exemplo, que seja filha de Funcionario, será
preciso mudar a classe de ControleDeBonificacoes?

Não!

A classe Secretaria deve somente reescrever os métodos necessários:

Polimorfismo!

Diminui o acoplamento entre as classes, para evitar que novos


códigos resultem em modificações em inúmeros lugares.
Programação Orientada a Objetos
Herança x Acoplamento

Acoplamento = Dependência
Relação entre classes mãe e filha é forte
Programador das classes filhas tenha que conhecer a implementação da classe pai e vice-versa

Se quiséssemos mudar alguma coisa na Classe Funcionário, mas não para todos os
Funcionários? Teríamos que verificar se todas as classes filhas se comportam como deveriam.

Isso é um problema de herança e não de polimorfismo, resolvido através de Interfaces.

Você também pode gostar