Академический Документы
Профессиональный Документы
Культура Документы
Unidade III
FUNDAMENTOS DA PROGRAMAO ORIENTADA A OBJETOS
Nesta unidade, estudaremos como aplicar os conceitos fundamentais da POO, assim como a
integrao de tais conceitos entre si. Para auxiliar no estudo de cada conceito, utilizaremos algumas
situaes reais e aos poucos aplicaremos os conceitos de POO.
Exemplo de aplicao
No se prenda aos exemplos deste material. Tente alter-los e procure por novos exemplos. Tente
aplic-los no seu dia a dia!
O estudante dever ficar atendo s informaes como padronizao de nomes e procedimentos,
de modo a facilitar seu entendimento e se habituar a padres bsicos de metodologia de trabalho
utilizados no mercado mundialmente.
Existe uma relao muito prxima entre os conceitos de programao estruturada e POO,
assemelhando-se tambm em suas funcionalidades (salvo as definies que sero abordadas neste
material):
Quadro 14 Relao de conceitos bsicos da programao estruturada x POO
Programao estruturada
Variveis
Procedimentos
Mtodos
Funes
Mtodos
Conforme o quadro anterior, fica fcil perceber que os conceitos de POO se aplicam mais ao trabalho
de modelagem de sistemas do que programao em si, visto que os conceitos de programao
estruturada no se perdem e so agregados com uma maneira diferente de trabalho.
58
Abstrair consiste no ato de imaginar algo a partir de algo concreto. Em POO, abstrao o conceito
mais utilizado, pois a todo momento necessitamos analisar processos e situaes do mundo real e
abstra-los para a elaborao de um software e/ou sistema, ou seja, elencar como sero os dados e os
procedimentos utilizados, tal como a interao entres esses processos.
Um exemplo o controle de contas.
Imagine a seguinte situao: a necessidade de criar um controle financeiro para sua famlia.
A princpio a tarefa simples, mas vamos abstrair o ambiente. H alguns aspectos necessrios:
Para controlar as contas, devemos ter um lugar para anot-las.
Necessitamos separar as contas em contas a pagar e contas a receber.
Normalmente, temos tipos diferentes de contas, ento precisamos ter categorias (ou tipos) para
agrup-las.
Uma vez paga ou recebida a conta, devemos controlar para onde o dinheiro foi! Logo, necessitamos
de um controle de caixas.
Caixas podem ser a carteira ou uma conta no banco.
Depois de paga ou recebida a conta, devemos anotar que ela foi quitada.
Os processos de elencar e estudar o ambiente so realizados sempre antes de iniciar os trabalhos de
codificao, ou seja, a programao em si.
O processo de abstrao necessrio para definir o escopo (objetivo) de todas as classes a serem
desenvolvidas, assim como o objetivo final do sistema que ser construdo.
Observao
Abstrair imaginao! Para quem est pouco acostumado, pode ser
muito difcil em um primeiro momento realizar essa anlise do mundo real
e traduzi-lo em desenhos simples. Somente a prtica levar o estudante a
ter a habilidade necessria para esse fim. Ento, treinar sempre em abstrair
solues para procedimentos e eventos do dia a dia do estudante a melhor
maneira de desenvolver essa aptido!
59
Unidade III
Em algumas linguagens (como o C#) possvel criar estruturas de classes que simplesmente no
possuem nenhuma implementao concreta, apenas definies de como ela ser. Isso permitido
justamente para que o desenvolvedor possa ter liberdade de abstrao, ou seja, liberdade de definir seu
projeto de maneira a ficar mais prximo da modelagem do mundo real.
5.2 Objetos
Objetos podem ser considerados uma imitao do comportamento intrnseco de entidades reais. Tal
como em sistemas reais, em uma POO no vivel abrir um objeto e olhar em seu interior e tampouco
alterar seu estado. Nesse paradigma, a nica forma de fazer evoluir um programa permitir que objetos
compartilhem dados entre si a partir de trocas explcitas de mensagens.
Como exemplo, considere a seguinte situao:
A esposa de um jovem casal se encontra no segundo ms de gravidez. No meio da noite, a grvida
acorda com uma azia terrvel. Como natural, a mulher pede que seu marido providencie um anticido
para ela.
Sob a tica da POO, poderamos representar a cena da seguinte maneira:
O objeto marido recebe uma mensagem do objeto esposa.
O objeto marido responde mensagem da esposa mediante uma ao (buscar anticido).
A esposa no tem que dizer ao marido onde ele deve procurar, responsabilidade dele procurar
pelo anticido.
Ao objeto esposa basta ter emitido uma mensagem ao objeto marido.
Saiba mais
Em 2008, o Massachussets Institute of Technology (MIT), o mesmo que
desenvolveu o sketchpad, lanou o scratch. Esse programa atualmente
o padro para o ensino da programao de computadores para crianas a
partir dos oito anos. O uso desse programa facilita muito a aprendizagem
da programao de computadores. Conhea o site:
SOBRE o scratch. [s.d.]. Disponvel em: <scratch.mit.edu/about/>. Acesso
em: 23 out. 2014.
No scratch, alguns conceitos como o de mensagens podem ser utilizados.
O bloco de envio de mensagem :
60
Figura 33
E o de recepo :
Figura 34
5.3 Classes
61
Unidade III
Cdigo 18 Primeira classe
At agora, somente trabalhamos com a classe Program, que funciona perfeitamente para a
programao estruturada. Ao introduzir a POO, cada classe ocupa o mesmo nvel da classe Program. No
cdigo anterior, temos, alm da classe Program, a classe Conta.
A classe em C# Conta declarada utilizando a palavra class. No corpo dessa classe, so declarados
os atributos que os objetos possuiro. Os atributos saldo e limite so do tipo double, que permite
armazenar nmeros com casas decimais, e o atributo numero do tipo int, que permite armazenar
nmeros inteiros. O modicador public adicionado em cada atributo para que eles possam ser acessados
a partir de qualquer ponto do cdigo.
Exemplo: controle financeiro
No exemplo que apresentamos h pouco, definimos nosso escopo para gerar um controle financeiro
para nossa famlia. Portanto, agora temos condies de iniciar um processo para estreito de abstrao
para definirmos quem sero nossas classes.
62
Categoria
TipoPagamento
Caixa
Unidade III
Cdigo 19 Apenas as classes do controle financeiro
O jargo tcnico para os programadores OO para o ato de criar um objeto instanciar, ou criar uma
instncia. Assim sendo, um objeto tambm conhecido como uma instncia de uma classe.
5.3.1.2 Referncias
Todo objeto criado possui uma referncia. Ela a nica maneira de acessar os seus atributos e
mtodos, portanto devemos guardar as referncias dos objetos que forem utilizados.
A referncia criada da seguinte forma:
Para ser mais didtico, vamos separar a linha em dois e executar passo a passo:
Inicialmente, uma varivel criada na memria na qual ser armazenada um endereo de memria
com as caractersticas de Conta:
65
Unidade III
Como vimos anteriormente com o comando new, um objeto alocado em algum lugar da memria:
Para que possamos acessar esse objeto, precisamos de sua referncia. O comando new devolve a
referncia do objeto que foi criado sendo armazenado na varivel criada anteriormente:
66
A partir de ento, o objeto passar a ser referenciado pelo nome dessa varivel:
Exemplo 1:
Os robs tm como caractersticas o cdigo de identificao, a verso do seu sistema operacional e a
data de criao. A partir desse modelo, criar dois robs, o primeiro (r2d2) com o cdigo de identificao
1234 e o segundo (c3po) com o 9. Ambos esto com o sistema Verso V1.0 e foram criados em 991201.
67
Unidade III
Cdigo 20 Listagem completa do exemplo dos robs
Para entendermos passo a passo o exemplo, em primeiro lugar assumiremos que os objetos recebero
o nome das referncias (devemos ter cuidado com isso, como veremos mais tarde). As instncias do rob
r2d2 e c3po so ento criados, conforme visto na figura a seguir:
68
Atribumos ento os valores para as instncias utilizando as referncias criadas. Assim, o cdigo
1234 ser armazenado no atributo r2d2.codigodeidentificao; o V1.0, no atributo r2d2.verso. O
atributo c3po.verso receber o valor armazenado no atributo chamado verso que est no endereo
r2d2, e ambos os atributos de data de criao recebero 991201:
69
Unidade III
A sada do programa conforme o cdigo anterior mostrado na figura a seguir:
Exemplo 2:
Monte uma classe chamada Carro que guarde as seguintes caractersticas: marca, modelo, cor e
ano.
Crie os seguintes carros:
Meu carro, um Volkswagen Fusca, verde, 1968, e o carro do Z, um Gurgel BR500, branco, 1978.
Cdigo 21 ExemploCarro
70
Devemos ter muito cuidado com o uso de atribuio entre duas referncias. necessrio lembrar que
a referncia uma varivel contendo um endereo de memria; assim, ao fazermos uma atribuio, no
estamos passando o objeto de uma varivel para outra, estamos passando um endereo de memria. No
cdigo a seguir acontece exatamente o problema.
Cdigo 22 Passagem de endereo entre referncias
71
Unidade III
Conforme a listagem, o atributo pessoa1.nome recebe Paulo e aparentemente no mais alterado;
porm, ao pedirmos para mostrar na tela, mostrado como Maria! Por que isso estaria acontecendo?
Acontece que, quando fazemos a atribuio pessoa1=pessoa2, ambas as variveis passam a
armazenar o mesmo endereo, e assim o primeiro objeto se perde. Tanto pessoa1 quanto pessoa2 passam
a direcionar para o endereo do segundo objeto. Assim sendo, ao atribuirmos Maria ao segundo objeto,
a referncia pessoa1 assume o mesmo atributo e, ao pedirmos para apresentar o valor de pessoa1.nome,
ele apresentar Maria.
5.4 Atributos
Uma vez definida a classe, devemos iniciar o processo de abstrair os atributos de cada classe, ou seja,
suas caractersticas e propriedades.
Assim como na classe, os nomes dos atributos no podem se repetir dentro da classe; assim, um
mesmo nome de atributo pode ser utilizado em classes diferentes, mas nunca dentro de uma mesma
classe.
Recomenda-se que o nome do atributo seja um substantivo que representa a propriedade do
atributo. Por padro, tambm recomendado que o nome seja escrito em minsculo e, em caso de
nomes compostos, a primeira letra a partir da segunda palavra seja escrita em maisculo. Exemplo:
nomeFavorecido.
Observao
Em termos de POO, alm dos tipos primitivos de dados existentes em
cada linguagem de programao, temos o conceito de associar um atributo
a uma classe. Veremos tal conceito em tpicos mais avanados deste
material.
Exemplo: controle financeiro
Continuando o exemplo do controle financeiro visto anteriormente neste livro-texto, cada uma das
classes definidas poderia apresentar os seguintes atributos:
Conta
Categoria
+nome
+nome
+valor
+tipo
TipoPagamento
+nome
Caixa
+nome
+saldo
+dataVencimento
+dataPagamento
Figura 47 Classes do controle financeiro familiar com seus atributos bsicos
72
Atributo
Descrio
Conta
Nome
Valor
Valor da conta.
dataVencimento
dataPagamento
Nome
Nome da categoria.
Categoria
Tipo
TipoPagamento
Nome
Caixa
Nome
Nome do caixa.
Saldo
73
Unidade III
Observao
Existem vrias metodologias de documentao de projeto e
de documentao de cdigo-fonte. Normalmente as equipes de
desenvolvimento de software definem um padro e todos os membros da
equipe o seguem, para que todos falem a mesma lngua.
O exemplo de documentao dado apenas para fins didticos, no
seguindo nenhum padro especfico.
Uma vez definidos os atributos da classe, necessrio definir tambm o tipo de dado utilizado
em cada atributo, o que se assemelha muito definio de tipos de dados utilizados em variveis ou
at mesmo dos campos de tabelas em bancos de dados. Dessa forma, poderamos dizer que teramos
uma limitao tcnica em relao ao tipo de linguagem de programao que seria utilizada para a
implementao do software desenvolvido com POO. Porm, para fins didticos, podemos utilizar neste
momento o conceito de abstrao para definir os tipos de dados de nossos atributos conforme o quadro
a seguir:
Quadro 16 Tipos de dados utilizados nos atributos
Nome
Descrio
Int
Double
Bool
String
DateTime
Categoria
+nome : string
+nome : string
+valor : double
+tipo : string
TipoPagamento
+nome : string
Caixa
+nome : string
+saldo : double
+dataVencimento : string
+dataPagamento : string
Figura 48 Classes do controle financeiro familiar com seus atributos e respectivos tipos de dados
Uma vez definidos os diagramas de classe com os seus atributos, passamos a transcrev-los em
cdigo da linguagem C#:
74
Lembrete
Os tipos de dados variam entre linguagens de programao; porm,
toda a linguagem de programao contempla os tipos bsicos de dados
para o tratamento desses, tais como dados numricos, inteiros, lgicos e
texto.
75
Unidade III
Todos os atributos de uma classe podem ser de livre acesso ou no, ou seja, os atributos podem ser
pblicos ou privados. Essa restrio de acesso chamada de qualificadores de acesso. Atributos pblicos
so aqueles que podem ser vistos e acessados (manipulados) tanto pela classe a que pertencem como
por outras. Os mtodos privados so vistos e acessados (manipulados) unicamente pela classe a que
pertencem.
Iremos trabalhar melhor o conceito de atributos pblicos e privados posteriormente.
Observao
Em termos de notao dos diagramas de classes, os atributos
pblicos so precedidos de um sinal positivo (+), e os privados, de um
sinal negativo (-).
Existe um terceiro tipo de qualificador de acesso, chamado protegido.
Este simbolizado por um (#) e trataremos seu uso em momento oportuno.
5.5 Mtodos
Para a construo dos mtodos dentro de uma classe, os seus nomes devem ser iniciados com
letras (incluindo os smbolos _ e $) e compostos de uma ou mais palavras sem espao entre elas,
podendo conter nmeros. Os nomes dos mtodos refletem aes que so efetuadas nos campos
da classe e/ou valores passados como argumentos para esses mtodos. Mtodos no podem ser
criados dentro de outros mtodos ou fora de uma classe. Elas seguem a forma mostrada na figura
a seguir:
77
Unidade III
O Nome utilizado para chamar o mtodo. Na linguagem C#, uma boa prtica denir os nomes
dos mtodos utilizando a conveno Camel Case com a primeira letra maiscula. A lista de parmetros
dene os valores que o mtodo deve receber. Mtodos que no precisam receber nenhum valor ficam
com a lista de parmetros vazia. No corpo fica a programao estruturada que dene o que acontecer
quando o mtodo for chamado. Finalmente, o retorno o tipo de dado que ser devolvido como resposta
ao nal do processamento do mtodo. Quando um mtodo no devolve nenhuma resposta, ele deve ser
marcado com a palavra reservada void.
Tomemos uma classe que a contacorrente de um cliente, com os mtodos para sacar e
depositar:
ContaCorrente
+Numero
+Saldo
+Limite
+Depositar()
+Sacar()
Figura 52 Classe conta corrente com os mtodos depositar e sacar
78
Notamos que em ambos o acesso pblico e no tem retorno de valor, portanto do tipo void.
Ambos recebem tambm como parmetro um nmero real que passar para dentro do mtodo com o
nome de valor.
5.5.2 Mtodos construtores
Os mtodos construtores, ou simplesmente construtores, so mtodos especiais que so chamados
automaticamente quando instncias so criadas por meio da palavra-chave new. Por meio da criao
de construtores, podemos garantir que o cdigo contido neles ser executado antes de qualquer outro
cdigo em outros mtodos.
Os construtores so teis para iniciar campos de instncias de classes, garantindo que, quando
mtodos dessas instncias forem chamados, eles contenham valores especficos. Caso os campos de
uma instncia no sejam iniciados, os seguintes valores so adotados:
Campos do tipo boolean so iniciados automaticamente com a constante false.
Campos do tipo char so iniciados com o cdigo Unicode zero, que impresso como um espao
(ou seja: ).
Campos de tipos inteiros (byte, short, int, long) ou de ponto flutuante (float, double) so
automaticamente iniciados com o valor zero, do tipo do campo declarado.
Instncias de qualquer classe, inclusive da classe String, so iniciadas automaticamente com null.
79
Unidade III
As diferenas bsicas entre construtores e outros mtodos so:
A palavra-chave null usada em referncias, indicando que as referncias no foram iniciadas mas tm
algum valor associado a elas, apesar desse valor no poder ser usado como uma instncia poderia.
Construtores devem ter exatamente o mesmo nome da classe a que pertencem, inclusive
considerando maisculas e minsculas.
Construtores no podem retornar nenhum valor, nem mesmo void, portanto devem ser declarados
sem tipo de retorno;
Construtores no devem receber modificadores como public ou private e sero pblicos se a
classe for pblica.
A razo pela qual os construtores tm regras mais rgidas para nomenclatura que os mtodos a
seguinte: quando uma instncia de uma classe que tem construtores for iniciada com a palavra-chave
new, o compilador executar automaticamente o construtor, precisando ento saber exatamente qual
o nome deste. Outra diferena significativa entre construtores e mtodos comuns que o programador
no pode chamar construtores diretamente somente quando a instncia for iniciada com new.
O construtor um mtodo com mesmo nome que a classe. O programador
de uma classe pode definir o construtor de uma classe, que invocado toda
vez que o programa instancia um objeto desta classe (DEITEL, 2003, p. 386).
80
Assim ao executar esse cdigo, mesmo sem receber os valores no programa principal, os atributos
aparecem inicializados na figura a seguir:
81
Unidade III
Cdigo 26 Implementando o mtodo construtor na classe Categoria
A sobrecarga vlida para qualquer tipo de mtodo, mesmo o construtor. Assim sendo, no cdigo a
seguir temos a sobrecarga do mtodo construtor da classe Gente. Como vemos, cada um dos mtodos
com mesmos nomes possuem a composio de tipos diferentes como parmetros em cada um deles.
Cdigo 29 Sobrecarga do mtodo construtor
83
Unidade III
Veja as figuras a seguir. O primeiro construtor o que no recebe nenhum parmetro; o segundo
recebe como parmetro uma string, portanto a assinatura fica Gente e string; o terceiro recebe um
inteiro; e o quarto recebe na sequncia string e int.
Observao
A assinatura obedece sequncia dos tipos. Assim sendo, se no
exemplo anterior tivssemos mais um mtodo cujos parmetros fossem
respectivamente int e string, ele teria uma assinatura diferente do string e
84
85
Unidade III
Outro exemplo envolve mtodos que no so construtores. o que temos no cdigo a seguir.
Cdigo 31 Sobrecarga de mtodos
O exemplo mostra o caso de um reajuste de salrio, em que por padro se aumenta 10%; porm,
possvel tambm reajustar a partir de uma taxa qualquer. Como temos dois mtodos com o mesmo nome
AumentaSalario, porm com assinaturas diferentes, o sistema automaticamente procura o mtodo que
tem a assinatura correspondente e o executa. A primeira chamada feita com a lista de parmetros vazia,
assim o sistema procura o mtodo com a assinatura vazia, e aplica a taxa de 10%. Na segunda chamada,
passado como parmetro um valor com casas decimais, e ento o sistema procura o mtodo que comporta
esse tipo de assinatura, no caso double, e faz o clculo com o ndice passado na chamada. Veja:
86
87
Unidade III
Poderamos fazer uma analogia com o coringa do baralho. A palavra this passa a substituir a
referncia, conforme visto na figura a seguir. Dessa forma, o atributo nome passa a ser outra entidade,
diferente do parmetro nome, que passado pela criao do objeto.
Um construtor tem o mesmo nome da classe, mas esta, ao se tornar um objeto, passa a ter o nome
do objeto. Assim sendo, no possvel que a codificao chame explicitamente um mtodo construtor
pelo nome da classe. Como vimos, a palavra-chave this atua como um coringa desta, que assume o
nome da instncia. Portanto, em vez de chamar um construtor pelo nome da classe, basta cham-lo
pela palavra this.
A linguagem C#, ao contrrio das outras linguagens OO, necessita de uma construo especial,
menos intuitiva. Assim, quando se quer uma autorreferncia nos construtores, ela deve ser colocada
aps a declarao do mtodo, separada por dois pontos. Podemos ento alterar o programa exemplo
da sobrecarga de mtodos, o que faz com que os diversos construtores chamem o mtodo mais
completo, evitando a codificao individual de cada um deles. Todos chamam o mtodo cuja assinatura
string e nome:
88
Observao
Um cuidado adicional deve ser tomado quando se criam mtodos
sobrecarregados: normalmente, os programas OO permitem que alguns
tipos nativos de dados sejam promovidos, isto , aceitos como sendo de
outros tipos, contanto que nada se perca na representao. Dessa forma,
um valor do tipo byte pode ser aceito por um mtodo que espere um valor
do tipo int, j que este pode representar bytes sem perda de informao.
Exemplo: controle financeiro
J estvamos utilizando a palavra-chave this no nosso cdigo, porm sem a explicao tcnica.
Podemos ver que ela se autorreferencia dentro da prpria instncia quando criada. Para podermos
ter mais opes de inicializao no momento em que o objeto criado, feita a sobrecarga dos
construtores nas classes do nosso sistema. Obseve os cdigos a seguir:
89
Unidade III
Cdigo 34 Uso do this e sobrecarga do construtor na classe TipoPagamento
90
91
Unidade III
Vejamos a aplicao dos mtodos no exemplo do sistema de controle financeiro:
Conta
+nome : string
TipoPagamento
+nome : string
+valor : double
+dataVencimento : string
+dataPagamento : string
Caixa
+nome : string
Categoria
+nome : string
+saldo : double
+tipo : string
+RetornaSaldo : double
+RetornaNome : string
+DefineSaldo(double valor) : void
Figura 63 Classes do controle financeiro familiar com a classe Caixa e seus mtodos
De acordo com a figura, temos a classe Caixa com seus respectivos mtodos. Cada mtodo corresponde
a uma operao especfica que a classe pode realizar, conforme descrito no quadro a seguir:
Quadro 17 Descrio dos mtodos da classe Caixa
Nome
Parmetros
Retorno
Descrio
RetornaSaldo
Nenhum
O saldo do caixa.
Retorna o valor
atual do caixa
RetornaNome
Nenhum
O nome do caixa.
Retorna o nome
do caixa
DefineSaldo
Valor a ser
armazenado no
caixa
O saldo do caixa.
Retorna o saldo
atual do caixa
92
Percebe-se que os mtodos da classe Caixa seguiram as regras de como construir mtodos. Porm,
se analisarmos toda a estrutura da classe Caixa, percebemos que:
A classe possui mtodos e atributos.
Dois mtodos (RetornaSaldo e RetornaNome) retornam o valor de dois atributos (saldo e nome,
respectivamente).
93
Unidade III
O mtodo DefineSaldo manipula o valor do atributo saldo.
Desta forma, percebemos que quando algum for utilizar essa classe em outra parte do programa,
tanto faz acessar e manipular os atributos ou os mtodos! Isso pode gerar uma srie de problemas e
inconsistncias que podem comprometer toda a modelagem a realizar e, por consequncia, a eficcia
da programao realizada.
Para evitar esse tipo de problema, alguns cuidados devem ser tomados. Isso pode ser feito adotando
algumas regras adicionais na modelagem da classe que visam proteger e guiar o uso da classe de forma
intuitiva, padronizada e transparente:
Limite o acesso ao mximo dos atributos pelas demais classes (atributos privados).
Padronize a manipulao e o retorno de valores dos atributos utilizando os mtodos.
Vamos ver no prximo item pormenorizadamente como efetuar a limitao do acesso aos atributos.
Observao
As regras apresentadas neste material referente ao nome de classes e
atributos, assim como as estruturas utilizando qualificadores de acesso,
so fundamentadas em boas prticas de programao, nada tendo a
ver com regras de sintaxe de linguagem de programao. Tais prticas
podem e devem ser adotadas pela equipe de desenvolvimento de
software e podem ser diferentes em vrios ambientes (escolas, empresas,
departamentos etc.).
6 Integrao entre classes
Conforme discutido anteriormente, uma boa prtica ocultar a estrutura de dados de uma classe,
de modo a padronizar os acessos dos dados da classe por meio de mtodos.
A seguir, sero apresentados alguns conceitos que permitem integrar classes de maneira a construir
um sistema coeso, relacionando as classes existentes.
6.1 Encapsulamento
Antes de entrarmos nos detalhes, vamos estudar um caso: abstrair uma conta corrente simples (veja
a figura a seguir). Simplificando ao mximo, temos um nome e o valor do dinheiro depositado (saldo).
Essa classe tem dois mtodos, uma para depsito e outra para saque, e as movimentaes acontecem
por meio deles.
94
ContaCorrente
+Nmero
+Saldo
+Depositar
+Sacar
95
Unidade III
Cdigo 40 Classe Program inicial
96
Com isso, o saldo passa a ter o valor novo, sendo desprezado o depsito anterior:
J que existe saldo disponvel, possvel fazer um saque de R$200.000,00, restando ainda com um
saldo para utilizar:
Cdigo 43 Saque de R$ 200.000,00
97
Unidade III
Acontece ento um problema srio: considerando a movimentao bancria simples, entre depsitos
e saques, houve uma perda de confiabilidade, pois no total foram depositados R$ 500,00 e sacados
R$200.000,00. O valor do saldo pode ser alterado por fora do objeto, permitindo acontecer o erro. Para
evitar esses problemas de acessos indevidos que se faz o encapsulamento.
O conceito de encapsulamento diz respeito ao uso de classes, a partir de seus mtodos pblicos,
por outras classes. Esse conceito nos diz como interligar classes onde existam dependncias. Ele o
mecanismo utilizado para disponibilizar mtodos, protegendo o acesso direto indevido aos atributos de
uma instncia (objeto). O encapsulamento evita a interferncia externa indevida de um objeto sobre os
dados de outros objetos a ele referenciados.
6.1.1 Modificadores de acesso
Uma das principais vantagens do paradigma da orientao a objetos a possibilidade de encapsular
os campos, bem como os mtodos capazes de manipular esses campos em uma classe. desejvel
que os campos das classes fiquem ocultos ou escondidos dos programadores usurios dessas classes
para evitar que os dados sejam manipulados diretamente, mas que sejam manipulados apenas por
intermdio dos mtodos da classe. A restrio ao acesso a atributos e mtodos em classes feita por
meio de modificadores de acesso que so declarados dentro das classes, antes dos mtodos e dos
campos. A restrio de acesso estabelecida na definio da classe usando um dos modificadores:
private, protected, public ou sem informao.
Modificador public: garante que o atributo ou mtodo da classe declarado com esse modificador
possa ser acessado ou executado a partir de qualquer outra classe, ou seja, sem restrio. Os
atributos e mtodos que devam ser acessados (e modificados, no caso de campos) precisam ser
declarados com ele.
Modificador private: atributos ou mtodos declarados com esse modificador s podem ser
acessados, modificados ou executados por mtodos da prpria classe, sendo completamente
ocultos para o programador usurio que usar instncias desta classe ou criar classes herdeiras
ou derivadas. Campos ou mtodos que devam ser completamente ocultos de usurios da classe
precisam ser declarados com este modificador.
Modificador protected: funciona como o modificador private, exceto pela diferena de que
classes herdeiras ou derivadas tambm tero acesso ao campo ou mtodo marcado com esse
modificador. Assim, permitido o acesso a todas as classes derivadas.
98
O simples fato de trocar o modificador escondeu o atributo saldo da classe Conta. Desse modo,
ele ficou inacessvel externamente, como demonstra a figura a seguir. Porm, a informao do saldo
necessria externamente. O fato de tirar o acesso direto ao atributo passou a limitar a visibilidade do
seu contedo.
99
Unidade III
Para tornar visvel externamente, criamos um mtodo (getSaldo()) para acessar a leitura apenas do
contedo do atributo saldo:
Cdigo 45 Mtodo getSaldo()
Dessa forma, o programa externo tambm necessita ser alterado. Agora o valor do atributo fica
disponvel apenas para a leitura passando pelo mtodo getSaldo():
100
Assim foi feito o encapsulamento do atributo saldo; porm, conforme as regras bsicas para
implementao de polticas para classes simples, recomendvel que todos os atributos fiquem private
ou protected, assim temos mais um atributo que est visvel para as outras classes, o nome. Como o
atributo nome poder ser alterado externamente, mas sem acesso direto, monta-se um mtodo para
inserir um valor ao atributo, conforme visto no cdigo a seguir. Para essa tcnica, d-se o nome de
getters e setters.
Cdigo 47 Get e set do Nome
O acesso a partir de outras classes feito por meio dos mtodos setNome(), para atribuir um valor a
nome, e getNome(), para receber o valor contido no atributo nome:
101
Unidade III
Cdigo 48 Trabalhando com getters e setters
O nome getNome e setNome apenas uma conveno. O get indica que um valor ser devolvido e
o set indica que um valor ser dado em um atributo chamado nome.
Temos no quadro a seguir um resumo completo do processo de encapsulamento de um atributo
pblico.
Quadro 18 Refatorao (encapsulamento) de um atributo pblico
A forma geral aceita em todas as linguagens OO de encapsulamento dos mtodos dos getters
e setters, porm a linguagem C# permite outras formas de encapsulamento. Uma delas encapsular
sem transformar em mtodo, mas criando uma varivel de passagem:
102
Dessa maneira, o atributo nome fica protegido por uma varivel de passagem Nome. No caso do
saldo, em que somente permitida a leitura, o encapsulamento fica conforme se ver no cdigo a
seguir. Sem dvida, economiza-se algumas linhas, mas perde-se a vantagem de acessar os atributos por
meio dos mtodos:
Cdigo 50 Encapsulamento apenas para a leitura
As classes foram atualizadas para que todos os atributos se tornassem privados (acessados apenas
pela classe a que pertencem) e com seus mtodos pblicos.
Dessa maneira, as classes ganharam uma padronizao:
103
Unidade III
Os valores dos atributos apenas sero alterados caso se utilize o mtodo correspondente.
Os valores dos atributos sero acessados apenas pelos mtodos correspondentes.
Classes construdas dessa forma garantem robustez e transparncia no desenvolvimento do sistema.
Posteriormente, veremos com mais detalhes a aplicao dessa vantagem.
Conta
nome : string
valor : double
dataVencimento : string
dataPagamento : string
TipoPagamento
nome : string
+getNome() : string
+setNome(nome : string) : void
+getNome() : string
+setNome(nome : string) : void
+getValor() : double
+setValor(valor : double) : void
+getDataVencimento() : string
+setDataVencimento(dataVencimento : string) : void
+getDataPagamento() : string
+setDataPagamento(dataPagamento : string) : void
Caixa
Categoria
nome : string
tipo : string
+getNome() : string
+setNome(nome : string) : void
+getTipo() : string
nome : string
saldo : double
+RetornaSaldo : double
+RetornaNome : string
+DefineSaldo(double valor) : void
As classes TipoPagamento, Categoria e Caixa (vistas nos cdigos a seguir) so bem simples. O
encapsulamento foi realizado utilizando a tcnica dos getters e setters do atributo nome, deixando
assim a classe mais simples e organizada.
104
105
Unidade III
Cdigo 53 Encapsulando a classe Caixa
Na classe Conta, conforme se ver no prximo cdigo, tambm houve o encapsulamento, porm
o nome dos mtodos foi mantido como na modelagem original propositalmente. Como os nomes dos
mtodos no so caracterizados pela presena das palavras get ou set, primeira vista tem-se a impresso
de que no est sendo efetuado o encapsulamento. Com a prtica, isso pode trazer problemas, j que o
uso dos getters e setters difundido e, sem o uso de uma padronizao, pode induzir o programador a
uma interpretao incorreta do programa.
Nessa classe tambm foi usado o encapsulamento especializado da linguagem C# no atributo nome,
que externamente visvel como Nome (com N maisculo).
106
107
Unidade III
Assim como na classe TipoPagamento, os mtodos de definio e recuperao de dados das
propriedades da classe Conta foram substitudos pelos set e get, respectivamente. Entretanto, as
propriedades categoriaConta, tipoPagamentoConta e caixaConta, como so heranas de outras classes
(conforme j vimos neste material), neste exemplo, so acessadas diretamente pelo usurio da classe,
pois os demais controles esto dentro de cada uma das respectivas classes.
Neste item, vimos na prtica o primeiro pilar da POO, o encapsulamento.
6.1.2 Modificador static
Os modificadores static tambm so conhecidos como campos estticos em classes. Os campos
estticos de uma classe so compartilhados por todas as instncias dela, isto , somente um valor ser
armazenado em um campo esttico e, caso esse valor seja modificado por uma das instncias da classe,
a modificao ser refletida em todas as outras instncias.
Campos estticos so declarados com o modificador static, que deve ser declarado antes do tipo
de dado do campo e pode ser combinado com modificadores de acesso como public e private. Campos
estticos tambm so conhecidos como campos de classes, j que esses campos podero ser acessados
diretamente usando o nome da classe, sem que haja a necessidade da criao de uma instncia da classe
e de uma referncia para tal instncia.
A palavra static possui as seguintes caractersticas:
utilizada nas declaraes de constantes globais e em valores que necessitam ser manipulados
em todas as classes.
Pode ser usada com classes, campos, mtodos, propriedades, operadores, eventos e construtores,
mas no com indexadores, destrutores ou tipos diferentes de classes.
Uma classe esttica no pode ser instanciada.
Uma mensagem pode ser direcionada diretamente a uma classe por meio de uma invocao a um
mtodo esttico.
A utilizao do modificador fica clara quando utilizamos um exemplo. No cdigo a seguir, temos um
programa que acrescenta um ao atributo seq no construtor da classe Exemplo:
108
Desse modo, a cada instncia criada, o atributo seq inicia com o valor 0; assim, cada uma das
instncias mostram o valor 1 contido no atributo nro:
Vamos alterar a classe Exemplo acrescentando o modificador static no atributo seq e executar o
mesmo programa:
109
Unidade III
Cdigo 56 Acrscimo do modificador static no atributo seq
Ao executar o programa, vemos que o atributo seq no mais zerado a cada nova instncia criada.
Quando a primeira instncia criada, o atributo seq tambm ; porm, ele ser o mesmo para todas
as instncias criadas. O atributo ficar esttico na memria; assim, a cada nova instncia, a contagem
prossegue, mantendo o valor relativo instncia anterior:
110
Jogador
- Nome
- idade
- attribute
Unidade III
desaparece. O exemplo mais tpico o do pedido de compras. Ele no existir se no houver itens, assim
como itens no fazem sentido se no estiverem agrupados em um pedido.
Pedido
Item Pedido
- Npedido
- Npedido
- Item
-CNPJ
- Produto
-Endereo
- Quantidade
- attribute
- Preo
- attribute
Como exemplo de associao, podemos criar uma classe chamada Motor, na qual temos como
caracterstica a quantidade de cilindros e o volume do motor em litros, e outra classe chamada Carro,
cujas caractersticas so a cor e o motor que o equipa.
Cdigo 57 Classe Motor
112
Inicialmente, montamos os motores AP1000 e AP1600; depois, quando feita a instncia dos carros,
os motores so colocados nos objetos. Note que a informao da capacidade do motor feita utilizando
duas referncias, crossFox e motor.
6.4 Reutilizao de classes
Uma das caractersticas mais interessantes de linguagens POO a capacidade de facilitar a reutilizao
de cdigo o aproveitamento de classes e seus mtodos que j estejam escritos e que j tenham o seu
funcionamento testado e comprovado. A reutilizao de cdigo diminui a necessidade de escrever novos
mtodos e classes, economizando o trabalho do programador e diminuindo a possibilidade de erros.
113
Unidade III
Existem dois mecanismos de reaproveitamento de classes em Java: delegao e herana. Com
delegao, usamos uma instncia de classe base como campo na nova classe e, com herana, criamos a
nova classe como uma extenso direta da classe base.
6.4.1 Delegao
O primeiro mecanismo de reaproveitamento de classes conhecido como delegao (ou composio,
o mesmo visto em associaes). Podemos criar novas classes que estendem outra classe base se
incluirmos uma instncia da classe base como um dos campos da nova, que ser ento composta de
campos especficos e de uma instncia de uma classe base. Para que os mtodos da classe base possam
ser executados, escreveremos mtodos correspondentes na classe nova que chamam os da classe base,
delegando dessa forma a execuo dos mtodos.
Podemos criar novas classes que estendem outra classe base se incluirmos uma instncia da classe
base como um dos campos da nova classe, que ser ento composta de campos especficos e de uma
instncia de uma classe base. Para que os mtodos da classe base possam ser executados, escreveremos
mtodos correspondentes na classe nova que chamam os da classe base, desta forma delegando a
execuo dos mtodos (SANTOS, 2003, p. 174).
Exemplo: considere a classe Data, que representa uma data, e a classe Hora, que representa uma
hora. Ambas contm mtodos que iniciam e verificam a validade de seus campos e imprimem os valores
de seus campos em um formato apropriado. Com essas classes podemos criar a classe DataHora, que
representa simultaneamente uma data e uma hora, sem que seja necessrio reescrever os campos e
mtodos contidos nas classes Data e Hora.
Cdigo 60 Classe Data
114
Os nicos campos na classe DataHora so uma instncia da classe Data e uma instncia da classe
Hora. Todas as informaes que devem ser representadas por uma classe DataHora estaro contidas
nessas instncias. Campos adicionais poderiam ser declarados, se fosse necessrio.
O primeiro construtor da classe DataHora recebe seis argumentos, correspondentes ao dia, ms, ano,
hora, minuto e segundo que devem ser representados pela classe DataHora, e repassa esses argumentos
para os construtores que iniciaro as instncias das classes Data e Hora. O construtor da classe DataHora
delega aos outros construtores a iniciao dos campos. O mesmo acontece com o segundo construtor
da classe DataHora, com a diferena que este considera que a hora , por padro, meia-noite.
O mtodo ToString tambm delega o seu funcionamento aos mtodos ToString das classes Data
e Hora, que retornaro strings que so concatenadas para criar o resultado da chamada do mtodo
ToString da classe DataHora.
115
Unidade III
Observao
A vantagem da reutilizao, neste exemplo, o fato de a nova classe
DataHora ser capaz de representar simultaneamente uma data e uma hora
sem ser muito complexa. A complexidade (capacidade de verificar se a data
ou hora esto corretas etc.) implementada pelos mtodos das classes
Data e Hora, que so simplesmente reutilizados.
Para completar o exemplo vamos implementar a classe Program para ver o mecanismo de delegao
funcionando:
Cdigo 63 Classe Program
Ao executarmos, o programa apresenta como sada o que se v na figura a seguir. Os valores 10, 5,
30, 12, 10 e 2014 so passados para o construtor da classe DataHora, que por sua vez monta a data
12/10/2014 e hora 10:05:30. Isso apresentado pelo mtodo ToString().
117
Unidade III
Observao
Os atributos criados por composio de classes no exemplo do cdigo
anterior foram definidos como atributos pblicos meramente para fins
didticos. A definio de um atributo ser ou no pblico vai depender
unicamente do objetivo da classe e da modelagem de dados realizada pelo
desenvolvedor do sistema. Tecnicamente, nada impede de definir esses
atributos como privados e criar mtodos especficos para acess-los.
Estamos prontos para testar o programa. Os atributos categoriaConta, tipoPagamentoConta e
caixaConta, neste exemplo, por serem delegaes de outras classes, so acessados diretamente pelo
usurio da classe, pois os demais controles esto dentro de cada uma das respectivas classes.
Um exemplo de como utilizar essas classes pode ser dado pelo programa exemplo ControleContas:
Cdigo 65 Classe para testar o Controle Financeiro
118
6.4.2 Herana
Herana um conceito muito parecido com a delegao, que j vimos anteriormente. No entanto,
seu objetivo a derivao de classes, ou seja, a criao de uma classe (classe filha) onde sua base uma
classe j existente (classe pai), sendo adicionados a essa nova classe apenas atributos e mtodos que no
existam na classe original ou a execuo de um mtodo que seja diferente do mtodo da classe original.
Em outras palavras, a herana um mecanismo de reaproveitamento em que as classes originais ficam
contidas na nova classe.
A reutilizao de classes via mecanismo de delegao til quando consideramos que a classe que
reutiliza instncias de outras classes composta destas. Um bom exemplo a classe DataHora, que
composta das classes Data e Hora, conforme vimos anteriormente.
Nem sempre o mecanismo de delegao o mais natural para a reutilizao de classes j existentes,
embora seja simples. Em especial, quando queremos usar uma classe para servir de base criao de
outra mais especializada, a relao de composio imposta pelo uso do mecanismo de delegao acaba
por criar solues pouco naturais. Tal recurso utilizado sempre que h necessidade de definir uma nova
classe que seja um caso particular da classe original.
A soluo a reutilizao de classes por meio do mecanismo de herana, no qual podemos criar uma
classe usando outra como base e descrevendo ou implementando as diferenas e adies da classe usada
como base, isso com a reutilizao dos campos e mtodos no privados da classe base. O mecanismo de
herana o mais apropriado para criar relaes -um entre classes.
No jargo das linguagens OO, a classe base, aquela que serve para a criao de classes
mais especializadas, chamada de superclasse (ou classe pai, ou classe base) e a que herda as
caractersticas da superclasse chamada de subclasse. Em UML, a relao de herana representada
por uma seta:
119
Unidade III
Superclasse
Subclasse
Lembrete
Herana no cpia, uma derivao! Alteraes realizadas na classe
Pai podero afetar a classe Filha, porm a classe Filha poder ser definida
com comportamentos distintos da classe Pai.
Uma das principais caractersticas da herana a reutilizao do cdigo de uma determinada
classe em outras classes. Herana um conceito-chave usado na programao orientada a objetos
para descrever uma relao entre as classes. Por meio da herana, uma classe copia ou herda todas as
propriedades, atributos e mtodos de uma outra classe, podendo assim estender sua funcionalidade.
A classe que cede os membros para a outra chamada superclasse, classe pai ou classe base. A classe
que herda os membros da outra classe chamada subclasse ou classe derivada.
A herana permite a reutilizao de cdigo e especifica um relacionamento de especializao/
generalizao do tipo um.
Em C#, a identificao de herana acontece colocando o nome da superclasse logo aps a declarao
da classe, que ser a subclasse:
Vamos construir tambm a Program que ir instanciar a classe Filho e executar o mtodo Junior:
Cdigo 67 Classe Program
Por enquanto, no existe novidade: ao ser executado, funciona como qualquer programa visto at
aqui, e o que temos a sada apresentada a seguir:
Uma instncia f criada usando new, que executa o construtor mostrando na tela que passou pelo
construtor. A seguir, o mtodo Junior da instncia f executado:
121
Unidade III
Vamos ento construir a superclasse Pai, assim como o Filho. H um aviso na tela que passou pelo
construtor e um mtodo que recebe uma string como parmetro. Veja:
Cdigo 68 Classe Pai
A classe Filho ser alterada para ser uma subclasse da classe pai:
122
Assim, se fizermos uma Classe Program simples, na qual a classe Filho instanciada, temos a sada
mostrada na figura a seguir:
Cdigo 70 Classe Filho sendo instanciada
O simples fato de instanciar uma classe Filho j consiste em mais de um processo. Para compreender,
vamos figura a seguir. A classe Filho, ao ser instanciada (1), pelo fato de ter a declarao de herana
:Pai, instancia a classe Pai (2). Assim como todo o processo de instanciao, a classe Pai executa o
construtor (3). Uma vez terminado o construtor, o comando devolvido para a classe Filho, que s
123
Unidade III
ento executa o seu construtor (4). Dessa forma, a sada (veja a figura anterior) mostra primeiro que o
programa passou pelo construtor do Pai e, ento, pelo construtor do Filho.
Uma vez compreendido o caminho seguido no processo de criar um objeto herdeiro, vamos ver
a principal caracterstica do mecanismo de herana, que a reutilizao dos atributos e mtodos.
Acrescentando-se a linha f.papi(do Junior); na classe Program, temos o cdigo a seguir:
Cdigo 71 Classe Program chamando um mtodo herdado
124
Unidade III
Vamos tomar como exemplo o cdigo classe Pai. Vamos colocar uma sobrecarga de construtor,
conforme visto no cdigo a seguir:
Cdigo 72 Classe Pai com sobrecarga de construtor
Na classe Filho, colocamos tambm uma sobrecarga de construtor; porm, esse construtor ir
direcionar para a classe Pai passando como parmento o valor recebido no processo de criao da
instncia pela chamada da base.
Cdigo 73 Classe Filho chamando a classe Pai
Assim, ao criamos uma nova instncia (veja o cdigo a seguir), o programa procura o construtor que
possui a assinatura string e esse construtor invoca a superclasse por meio da chamada base, procurando
tambm o construtor pai que possui a assinatura correspondente. Desse modo, apresentada a sada
que mostra o texto indicado pelo construtor cuja assinatura uma string da superclasse, conforme
ilustra a figura a seguir.
126
Unidade III
Mtodos declarados em uma subclasse com o mesmo nome mas assinaturas diferentes (por
exemplo, nmero de argumentos diferentes) dos mtodos da superclasse no sobrepem esses
mtodos
Mtodos podem ser sobrepostos com diferentes modificadores de acesso, contanto que os
mtodos sobrepostos tenham modificadores de acesso menos restritivos. Em outras palavras,
podemos declarar um mtodo na superclasse com o modificador private e sobrepor esse mtodo
em uma subclasse com o modificador public, mas no podemos fazer o contrrio.
Mtodos estticos declarados em classes ancestrais no podem ser sobrepostos em classes
descendentes, nem mesmo se no forem declarados como estticos.
Se um campo declarado em uma superclasse e oculto em subclasses e se mtodos que acessam
esse campo so herdados, tais mtodos faro referncia ao campo da classe onde foram declarados.
Por padro, as implementaes dos mtodos de uma superclasse no podem ser substitudas pelas
subclasses. Para alterar esse padro, devemos acrescentar o modificador virtual. e override na que tem
a mesma assinatura.
Para aplicar o conceito de sobreposio, vamos montar um programa com duas classes. A primeira
classe armazena o nome e o salrio de um empregado e retorna o valor do seu salrio:
Cdigo 75 Classe Empregado
A segunda classe de um comissionado, ou seja, uma especializao da classe dos empregados, j que
alm de receber um salrio ele recebe uma comisso extra. Por essa configurao, no necessrio criar
uma classe com todas as informaes de um empregado, bastando ento utilizar a classe Empregado
como superclasse da classe Comissionado:
128
129
Unidade III
Alterando a classe Program para criar a instncia de um comissionado, o CalculaPagto()
executado o da classe Comissionado, e no da classe Empregado (que utilizado apenas para
calcular o salrio base). Dessa forma, na sada do programa o salrio calculado a soma do salrio
base com a comisso:
Cdigo 78 Program para um empregado comissionado
131
Unidade III
Pessoas
-nome : String
+Pessoas(n : String)
+ToString() : String
Cliente
Funcionrio
+limCredito : double
+salario : float
Gerente
departamento : String
+Gerente(depto : String, sal : float, nome : String)
Banco
Principal
Figura 88 Diagrama de classes para montar o mtodo para calcular o valor do emprstimo
Estudamos anteriormente a converso das classes em C#. A classe Pessoa (veja a figura a seguir) tem
dois mtodos, o construtor e um chamado ToString(). O mtodo ToString() tem uma palavra em especial
chamado override veremos isso mais tarde, quando estudarmos as hierarquias de classes.
132
Assim como a classe Cliente, a classe Funcionario, vista na figura a seguir, herdeira da classe Pessoa.
Assim, ela s implementa o atributo salrio, cujo valor passado pelo construtor, e o nome passado
para o construtor da superclasse.
133
Unidade III
A classe Gerente, vista na prxima figura, herdeira de Funcionrio. Isso quer dizer que ele especifica
a classe Funcionrio, que j uma especializao de Pessoa. Dessa forma, o construtor recebe como
parmetro o nome, que atributo da classe Pessoa; o salrio, que atributo de Funcionario; e o
departamento, que um atributo da prpria classe.
A classe Banco (veja a figura a seguir) requer uma ateno especial. nela que est o mtodo
polimrfico valorEmprstimo.
134
Portanto, qualquer objeto da classe Pessoa e seus descendentes sero aceitos como parmetro.
Quando vimos o modelador cast, observamos que ele tem um operador que verifica se um objeto
uma instncia de uma classe. No programa, ao executar a condicional:
o programa reconhece que p da classe Gerente. O mesmo feito para as opes de Funcionario e
Cliente.
Para testarmos o polimorfismo do mtodo valorEmprestimo, vamos executar algumas vezes
o programa alterando as instncias entre as diversas classes. O objetivo verificar se o mtodo
valorEmprestimo pode receber diferentes tipos como parmetro e funcionar sem problemas, devolvendo
o valor correto.
No primeiro teste, visto no cdigo a seguir, cria-se uma instncia, f1 (lembrando que na verdade
uma referncia, mas aqui, para facilitar, assumimos como ele sendo a prpria instncia), de um
funcionrio. Essa instncia passada para o mtodo valorEmprstimo().
Cdigo 79 Testando para um objeto da classe Funcionario
135
Unidade III
Ao executar, verificamos que o mtodo recebeu sem problema um objeto que uma instncia da
classe Funcionrio, conforme a figura a seguir. Sendo um Funcionrio que tem como salrio R$ 3000,00,
ele tem direito a um emprstimo de cinco vezes o seu salrio. Portanto, o clculo resulta em R$ 15.000,00.
O segundo teste para outra instncia de Funcionrio, agora sendo referenciado como do tipo
Pessoa:
Cdigo 80 Testando para um objeto a classe Funcionario, porm,
sendo declarado como uma pessoa
Como o funcionrio f2 recebe R$ 4000,00, ele dever ter direito a receber R$ 20.000,00 de emprstimo.
Com o teste anterior, foi verificado que o mtodo no tem problema com objetos de classe Funcionario:
136
O valor do emprstimo para gerente de dez vezes o valor do seu salrio. Assim, como o salrio de
R$ 5.000,00, o programa mostra que o valor do emprstimo de R$ 50.000,00 (veja a figura a seguir).
Assim, j se pode afirmar que o mtodo valorEmprestimo polimrfico, pois funcionou sem problemas
tendo mais de um tipo diferente como entrada.
Para completar o teste, vamos verificar com uma classe que no tem relao alguma com funcionrio
e gerente, pois o valor do emprstimo relacionado com o valor do salrio. O cliente tem direito de
emprstimo ao dobro do valor do seu limite.
Uma instncia da classe Cliente, c1, criada tendo como valor do seu limite R$ 3.500.00:
Cdigo 82 Testando para um objeto da classe Cliente
137
Unidade III
Assim, o programa mostra que o valor do emprstimo de R$ 7.000,00:
Mostrou-se com isso que o mtodo valorEmprstimo funcionou sem problemas com entradas
de objetos de diferentes tipos. Esta , na prtica, a caracterstica do polimorfismo: a possibilidade de
trabalhar com diferentes tipos e classes.
Encerramos assim os trs pilares da POO: o encapsulamento, a herana e, neste item, o polimorfismo.
Saiba mais
Para aqueles que pretendem desenvolver jogos, existe um poderoso
programa para isso, o Unity 3D. Para o seu uso, fundamental a noo de
orientao a objeto, pois nele os conceitos de classes, objetos e herana so
aplicados diretamente no desenvolvimento de jogos. Uma das linguagens
para o desenvolvimento de scripts para o jogo o C#. Existe uma verso
gratuita para aqueles que gostariam de iniciar o seu aprendizado em:
UNITY. Create the games you love with Unity. [s.d.]. Disponvel em:
<http://unity3d.com/unity>. Acesso em: 29 out. 2014.
6.6 Objetos
Assim como uma varivel, uma classe, ao ser instanciada, se torna um objeto; este, por sua vez, se
torna residente em memria.
Tecnicamente, quando os objetos esto instanciados, trabalhamos com sua referncia em memria,
no com o objeto em si. Esse fato diferencia os objetos das variveis (ou tipos primitivos, tais como
double e int), pois nas variveis trabalhamos com o valor que realmente est em memria.
Na maioria das linguagens de programao, todo objeto, uma vez instanciado, deve ser destrudo, ou
seja, retirado da memria. Porm, plataformas de programao mais modernas possuem um conceito
chamado garbage collector (coletor de lixo), que retira da memria objetos no mais referenciados
automaticamente.
138
Observao
Os conceitos de encapsulamento, herana, polimorfismo e controle de
objetos sero detalhados mais adiante.
Resumo
Nesta unidade vimos os principais conceitos da programao orientada
objetos e a sua programao utilizando a linguagem C#. Conhecemos a
construo de uma classe, o seu processo de transformar em objeto e os
relacionamentos entre as classes. Vale ressaltar que cada classe corresponde
a uma entidade em nosso sistema com um objetivo nico e claro e que a
classe e o objeto so coisas distintas: a classe a definio da entidade
e o objeto a implementao alocada em memria que ser utilizada
efetivamente pelo sistema. Vimos tambm que o procedimento de criar
objetos (new) chamado de instanciar objetos.
Nesta unidade tambm foram abordados conceitos como atributos, as
caractersticas de uma classe e a sua ao por meio dos mtodos. Vimos
os mtodos especiais como o construtor, que inicializa uma classe, e a
sobrecarga, na qual mtodos de mesmo nome podem estar numa mesma
classe desde que tenham diferentes assinaturas e o nome e a sequncia de
tipos dos parmetros tambm diferentes. Com os mtodos, vimos tambm
a tcnica para fazer o encapsulamento e o isolamento dos atributos dentro
de uma classe.
Encerramos vendo como as classes se relacionam com as associaes,
em que uma classe utiliza outra como atributo, e a herana, em que uma
classe criada usando outra como base. A utilizao de herana gera
hierarquia de classes, ou seja, a estrutura de quais so as superiores (ou
classes Pai) e quais so as subclasses (ou classes filho). Graas herana e
sobrecarga, possvel haver o polimorfismo, em que um mesmo mtodo
consegue tratar vrios tipos de informao.
139