Vous êtes sur la page 1sur 27

Introduo Programao

Encapsulamento e Herana
2
Tpicos da Aula
Hoje, aprenderemos conceitos mais avanados
de Orientao a Objetos
Encapsulamento
Usando modificadores de acesso em C++
Herana
Importncia
Utilizao em C++
Herana mltipla
Um objeto pode ser visto de duas formas
diferentes:
Internamente
Detalhes de atributos e mtodos da classe que o
define
Externamente
Servios que um objeto fornece e como este
objeto interage com o resto do sistema (a
interface do objeto)
Encapsulamento (Information Hiding)
A viso externa de um objeto encapsula o
modo como so fornecidos os servios
Isto , esconde os detalhes (internos) de
implementao do objeto (information hiding)
Encapsulamento (Information Hiding)
Um objeto (chamado neste caso de cliente) pode usar
os servios fornecidos por um outro objeto
Contudo, um cliente no deve precisar saber os detalhes de
implementao destes mtodos
Mudanas no estado (atributos) de um objeto devem
ser feitas pelos mtodos do objeto
Para permitir uma maior independncia entre os
objetos,o acesso direto aos atributos de um objeto por
um outro objeto deve ser restrito ou quase impossvel
Encapsulamento (Information Hiding)
Um objeto pode ser visto como uma caixa preta,
onde os detalhes internos so escondidos dos
clientes
Clientes acessam o estado do objeto, atravs dos
mtodos oferecidos
Mtodos
Dados
Cliente
Encapsulamento (Information Hiding)
Em C++, o encapsulamento possvel atravs do uso
apropriado de modificadores de acesso
Modificadores so palavras reservadas que especificam
caractersticas particulares de um conjunto de mtodos ou de
atributos
Modificadores de acesso variam de acordo com a
visibilidade que se quer oferecer ao cliente
Podem ser:
public,protected ,private,friend
Modificadores de Acesso
Membros da classe que recebem o modificador public,
podem ser acessados por qualquer outra classe
Devem ser utilizados para mtodos que definem a interface da
classe
No deve ser utilizado para os atributos, excetuando-se o caso
onde queremos declarar uma constante
Membros que recebem o modificador private, s
podem ser acessados por membros da classe ou classes
(ou funes) amigas (friends)
Devem ser utilizados para atributos e mtodos auxiliares
Modificadores de Acesso
public private
Atributos
Mtodos
Fornecem servios
para os clientes
Auxiliam outros
mtodos da classe
Preservam
encapsulamento
Violam
encapsulamento
Modificadores de Acesso
class Conta {
private:
string numero;
string agencia;
double saldo;
public:
void creditar (double valor);
void debitar(double valor);
double getSaldo();
string getNumero();
string getAgencia();
Conta(string num, string ag);
protected:
void setSaldo(double valor);
}
Classe Conta e Modificadores de
Acesso
10
Parte privada
Parte pblica
Parte
protegida
Membros de uma superclasse que recebem o
modificador private, no podem ser acessados
nem pelas subclasses
Se colocar public e o membro for um atributo, o princpio
do encapsulamento violado
Membros com o modificador protected so visveis
pelas subclasses e pelas classes (ou funes)
amigas
Modificadores de Acesso
Em C++, o modificador friend pode ser colocado
antes de um mtodo ou (uma classe) declarado
dentro de uma classe
O mtodo amigo (ou classe amiga) no pertence a classe
na qual est declarado
Informa que o mtodo amigo (ou classe amiga) pode
acessar os membros privados e protegidos da classe na
qual est declarado
Modificadores de Acesso
void creditarBonus(Conta* c, double v) {
if (c->saldo > 10000)
c->saldo = c->saldo + v;
}
class Conta {
private:
string numero;
string agencia;
double saldo;
public:
void creditar (double valor);
...
friend void creditarBonus(Conta* c,double v);
};
Classe Conta e Modificador de Acesso
Friend
13
Parte privada
Funo (mtodo) amiga
Funo amiga que no pertence classe
acessa parte privada da classe
Membros de uma classe, que no recebem modificador
de acesso, tem visibilidade private
Na redefinio de mtodos herdados, o modificador de
acesso no deve ser trocado por um mais restrito
No entanto, podem ser trocados por modificadores
menos restritos
Modificadores de Acesso
class PoupancaD {
private:
string numero;
string agencia;
double saldo;
public:
void creditar (double valor);
void debitar(double valor);
void renderJuros(double taxa);
}
Classes de Poupanas e Contas:
Descries
class Conta{
private:
string numero;
string agencia;
double saldo;
public:
void creditar (double valor);
void debitar(double valor);
}
Parte diferente
das descries
Partes idnticas
das descries
15
Classe de Bancos: Assinatura
class BancoD {
public:
void cadastrarConta(Conta* c){}
void cadastrarPoupanca(PoupancaD* p){}
...
}
Mtodos diferentes para
manipular contas e poupanas
16
Problemas
Duplicao desnecessria de cdigo:
A definio de PoupanaD uma simples
extenso da definio de Conta
Clientes de Conta que precisam trabalhar tambm
com PoupanaD tero que ter cdigo especial
para manipular poupanas
Falta refletir relao entre tipos do mundo
real
17
Subtipos e Subclasses
Poupana
Conta
18
Herana
Necessidade de estender classes
Alterar classes j existentes e adicionar
propriedades ou comportamentos para
representar outra classe de objetos
Criar uma hierarquia de classes que herdam
propriedades e comportamentos de outra classe e
definem novas propriedades e comportamentos
19
Herana
Herana permite que novas classes possam ser
derivadas de classes existentes
A classe existente chamada de classe pai (me) ou
superclasse
A classe derivada chamada de classe filha ou
subclasse
Subclasse herda as caractersticas da superclasse
Herda os atributos e mtodos
Estabelece a relao de - um
A subclasse uma verso especializada da superclasse
20
Importncia de Herana
Comportamento
Objetos da subclasse comportam-se como os objetos da
superclasse
Substituio
Objetos da subclasse podem ser usados no lugar de objetos
da superclasse
Reuso de Cdigo
Descrio da superclasse pode ser usada para definir a
subclasse
Extensibilidade
algumas operaes da superclasse podem ser redefinidas
na subclasse
21
#include Conta.h
class Poupanca: public Conta {
public:
void renderJuros(double taxa);
Poupanca(string num,string ag):Conta(num,ag){}
}
22
Classe de Poupanas: Assinatura
Indica que a classe
Poupanca herda de
Conta
Indica que o construtor
de Poupanca utiliza o
construtor de Conta
para inicializar atributos
#include Poupanca.h
void Poupanca::renderJuros(double taxa) {
creditar(getSaldo() * taxa);
}
23
Classes de Poupanas:
Implementao
So precisa implementar o
mtodo renderJuros, o resto
herdado!
Herana e Construtores
Construtores no so herdados
Embora, freqentemente, precisamos do
construtor da superclasse para a definio dos
construtores das subclasses
Necessrios para inicializar os atributos que so
herdados da superclasse
Devemos portanto definir construtores para
as subclasses
24
Herana Mltipla
Herana mltipla permite que uma classe
seja derivada de mais de uma classe
25
Carro
puxarFreiodeMao()
acelerar()
Barco
jogarAncora()
acelerar()
CarroAnfibio
Qual verso do mtodo acelerar
herdada por CarroAnfibio?
Herana mltipla faz com que subclasses
herdem atributos e mtodos das suas
superclasses
Pode haver colises de nomes de atributos e
mtodos
Ao contrrio de Java, C++ d suporte a
herana mltipla
Na hora de utilizar o mtodo, usamos o operador
de resoluo de escopo para dizer a qual
mtodo estamos nos referindo
26
Herana Mltipla e C++
int main() {
CarroAnfibio ca;
ca.Carro::acelerar();
ca.Barco::acelerar();
...
}
class CarroAnfibio: public Carro,Barco {
...
};
Herana Mltipla em C++
27
Herda das
superclasses
Carro e Barco
Usando operador de resoluo de escopo
para determinar qual verso do mtodo
acelerar deve ser usado

Vous aimerez peut-être aussi