aula 5 encapsulamento, associação, polimorfismo, interfaces
TRANSCRIPT
Programação Orientada a Objetos
Aula 5Curso: Análise e Desenvolvimento de Sistemas
Professor: Rafael Wendel Pinheiro
• Roteiro da Aula
– Encapsulamento– Associação– Polimorfismo– Exercícios
2
Encapsulamento
3
• Encapsulamento– O conceito de encapsulamento visa
“esconder” atributos e métodos de uma classe que são interessantes não serem “vistos” fora da classe.
– Nesse contexto, quem for consumir a classe, saberá “o que ela faz” e não “como ela faz”.
– A classe será acessada apenas por seus métodos públicos, que são as “interfaces da classe”.
4
• Encapsulamento– Imagine a classe “Carro”. Essa classe possui
os atributos capacidadeTanque e qtdeCombustivel.
– É interessante que esses atributos sejam implementados como “privados” para garantir que anomalias como quantidade > capacidade.
5
• Encapsulamento
6
public class Carro{ private int capacidadeTanque; private int qtdeCombustivel;
public Carro(int capacidadeTanque){ this.capacidadeTanque = capacidadeTanque; }
public void abastecer(int qtdeCombustivel){ if((this.qtdeCombustivel + qtdeCombustivel) > this.capacidadeCombustivel){ System.out.println(“Quantidade excede o limite do tanque!”); } else{ this.qtdeCombustivel = this.qtdeCombustivel + qtdeCombustivel;, System.out.println(“Carro abastecido. Quantidade atual: ” + this.qtdeCombustivel ); } } }
• Encapsulamento
7
Carro c = new Carro(50);c.abastecer(40); // Imprime: “Carro abastecido. Quantidade atual: 40”c.abastecer(15); // Imprime: “Quantidade excede o limite do tanque”c.abastecer(10); // Imprime: “Carro abastecido. Quantidade atual: 50”
Externamente não é possível saber que o método abastecer está acessando os atributos capacidadeTanque e qtdeCombustivel e por vezes alterando esse segundo.
• Encapsulamento– É interessante que todos os atributos de uma
classe sejam encapsulados, ou seja, não sejam públicos.
– Dessa forma, eles não poderão ser acessados/modificados diretamente fora da classe, apenas através de comportamentos (métodos).
– Para isso, deve-se implementar os métodos set e get.
8
• Encapsulamento– Método set serve para atribuir um valor a uma
propriedade da classe.– Método get serve para recuperar/visualizar o
valor de uma propriedade da classe
9
• Encapsulamento
10
public class Pessoa{ private String nome; private String email;
public void setNome(String nome){ this.nome = nome; }
public String getNome(){ return this.nome; }
public void setEmail(String email){ this.email = email; }
public String getEmail(){ return this.email; }}
• Encapsulamento
11
Pessoa p = new Pessoa();p.setNome(“Joao”);p.setEmail(“[email protected]”);
System.out.println(“Nome: ” + p.getNome() ); System.out.println(“Email: ” + p.getEmail() );
• Exercício 1:– Crie a classe Usuario com os atributos nome,
login e senha.– Como você implementaria a classe para que o
atributo nome só salvasse nomes com CAIXA ALTA, login só caixa baixa e senha uma String com limite de 16 caracteres?
– Implemente!!!
12
Associação
13
• Associação– A associação entre classes ocorre quando o
atributo de uma classe é do tipo de outra classe.
– Por exemplo, imagine a classe Endereço com os atributos rua e numero. Imagine também a classe Cliente que tem os atributos nome e idade. Cliente possui Endereço, logo, nessa classe terá um atributo do tipo Endereço.
14
• Associação
15
public class Endereco{ private String rua; private String numero;
public void setRua(String rua){ this.rua = rua; }
public String getRua(){ return this.rua; }
public void setNumero(String numero){ this.numero = numero; }
public String getNumero(){ return this.numero; }}
16
public class Cliente{ private String nome; private int idade; private Endereco endereco;
public void setNome(String nome){ this.nome = nome; }
public String getNome(){ return this.nome; }
public void setIdade(int idade){ this.idade = idade; }
public int getIdade(){ return this.idade; }
public void setEndereco(Endereco endereco){ this.endereco = endereco; }
public Endereco getEndereco(){ return this.endereco; }}
• Associação
17
Endereco e = new Endereco(); e.setRua(“Rua das Flores”); e.setNumero(“123”);
Cliente c = new Cliente(); c.setNome(“Joao”); c.setIdade(30); c.setEndereco(e);
System.out.println(“Rua: ” + c.getEndereco().getRua() ); //Imprime: “Rua: Rua das Flores”
Polimorfismo
18
• Polimorfismo– Polimorfismo é a capacidade de uma instância
se portar de várias formas de acordo com sua referência.
– Por exemplo, retome o projeto da aula anterior onde existia a classe Funcionario e Gerente.
– Sabe-se que todo gerente é um funcionário, e isso é viabilizado através da herança.
19
• Polimorfismo
20
Gerente g = new Gerente(“Joao”); g.salario = 1500; g.horasExtras = 10; Funcionario f = g; f.calcularSalarioTotal();
Vai ser executado o método da classe Funcionario ou Gerente?
Interfaces
21
• Interfaces– Em OO, as Interfaces fornecem uma lista de
métodos que as classes que a implementarem deverão ter.
– Sua principal função é fornecer um mecanismo de desacoplar as classes (diminuir a dependência entre as classes)
– Serve como um “contrato” que todas as classes devem cumprir quando assumem a implementação da Interface.
22
• Interfaces– Exemplo: Organograma de Funcionários da
Empresa XYZ.
23
• Interfaces– No Sistema da Empresa XYZ os Diretores e
Gerentes possuem acesso através de um login/senha. Os Operadores NÃO POSSUEM acesso ao sistema.
– Como fazer?
24
• Interfaces– Incompatibilidade: Operador não “autentica” no
sistema.
25
• Interfaces– Nesse caso, pode-se criar uma Interface
“IAutenticavel” e nela declarar o método “autenticar(): boolean”. Todas as classes que tiverem acesso através de login e senha deverão implementar essa Interface e consequentemente possui o método “autenticar(): boolean”
26
• Interfaces
27
• Implementação
28
Classe Funcionario (Super-classe
Interface IAutenticavel
• Implementação– Classe Gerente
29
• Implementação– Classe Diretor
30
• Interfaces– Uma classe pode implementar várias Interfaces
distintas– A classe pode ter outros métodos particulares
além daqueles declarados pela Interface a qual implementa
– Uma variável do tipo “Interface” pode receber uma instância de qualquer classe que a implementa.
31
32
• Exercício 2:– Crie uma classe chamada ContaBancaria. Essa classe
deverá ter os atributos numeroConta, saldo e historico. Faça os métodos:
• Construtor para receber o numero e o saldo inicial da conta.• depositar: recebe um valor e acopla ao saldo• sacar: recebe um valor a ser sacado do saldo• consultarSaldo: Imprime o número da conta e o saldo atual.
(Obs: cada consulta resulta em uma taxa de 0,25 no saldo)• aplicarReajuste: Atualiza o saldo em 0,02%• exibirHistorico: deverá exibir todas as ações já executadas
por essa conta.33
• Fim!
34