Вы находитесь на странице: 1из 82

Unidade III

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

Programao orientada a objetos


Variveis
Atributos

Procedimentos

Mtodos

Funes

Mtodos

Operaes matemticas e lgicas

Operaes matemticas e lgicas

Laos e desvio condicionais

Laos e desvio condicionais

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

Programao Orientada a Objetos I


5 Conceitos bsicos
5.1 Abstrao

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

Programao Orientada a Objetos I

Figura 33

E o de recepo :

Figura 34

5.3 Classes

O desenvolvimento de classes o resultado da abstrao. Uma vez definidos os devidos escopos,


teremos condies de pensar em termos de classes.
fcil notar que muitos objetos possuem caractersticas estruturais semelhantes, embora todo
objeto seja nico. Um bom exemplo disso so os objetos que recebem a denominao genrica
de carro. Todos os carros possuem uma mesma estrutura, ou seja, todos os objetos carro
implementam os mesmos mtodos e mantm informaes sobre os mesmos atributos. O fato de
que cada objeto mantm seus prprios atributos de forma encapsulada confere uma identidade
nica a cada objeto e tambm permite que dois objetos possam, eventualmente, possuir valores
iguais para seus atributos.
Esses grupos de objetos com estruturas semelhantes so definidos em termos de classes.
Classes consistem na unidade bsica da construo de um programa OO e definem o conjunto
de atributos mantidos por um conjunto de objetos e o comportamento que esses objetos devem
respeitar.
5.3.1 Classes em C#
O conceito de classe genrico e pode ser aplicado em diversas linguagens de programao.
Mostraremos como a classe Conta poderia ser escrita utilizando a linguagem C#. Neste momento sero
apresentados apenas os atributos os mtodos sero abordados posteriormente.

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

Programao Orientada a Objetos I


Analisando o escopo definido, podemos encontrar as seguintes classes:
Conta: so os dados das minhas contas a pagar ou a receber.
Categoria: tipo de conta, ou seja, se so contas de telecomunicao, combustvel, salrio,
dividendos etc.
Tipo de pagamento: modalidade de pagamento, tais como dinheiro, carto, depsito etc.
Caixa: lugares onde foi usada a modalidade de pagamento. Pode ser uma carteira ou uma conta
do banco.
A princpio, so essas as classes que iremos abstrair do mundo real para modelar nosso sistema em
POO. O grande conceito neste ponto do nosso trabalho : cada classe dever ter um nome nico.
Nunca poderemos ter duas classes distintas com nomes iguais. Recomenda-se, alis, que o nome da
classe seja um que condiga com seu objetivo, ou seja, evitar codificaes do tipo:
SCFF_C001, onde: S=Sistema; C=Controle; F=financeiro; F=familiar; C=Classe; 001=Classe conta;
Organizao bom, mas nomes codificados atrapalham o processo de desenvolvimento de software,
ainda mais se o trabalho for feito em equipe, como normalmente .
Recomenda-se tambm que o nome da classe seja escrito com letras minsculas, porm, a primeira
letra deve ser maiscula. Em caso de nomes de classes com palavras compostas, a primeira letra de cada
palavra deve ser maiscula e as demais, minsculas. Exemplo: TipoPagamento.
Lembrete
A POO foi criada para facilitar, para tratar o desenvolvimento de
software de uma maneira mais orgnica e mais prxima do ser humano,
deixando assim o processo de desenvolvimento de software mais gil e
robusto. A simplicidade a chave!
As seguintes classes foram definidas:
Conta

Categoria

TipoPagamento

Caixa

Figura 35 Classes iniciais definidas para o controle financeiro familiar

As classes desse exemplo, traduzidas para o C#, so apresentadas no cdigo a seguir:


63

Unidade III
Cdigo 19 Apenas as classes do controle financeiro

5.3.1.1 Criao de objetos em C#


O comando para criar objetos o new. Veja:

Figura 36 Objeto criado a partir da classe Conta

Se quisermos criar trs objetos na memria, utilizamos trs comandos new:


64

Programao Orientada a Objetos I

Figura 37 Trs objetos criados a partir da classe Conta

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

Figura 38 criada uma varivel do tipo Conta

Como vimos anteriormente com o comando new, um objeto alocado em algum lugar da memria:

Figura 39 O objeto criado

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

Programao Orientada a Objetos I

Figura 40 Passagem da referncia para a varivel

A partir de ento, o objeto passar a ser referenciado pelo nome dessa varivel:

Figura 41 Acesso ao objeto por meio da referncia

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

Programao Orientada a Objetos I

Figura 42 Objetos r2d2 e c3po criados

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:

Figura 43 Atributos dos objetos recebendo valores

69

Unidade III
A sada do programa conforme o cdigo anterior mostrado na figura a seguir:

Figura 44 Sada do programa no exemplo dos robs

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

Programao Orientada a Objetos I

Figura 45 Sada do Exemplocarro

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

Ao executarmos, temos como sada a seguinte figura:

Figura 46 Resultado da passagem de endereo

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

Programao Orientada a Objetos I


Percebe-se que, por exemplo, o atributo nome utilizado em todas as classes. Porm, cada classe
tem o seu atributo nome, ou seja, o mesmo atributo no est sendo compartilhado entre as classes.
Existe o nome da Conta, o nome da Categoria, o nome do TipoPagamento e o nome do Caixa.
Esses atributos correspondem s caractersticas necessrias dentro do escopo de cada classe; portanto,
perfeitamente possvel que algumas classes inmeros atributos e outras classes tenham apenas um
atributo. A necessidade de mais ou menos atributos em cada classe vai depender da utilizao e da
integrao da classe em relao ao projeto.
Um grande erro que pode ocorrer neste estgio a redundncia de atributos. Redundncia de
atributos significa a existncia da mesma informao sendo utilizada por diferentes classes de maneira
no compartilhada.
Observao
Os meios de integrao entre classes no projeto sero vistos em tpicos
mais avanados.
Observao
No podemos ter preguia na hora de definir o nome do atributo, assim
como suas quantidades. Especifique corretamente o nome, no importando
o nmero de caracteres utilizados, e seja coerente com a necessidade de
atributos na classe.
recomendado realizar, desde o incio do projeto mais simples, uma documentao sobre suas
classes. Como o escopo deste material no o gerenciamento do projeto, ser utilizada aqui uma forma
bem simples, porm eficiente, de documentar sua classe. Veja o quadro a seguir:
Quadro 15 Descritivo dos atributos em cada classe
Classe

Atributo

Descrio

Conta

Nome

Nome da conta. Usado para descrever a conta em si.

Valor

Valor da conta.

dataVencimento

Data de vencimento da conta.

dataPagamento

Data do pagamento efetivo da conta.

Nome

Nome da categoria.

Categoria

Tipo

Tipo da categoria, pode ser crdito ou dbito.

TipoPagamento

Nome

Nome da modalidade de pagamento. Exemplo:


dinheiro, cheque, carto, depsito.

Caixa

Nome

Nome do caixa.

Saldo

Valor disponvel no caixa.

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

Tipo numrico inteiro com sinal de negativo.

Double

Tipo numrico real com sinal de negativo.

Bool

Tipo lgico. Armazena verdadeiro (true) ou falso (false).

String

Tipo texto. Armazena uma cadeia de caracteres.

DateTime

Tipo data e hora.

Logo, seguindo as especificaes e necessidades de cada atributo de nossas classes, temos os


seguintes diagramas:
Conta

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

Programao Orientada a Objetos I

Figura 49 Passagem do diagrama de classes para o cdigo

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

Dando continuidade ao trabalho de abstrao, abordaremos o conceito de mtodos. Um mtodo


corresponde a uma ao (operao ou comportamento) que uma classe pode realizar.
Cada mtodo funciona de forma independente, sendo utilizado apenas quando a ao solicitada.
Todo o mtodo criado seguindo uma sintaxe (regras):
As tarefas que um objeto pode realizar so definidas pelos seus mtodos.
Os mtodos so os elementos bsicos para a construo dos programas OO.
Mtodos no podem ser criados dentro de outros mtodos ou fora de uma classe.
Chamada do mtodo:
nomeDaInstancia.nomeDoMetodo(parmetros).
Todo o mtodo dividido em trs partes:
nome do mtodo;
argumentos (ou parmetros);
retorno.
76

Programao Orientada a Objetos I


Todo o mtodo deve ter um nome coerente com sua funo.
Recomenda-se que o nome de cada mtodo seja escrito com a primeira letra maiscula e as
demais, minsculas. Em caso de nomes compostos, a primeira letra de cada palavra inicia-se
maiscula e as demais, minsculas. Exemplo: RetornaSaldo().
Os argumentos so declarados entre parnteses.
Os mtodos podem ter quantos argumentos forem necessrios e no obrigatrio que haja
argumentos.
Os mtodos podem retornar alguma resposta em relao ao realizada, porm no obrigatrio
retornar algum valor.
Assim como nos atributos, mtodos podem ser pblicos ou privados.
Os mtodos so, na prtica, onde ser realizada a programao em si, ou seja, onde a inteligncia da
classe ser definida e onde sero executadas as funes que a classe se prope a realizar.
Portanto, todos os conceitos da programao estruturada se aplicam na programao dos mtodos
das classes, ou seja, variveis, desvios condicionais, operaes matemticas e laos (loop) sero utilizados.
5.5.1 Mtodos em C#
Os mtodos so definidos dentro de uma classe. Durante a execuo de um programa, um mtodo
pertencente a um objeto, desde que declarados pblicos podem ser acessados tanto pela referncia da
instncia quanto pelo nome do mtodo.

Figura 50 Forma geral da chamada de mtodo

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

Figura 51 Forma geral de um mtodo

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

Na classe ContaCorrente no C#, digitamos os mtodos depositar e sacar acumulando e retirando,


respectivamente, do valor do saldo. Veja o cdigo a seguir:

78

Programao Orientada a Objetos I


Cdigo 23 Inserindo mtodos na classe ContaCorrente

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).

Temos a aplicao de um mtodo construtor em uma classe no cdigo a seguir:


Cdigo 24 Mtodo construtor

80

Programao Orientada a Objetos I


Acompanhando o processamento do programa na figura a seguir, ao ser criado o objeto pessoa1 (1)
pelo comando new, imediatamente o sistema passa a executar o mtodo construtor (2).

Figura 53 Processamento do construtor

Assim ao executar esse cdigo, mesmo sem receber os valores no programa principal, os atributos
aparecem inicializados na figura a seguir:

Figura 54 Sada do programa do cdigo anterior

Exemplo: controle financeiro


Como j vimos a teoria, vamos agora implementar os mtodos construtores padro nas nossas
quatro classes. Neste momento, o construtor s usado para inicializar com valores neutros as classes
quando feito o processo de criao das instncias, conforme visto nos cdigos a seguir:
Cdigo 25 Implementando o mtodo construtor na classe TipoPagamento

81

Unidade III
Cdigo 26 Implementando o mtodo construtor na classe Categoria

Cdigo 27 Implementando o mtodo construtor na classe Caixa

Cdigo 28 Implementando o mtodo construtor na classe Conta

5.5.3 Sobrecarga de mtodos


Conforme a necessidade, til ou interessante ser possvel executar um mtodo em uma classe
passando mais ou menos argumentos. Linguagens orientadas a objeto permitem a criao de mtodos
com nomes iguais, contanto que as suas assinaturas sejam diferentes. Na programao estruturada,
82

Programao Orientada a Objetos I


inimaginvel ter dois ou mais funes com o mesmo nome. A assinatura de um mtodo composta de
seu nome mais os tipos de argumentos que so passados para esse mtodo, independentemente dos
nomes de variveis usadas na declarao do mtodo.
O tipo de retorno no considerado parte da assinatura; no podemos ter dois mtodos com o
mesmo nome e tipo de argumentos mas tipo de retorno diferente.
A possibilidade de criar mais de um mtodo com o mesmo nome e assinaturas
diferentes conhecida como sobrecarga de mtodos. A deciso sobre qual
mtodo ser chamado quando existem dois ou mais mtodos ser feita pelo
compilador, baseado na assinatura dos mtodos (SANTOS, 2003, p. 77).

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.

Figura 55 Assinatura vazia

Figura 56 Assinatura String

Figura 57 Assinatura int

Figura 58 Assinatura string 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

Programao Orientada a Objetos I


int presentes no programa. Portanto, a ordem dos tipos considerada na
assinatura.
No exemplo do mtodo construtor, ao incluirmos a classe a seguir no momento em que a nova
instncia criada, o sistema procura o construtor que possui a mesma assinatura e o executa (veja a
figura a seguir).
Cdigo 30 Chamada de um mtodo sobrecarregado

Figura 59 Chamada de mtodo sobrecarregado

Assim sendo, o atributo nome assume o valor passado como parmetro:

Figura 60 Sada do cdigo anterior

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:

Figura 61 Sada do cdigo anterior

86

Programao Orientada a Objetos I


5.5.4 A palavra-chave this
Um mtodo pode chamar outro mtodo de uma mesma classe. Para os construtores, a tarefa mais
complicada (no se pode chamar um construtor diretamente). Ento, criada internamente para cada
instncia uma auto referncia, ou seja, uma referncia prpria instncia. Essa referncia representada
pela palavra-chave this. Para chamar um construtor de dentro do outro, basta usar a palavra-chave this
substituindo o nome do construtor. Construtores no podem ser chamados indiscriminadamente de dentro
de qualquer mtodo; existem algumas regras para a chamada de construtores, conforme se ver a seguir:
Somente construtores podem chamar construtores como sub-rotinas.
Se um construtor for chamado a partir de outro, a chamada deve ser a primeira linha de cdigo
dentro do corpo do construtor.
Construtores no so chamados pelos seus nomes, e sim por this.
Construtores podem chamar outros mtodos. Por exemplo, pode ser interessante ter um construtor
e um mtodo que iniciem as instncias e chamar o mtodo de dentro do construtor. Mtodos no
podem chamar construtores, nem mesmo com this.
Construtores no podem ser chamados recursivamente. Um construtor s pode chamar
diretamente outro construtor e no a si prprio.
O uso mais imediato como uma autorreferncia dos atributos dentro do objeto (veja o cdigo a
seguir). Nele, a palavra-chave passa a se referir diretamente aos atributos da classe.
Cdigo 32 Autorreferncia this

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.

Figura 62 This especificando um atributo

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

Programao Orientada a Objetos I


Cdigo 33 Alterando o cdigo da sobrecarga de mtodos para utilizar o this

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

Cdigo 35 Uso do this e sobrecarga do construtor na classe Categoria

90

Programao Orientada a Objetos I


Cdigo 36 Uso do this e sobrecarga do construtor na classe Caixa

Cdigo 37 Uso do this e sobrecarga do construtor na classe Conta

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

Assim, alteramos o cdigo da classe Caixa para incluir os mtodos recm-modelados.

92

Programao Orientada a Objetos I


Cdigo 38 Inserindo os mtodos na classe Conta

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

Programao Orientada a Objetos I

ContaCorrente
+Nmero
+Saldo
+Depositar
+Sacar

Figura 64 Classe conta corrente simples

A codificao dessa classe fica:


Cdigo 39 Classe Conta

Acrescentamos a classe Program, na qual faremos alteraes.

95

Unidade III
Cdigo 40 Classe Program inicial

A sada inicial mostra a conta inicializada com o saldo zero:

Figura 65 Sada inicial do programa

Continuando, com o programa acrescentaremos um depsito de R$ 500,00:


Cdigo 41 Depsito de R$ 500,00

Com isso, o valor do saldo fica atualizado:

Figura 66 Saldo aps o depsito

96

Programao Orientada a Objetos I


Agora, vamos acessar diretamente o atributo saldo do objeto ccJF e mudar para R$1.000.000,00.
Cdigo 42 Mudana no saldo

Com isso, o saldo passa a ter o valor novo, sendo desprezado o depsito anterior:

Figura 67 Saldo aps a alterao direta

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

Figura 68 Saldo aps o saque

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

Programao Orientada a Objetos I


As regras bsicas para implementao de polticas para classes simples so:
Todos os campos de uma classe devem ser declarados com o modificador private ou protected,
ficando assim ocultos para o programador usurio dessas classes.
Mtodos que devam ser acessveis devem ser declarados explicitamente com o modificador public.
Como a princpio os campos tero o modificador private, mtodos que permitam a manipulao
controlada dos valores dos campos (conhecidos por mtodos getters e setters ou
encapsulamento) devem ser escritos nas classes e ter o modificador public.
Na medida do necessrio, os mtodos de uma classe podem ser declarados com o modificador
private esses mtodos no podero ser executados por classes escritas por programadores
usurios, mas podero ser executados por outros mtodos dentro da mesma classe.
Com esses conceitos, podemos voltar ao problema do acesso direto ao saldo da classe Conta.
Para evitar que o saldo no possa ser modificado externamente, vamos trocar o modificador do
atributo saldo para private:
Cdigo 44 Alteraao no modificador do atributo saldo

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.

Figura 69 Mensagem de erro provocada pela alterao do modificador

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

Programao Orientada a Objetos I


Cdigo 46 Alterao no acesso externo para visualizar o valor do atributo saldo

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

Programao Orientada a Objetos I


Cdigo 49 Encapsulamento no C#

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

+setTipo(tipo : string) : void


Figura 70 Classes do controle financeiro familiar com a classe Caixa, seus mtodos e seus respectivos
qualificadores de acesso: pblico (+) e privado (-)

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

Programao Orientada a Objetos I


Cdigo 51 Encapsulando a classe TipoPagamento

Cdigo 52 Encapsulando a classe Categoria

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

Programao Orientada a Objetos I


Cdigo 54 Encapsulamento alm de utilizar as palavras get e set na classe Conta

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

Programao Orientada a Objetos I


Cdigo 55 Programa sem o modificador static

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:

Figura 71 Sada sem o modificador

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:

Figura 72 Resultado com o modificador static

110

Programao Orientada a Objetos I


6.2 Associaes

Uma associao representa um relacionamento entre classes e fornece a semntica comum e a


estrutura para muitos tipos de conexes entre objetos.
Em uma associao, determina-se que as instncias de uma classe esto de alguma forma ligadas s
instncias das outras classes envolvidas na associao, podendo haver troca de informaes entre elas
e compartilhamento de mtodos, mesmo que determinada instncia de uma das classes origine uma ou
mais instncias nas outras classes envolvidas na associao.
As associaes so representadas por retas ligando as classes envolvidas, podendo tambm possuir
setas em suas extremidades para indicar a navegabilidade da associao, o que representa o sentido em
que as informaes so transmitidas entre as classes envolvidas. Quando no houver setas, significa que
as informaes podem trafegar entre todas as classes da associao.
Alm disso, as associaes tambm podem possuir ttulos para determinar o tipo de vnculo
estabelecido entre as classes. Embora no seja obrigatrio definir uma descrio para a associao, til
determinar um nome para ela quando necessria alguma forma de esclarecimento.
As associaes representam o equivalente mais prximo dos relacionamentos utilizados no modelo
entidade-relacionamento, ou seja, seu objetivo definir a maneira como as classes esto unidas e se
relacionam entre si, compartilhando informaes (GUEDES, 2006, p. 72).
6.3 Agregao e composio

Agregao um tipo especial de associao em que se tenta demonstrar que as informaes de um


objeto (chamado objeto-todo) precisam ser complementadas pelas informaes contidas em um ou
mais objetos de outra classe (chamado objeto-parte). Ela define uma dependncia fraca entre as classes,
ou seja, os objetos continuam existindo mesmo que o todo seja removido. Assim, se temos um time de
basquete e pessoas como jogadores, ambos existiro independentemente.
Time
- Tecnico
-Uniforme

Jogador
- Nome
- idade
- attribute

Figura 73 Exemplo de agregao

Constitui-se numa variao da associao de agregao. A composio tenta representar um vnculo


mais forte entre os objetos-todo e os objetos-parte, procurando demonstrar que os objetos-parte tm
de pertencer exclusivamente a um nico objeto-todo com que se relacionam.
Em uma composio, um mesmo objeto-parte no pode se associar a mais de um objeto-todo.
Assim, se o todo deixar de existir, as partes deixam de existir e, se as partes deixarem de existir, o todo
111

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

Figura 74 Exemplo de composio

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

Cdigo 58 Classe Carro

112

Programao Orientada a Objetos I


Assim, para criarmos trs carros, um Gol 1000 vermelho, um Fox 1.0 prata e um CrossFox 1.6 amarelo,

Figura 75 Instncias de carro com diferentes motorizaes

teremos a seguinte montagem:


Cdigo 59 Montagem dos trs Carros

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

Programao Orientada a Objetos I


Cdigo 61 Classe Hora

Cdigo 62 Classe DataHora

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().

Figura 76 Sada do programa de delegao DataHora

Exemplo: controle financeiro


Para demonstrar o efeito do encapsulamento, o cdigo a seguir mostra trs composies criadas na
classe Conta: categoriaConta, tipoPagamentoConta e caixaConta.
Quando um atributo definido como uma classe, no nosso caso, o atributo categoriaConta do tipo
Categoria, um exemplo de composio. Dizemos ento que a classe Categoria est encapsulada dentro
da classe Conta a partir do atributo categoriaConta.
116

Programao Orientada a Objetos I


Cdigo 64 Composio das classes Categorias, TipoPagamento e Caixa na classe Conta

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

Programao Orientada a Objetos I


No programa, so criadas trs instncias, sendo o valor e a descrio passados pelo construtor e o
Tipo e a Categoria, pelos setters das instncias dentro de cada objeto. Da mesma forma, na sada para a
tela, as informaes so acessadas pelos mtodos getters, exceto o Nome (com N maisculo), que vem
de um mtodo particular do C#:

Figura 77 Sada do controle financeiro

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

Figura 78 UML do mecanismo de herana entre as classes

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:

Figura 79 Declarao da herana

Para entender o funcionamento do mecanismo de herana, vamos montar o processo passo a


passo. Inicialmente, vamos construir uma classe simples chamada Filho, com um construtor que
mostrar o texto construtor Filho, e um mtodo chamado Junior, que mostrar na tela sou o
mtodo Junior:
120

Programao Orientada a Objetos I


Cdigo 66 Classe Filho

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:

Figura 80 Sada do programa simples

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

Figura 81 Execuo do programa simples

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

Programao Orientada a Objetos I


Cdigo 69 Classe Filho herdeiro do Pai

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

Figura 82 Sada da classe Filho herdeira

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.

Figura 83 Percurso da instanciao de uma classe herdeira

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

Programao Orientada a Objetos I


O mtodo papi() est na classe Pai; porm, para quem utiliza a instncia da classe Filho como se o
mtodo estivesse na prpria classe Filho. Veja a sada do programa:

Figura 84 Sada do programa usando um mtodo herdado

6.4.3 Referncia superclasse


As classes derivadas ou subclasses podem ter acesso a mtodos das superclasses usando a palavrachave base. O acesso a mtodos de classes ancestrais til para aumentar a reutilizao de cdigo. Se
existem mtodos na classe ancestral que podem efetuar parte do processamento necessrio, devemos
usar o cdigo que j existe em vez de reescrev-lo.
Algumas regras para o uso da palavra-chave base para chamar mtodos de classes ancestrais como
sub-rotinas so:
Construtores so chamados simplesmente pela palavra-chave base seguida dos argumentos a
serem passados para o construtor entre parnteses na declarao do construtor da subclasse,
separado por dois pontos (:). Se no houver argumentos, a chamada deve ser feita como :base().
Mtodos so chamados pela palavra-chave base seguida de um ponto e do nome do mtodo. Se
houver argumentos a serem passados para o mtodo, estas devem estar entre parnteses, aps o
nome do mtodo; caso contrrio, os parnteses devem estar vazios.
Construtores de superclasses s podem ser chamados de dentro de construtores de subclasses
e, mesmo assim, somente se forem declarados na primeira linha de cdigo do construtor da
subclasse.
Somente os mtodos e construtores da superclasse imediata podem ser chamados usando a
palavra-chave base no existem construes como base.base que permitam a execuo de
mtodos e construtores de classes ancestrais da classe ancestral. Caso seja necessrio executar o
construtor de uma classe ancestral da prpria classe ancestral, os construtores podem ser escritos
em cascata, de modo que o construtor da classe C chame o construtor da classe B que por sua vez
chame o construtor da classe A.
Se um mtodo de uma classe ancestral for herdado pela classe descendente, ele pode ser chamado
diretamente sem a necessidade da palavra-chave base.
125

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

Programao Orientada a Objetos I


Cdigo 74 Classe Program chamando o construtor com assinatura string

Figura 85 Sada do programa com chamada para a classe base

6.4.4 Sobreposio e ocultao


Os mtodos das classes especficas tm prioridade sobre os mtodos das classes genricas. Se o
mtodo chamado existir na classe Filha, ele que ser chamado; se no existir, o mtodo ser procurado
na classe Me.
Quando definimos um mtodo com a mesma assinatura na classe base e em alguma classe derivada,
estamos aplicando o conceito de reescrita de mtodo, sobreposio ou superposio.
A razo de sobrepormos mtodos que mtodos de classes herdeiras geralmente executam tarefas
adicionais que os mesmos mtodos das classes ancestrais no executam.
A declarao de campos em uma classe descendente com o mesmo nome de campos declarados na
classe ancestral chama-se ocultao. Ao contrrio da sobreposio de mtodos, que bastante til em
classes herdeiras, a ocultao de campos no oferece muitas vantagens e as poucas oferecidas podem
facilmente ser implementadas por meio de mtodos que retornam valores e so superpostos de acordo
com a necessidade.
As principais regras de sobreposio de mtodos e ocultao de campos e de uso de modificadores
de acesso em classes herdadas so as seguintes:
A sobreposio de um mtodo em uma subclasse no elimina o acesso ao mtodo de mesma
assinatura na classe ancestral este pode ser acessado, de dentro da classe herdeira, com a
palavra-chave base, contanto que no tenha sido declarado como private.
127

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

Programao Orientada a Objetos I


Cdigo 76 Classe Comissionado

Ambas as classes possuem o mtodo CalculaPagto(), se considerarmos sem as palavras-chaves


virtual e override. Para uma classe externa, haveria um srio problema. Como a classe Comissionado tem
o mtodo CalculaPagto() e ele estende a classe Empregado, que tambm tem o mesmo mtodo com a
mesma assinatura, a viso externa seria de uma classe com dois mtodos iguais. Dessa forma, para uma
referncia externa, utilizam-se as palavras virtual para o mtodo sobreposto e override para o mtodo
superposto. A linguagem C# no obriga o uso das palavras sem resultar em erro, porm o editor avisa
(warning) que existe um problema.
Ao executarmos o programa criando a instncia para um empregado normal, o mtodo CalculaPagto()
o da classe Empregado, resultando apenas no salrio base:
Cdigo 77 Program para uma instncia de empregado normal

Figura 86 Sada do clculo do empregado simples

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

Figura 87 Sada do clculo do comissionado

Neste momento, temos completo o segundo pilar da POO, a herana.


6.5 Polimorfismo

O polimorfismo est relacionado com o conceito de herana, especificamente em relao a mtodos.


O mecanismo de herana permite a criao de classes a partir de outras j existentes com relaes
-um-tipo-de, de forma que, a partir de uma classe genrica, classes mais especializadas possam ser
criadas.
Quando uma nova classe necessita de todos os atributos e mtodos de uma j existente, porm a
nova classe possui a execuo de um ou mais mtodos diferenciados, possvel herdarmos todos os
mtodos e atributos da classe original e realizar a alterao do comportamento do mtodo somente na
nova.
A partir desse momento, para todo objeto que se utilizar da nova classe e executar o mtodo em
questo, ser executado o mtodo novo, e no o original. O polimorfismo permite a manipulao de
instncias de classes que herdam de uma mesma classe ancestral de forma unificada: podemos escrever
mtodos que recebam instncias de uma classe C, e os mesmos mtodos sero capazes de processar
instncias de qualquer classe que herde da classe C, j que qualquer classe que herde de C -um-tipo-de
C. Desta forma, duas ou mais classes derivadas de uma mesma superclasse podem invocar mtodos que
130

Programao Orientada a Objetos I


tm o mesmo nome mas comportamentos distintos, especializados para cada classe derivada, usando
para tanto uma referncia a um objeto do tipo da superclasse.
Polimorfismo, ter muitas formas. Em termos de programao, muitas
formas significa que um nico nome pode representar um cdigo diferente,
selecionado por algum mecanismo automtico. Assim, o polimorfismo
permite que um nico nome expresse muitos comportamentos diferentes
(SINTES, 2002, p. 122).

Vamos montar um exemplo de um mtodo polimrfico. Para conceder um emprstimo, um banco


tem as seguintes regras:
Caso a pessoa que solicita o emprstimo for um cliente normal, o valor mximo do emprstimo
o dobro do seu limite de crdito.
Se o solicitante for um funcionrio do banco, o valor mximo cinco vezes o valor do salrio.
No caso especfico dos gerentes, que so funcionrios mais qualificados, eles podem receber um
emprstimo de dez vezes o valor do seu salrio.
Usando o diagrama de classes do UML, vamos montar o relacionamento entre as classes das pessoas
que podem solicitar emprstimo.
Como todos so pessoas fsicas, vamos criar uma superclasse Pessoa com as informaes comuns a
todas as pessoas. No nosso caso, para facilitar, utilizaremos apenas o seu nome, mas poderia se colocar
a data de nascimento ou a filiao, dentre vrias possveis.
A classe Pessoa pode ser particularizada em outras categorias. No nosso caso, o cliente uma
pessoa que possui um limite de crdito. Um funcionrio uma pessoa que tem salrio e o gerente
um funcionrio que dirige um departamento. Assim, como temos vrios nveis de especializao,
do mais geral (a pessoa) at o mais especfico (o gerente), o relacionamento entre as classes ser
de herana:

131

Unidade III

Pessoas
-nome : String
+Pessoas(n : String)
+ToString() : String

Cliente

Funcionrio

+limCredito : double

+salario : float

+Cliente(nome : String, lim : double)

+Funcionario( nome : String, sal : float)


+ToString() : String

Gerente
departamento : String
+Gerente(depto : String, sal : float, nome : String)
Banco

Principal

+valorEmprestimo(p : Pessoa) : float

+main(args : String []) : void

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.

Figura 89 Superclasse Pessoa

132

Programao Orientada a Objetos I


A classe Cliente (veja a figura a seguir) tem apenas o atributo limCredito, que armazena o valor
do limite de crdito passado pelo construtor. As outras informaes, por herana, ficam a cargo da
superclasse Pessoa.

Figura 90 Classe Cliente, herdeiro de pessoa

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.

Figura 91 Classe Funcionrio, tambm herdeira de Pessoa

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.

Figura 92 Classe Gerente: neta da Classe Pessoa e filha da classe Funcionario

A classe Banco (veja a figura a seguir) requer uma ateno especial. nela que est o mtodo
polimrfico valorEmprstimo.

Figura 93 O mtodo polimrfico valorEmprestimo

134

Programao Orientada a Objetos I


O mtodo valorEmprestimo recebe como parmetro a varivel p, que um tipo da classe Pessoa.

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:

verificase que o objeto p da classe Gerente.


O cast tambm utilizado para modelar a varivel p. Como p foi declarado como sendo do tipo
Pessoa, ou seja, uma superclasse, ele no conhece a sua descendncia. Assim, ao fazer o cast no p,

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.

Figura 94 Sada do clculo do emprstimo para Funcionrio

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:

Figura 95 Sada para o outro objeto da classe Funcionario

136

Programao Orientada a Objetos I


Agora vamos fazer o teste com uma instncia de outra classe. O objeto g1 da classe gerente e ser
passado como parmetro para o mtodo valorEmprestimo:
Cdigo 81 Testando para a uma instncia da classe Gerente

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.

Figura 96 Sada para instncia de Gerente

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:

Figura 97 Sada para objeto Cliente passado como parmetro

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

Programao Orientada a Objetos I

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

Вам также может понравиться