Você está na página 1de 8

UNIDADE I PROGRAMAÇÃO ORIENTADA A OBJETOS I

Quando a gente usa a palavra estruturado, orientação, objetos, a gente não fala apenas das
linguagens de programação. A gente diz também da análise de sistemas. Então existiu análise
de sistemas estruturadas e análise de sistemas orientada a objetos. Então, por isso que a gente
usa o termo paradigma, usamos o termo paradigma para dizer tanto a análise quanto a
programação, quais são os paradigmas que existiram? O paradigma não estruturado, era um
paradigma sem nome, porque no início, quando foram desenvolvidas as linguagens de
programação, não se pensou muito nesse assunto. Então, se foram definidos os comandos de
programação que permitiram que fizéssemos algoritmos e programar os computadores, mas
com o tempo notou-se que um desses comandos de programação gerava muito problema. Era
o desvio incondicional. Um programa de computador é uma sequência de comandos que o
computador consegue executar um por um. O desvio incondicional manda o computador para
uma determinada posição do programa e ele continua executando quando ele encontra um
outro desvio incondicional. Conforme os desvios incondicionais vão se somando. Muito difícil
de entender em tão logo surgiu o paradigma estruturado que proponha, vamos acabar com os
desvios incondicionais, as linguagens de hoje nenhuma permite o uso dos desvios
incondicionais, mesmo que seja uma linguagem mais antiga, não se usa mais. Com o tempo,
alguns desenvolvedores perceberam como eram desenvolvidos os sistemas. No paradigma
estruturado, era comum que a gente pensasse primeiro no mecanismo de armazenamento dos
dados. Normalmente um banco de dados relacional para depois pensar no sistema que vai
acessar esses dados. Esses desenvolvedores perceberam que não faz sentido, pensar primeiro
no banco de dados, para depois pensar no sistema. Se o banco de dados não consegue fazer
nada sem um sistema e o sistema precisa do banco de dados para funcionar em momentos
diferentes, vamos pensar os 2 juntos na mesma entidade, que é o objeto. Aí surge o paradigma
orientado a objetos. Envolve tanto a análise de sistemas orientada, objetos quanto a
programação orientada a objetos. Então nós vamos lidar com uma linguagem de programação
orientada a objetos. Vamos entender um pouquinho o que é um objeto, como é que um
objeto une dados e comportamentos? Outro aspecto que nós temos que lidar é com as
classes. Podemos entender uma classe como sendo um conjunto de objetos do mesmo tipo.
Vamos partir de um exemplo prático. Imaginem que estamos de manhã. Ligamos a televisão e
vemos um programa culinário. A moça simpática começa a ensinar para a gente a fazer uma
receita de bolo. Quero fazer essa receita de bolo, então eu baixo a receita da internet e tento
cozinhar o meu bolo. Misture os ingredientes, bato, coloca no forno e obtenho um bolo. Será
que esse bolo vai ficar igual? Ao bolo da moça da televisão? Provavelmente não, então eu não
vou desistir semana que vem eu tento cozinhar o bolo novamente. Vou conseguir um bolo,
provavelmente um pouquinho melhor, e vou fazendo assim. Vou treinando, eu vou
cozinhando vários bolos. Quando eu me sinto, é confiante o suficiente. Eu começo a inventar
com essa receita, começa a fazer um bolo com cobertura, um bolo com recheio, bolo com
cobertura e recheio, muda os sabores. O que importa é que, com apenas uma receita, eu
consegui cozinhar vários bolos. Todos eles vieram da mesma receita. Esse é um conceito
próximo ao do classe e objeto com uma classe. Nós conseguimos criar vários objetos feitos a
partir dessa classe. Se a classe, a receita, os objetos ajudar a gente a colocar no papel esses
conceitos de classe objeto, os pesquisadores que desenvolveram a orientação terão também
uma linguagem gráfica que ajuda a gente a modelar esses conceitos, essa linguagem a UML,
que em inglês significa linguagem de modelagem estruturada. Essa linguagem, apesar de ter
um nome linguagem, não é bem uma linguagem. A gente não consegue programar com O
UML. Ele é um padrão de escrita, de diagramas. Esses diagramas são vários. Eles são divididos
em 3 categorias. Primeira categoria, diagramas comportamentais, eles são úteis para a gente
registrar. Quais são os comportamentos de um sistema? Exemplos desses tipos de diagrama,
diagrama de caso de uso diagrama de atividades, diagrama de máquina de estados outro tipo
de diagrama diagramas estruturais com esses diagramas, a gente consegue registrar, definir,
criar a estrutura do nosso sistema. Como vai ser o jeitão dele? Então, alguns diagramas
estruturais, o diagrama de classes. Diagrama de pacotes, entre outros, para a nossa disciplina
de programação vai ser muito importante o diagrama de classes. Nós praticamente só vamos
lidar com o diagrama de classes e, de vez em quando, a gente fala um pouquinho do diagrama
de objetos. Ele também define diagramas de interação mostram como partes do sistema
conversa entre si como pessoas como equipamentos de fora do sistema, conversa com o
sistema e assim por diante. Alguns exemplos são, diagrama de sequência, diagrama de
comunicação, diagrama de tempos, entre outros. Na nossa disciplina nós vamos focar no
diagrama de classes, então como é? Diagrama de classes na UML. Um diagrama de classes
permite que eu modele várias classes. Cada classe é uma definição de um conjunto de
objetos, então é como se fosse a receita do bolo. Com esse diagrama, consigo mostrar a
receita que eu uso para criar todos os objetos. O desenho que a gente usa para representar
uma classe é um retângulo dividido em 3 partes, parte de cima a gente coloca o nome da
classe, o nome da classe deve estar centralizado. Na parte do meio, a gente vai colocar os
atributos, as características, as é o que diferencia um objeto de outro. Normalmente são coisas
que a gente percebe no objeto, cor, tamanho, número de série, assim por diante. Na parte de
baixo, na terceira parte da classe, nós colocamos os comportamentos desse objeto, então
temos aqui métodos que vão fazer alguma coisa, podem fazer alguma coisa com o objeto .
Objeto e assim por diante, mas são comportamentos típicos de um objeto. Em seguinte, em
seguida, vem o nome de outro atributo. Então temos a, além de um exemplo, atributo um,
atributo, 2, atributo 3. Os nomes dos atributos, eles devem ser únicos dentro da classe, né?
Quer dizer que eu posso criar uma outra classe com atributos do mesmo nome? Posso, desde
que esteja em outra classe. Atributo um, o é armazenar dados do tipo um ente int na nossa
linguagem significa números inteiros. O atributo 2 vai armazenar números do tipo double, que
é um tipo de ponto flutuante. Ponto flutuante, quer dizer, permite que a gente armazene
números fracionados. O terceiro, o atributo 3, armazena dados do tipo string string é uma
sequência de caracteres. Pode ser uma palavra, uma frase e assim por diante. Como nós
anotamos os métodos, os comportamentos da classe, o mais(+) tem o mesmo significado.
Significa que esse método está visível para todo mundo. Nomes dos métodos devem ser
únicos método um método 2 e assim por diante e pessoa humana. Então? Como é que a gente
define um parâmetro de um método do mesmo jeito que a gente definir um atributo?
Primeiro o nome do parâmetro: e o tipo de dados que vai passar dentro do parâmetro. Então,
no método 3, ele recebe apenas um parâmetro, que é do tipo string, o método quarto, ele
recebe apenas um parâmetro. Do tipo double, podemos passar mais de um parâmetro,
podemos só separar um de outro por vírgulas? Os métodos, agora eles terminam com: e o tipo
de dado. O que significa isso? Significa que quando o método for executado, ele vai devolver
algum valor. O método 2. Por exemplo, quando ele for executado, ele vai devolver um número
inteiro. O método 4 quando foi executado, vai devolver uma palavra. Tem uma string. Os
métodos 1 e 3, devolvem void, o void, em inglês, quer dizer nulo nada. São métodos que são
executados e não devolvem nada. Eles simplesmente fazem alguma ação e não devolvem nada
para quem chamou o método. Vimos que classes de objetos servem para representar objetos
do mundo real, conceitos que a gente vai tratar no nosso sistema. Digamos que a gente queira
fazer um sistema para armazenar informações de Luminárias que vão ser organizadas numa
lógica, uma loja. Num estoque, num mecanismo de entrega, não é num gerenciamento
logístico. Vamos ter que armazenar informações sobre as Luminárias que vamos gerenciar,
então vamos criar uma classe chamada luminária. Que é que define essa classe? A classe deve
ter atributos e métodos, dados e comportamentos. Quais são os dados que representam as
várias Luminárias que nós vamos lidar? Uma das características podem ser tenção, 110 220
volts, então vamos criar um atributo que armazena. O dado da tenção das Luminárias, outra
característica do número de lâmpadas, se é uma luminária de uma lâmpada, de 3 lâmpadas e
assim por diante. Criamos um atributo para armazenar, quantas lâmpadas podem ser usadas
nessa luminária? Então já temos características que diferenciam várias Luminárias, cada objeto
da classe luminária terá um valor diferente para atenção e número de lâmpadas. Podemos ter
uma luminária 110 volts com uma lâmpada, outra 110 volts com 3 lâmpadas, uma de 220 volts
com uma lâmpada e assim por diante. Cada objeto, assim como cada bolo. Terá cobertura se
recheios diferentes terá tensões e números de lâmpadas diferentes e os comportamentos? O
que é que essas Luminárias fazem? Vamos definir, por exemplo, que ela pode ligar. E desligar?
Então todas as Luminárias terão esses comportamentos. Elas podem ser ligadas e desligadas.
Um exemplo um pouquinho mais complexo de um automóvel. Que que a gente pode usar para
diferenciar os vários automóveis que vão ser criados com essa classe? Cada automóvel terá
um fabricante diferente, terá um modelo um ano, suas Placas, número de chassi, opções de
motor e assim por diante. Então, o que for interessante para o nosso sistema, a gente coloca
como atributos. Do automóvel. Você percebe um automóvel para uma empresa locadora tem
características importantes, um automóvel para um fabricante de automóveis tem outras
características importantes. Um automóvel para uma empresa seguradora terá outras
características, estão dependendo do sistema que a gente escolha do que a gente. Para fazer?
Temos 11 modelo diferente do automóvel. Quais são os comportamentos? Acelerar, buzinar,
abrir porta, fechar a porta e assim por diante. Isso sempre depende do nosso, é do nosso
sistema. Interatividade.

O uso de desvios incondicionais tem um efeito de deixar o código mais difícil de ser entendido
e, por isso, soma atenção mais demorada e mais cara. Vamos colocar na mesma entidade
dados e comportamentos que modificam esses dados na mesma entidade que é o objeto.
Alternativa de uso de herança entre classes herança é um assunto muito presente em
programação orientada a objetos. Realmente só existe herança em orientação a objetos, mas
não é isso que torna a à orientação objetos diferente do paradigma estruturado. O que
motivou? O paradigma orientado a objetos é justamente alternativas e juntar dados e
comportamentos na mesma na mesma entidade. Nós ainda vamos estudar o que é herança,
assim como alternativa e o polimorfismo. Polimorfismo também está relacionado com a
herança. Orientação objetos, sempre lida com alguns conceitos. O conceito de
encapsulamento, tornar uma cápsula, isolar esconder. Então quando a gente usa o termo em
encapsulamento, geralmente a gente quer dizer isso, colocar uma cápsula em volta,
esconder, por exemplo, digamos que eu queira usar algum tipo de rádio. Eu preciso de um
rádio, eu quero rádio, eu tenho 2 opções, eu posso é ir a alguma loja e comprar um Monte de
componentes eletrônicos, resistores, transistores, LED. Se assim por diante e montar o meu
próprio rádio. Isso eu consigo hoje em dia a gente tem conhecimento para fazer isso. Qual é a
segunda opção? Eu posso ir até uma loja e comprar uma caixinha preta, que já é um rádio
pronto, que alguém já montou com os mesmos componentes que eu tenho acesso, mas essa
pessoa tem acesso a componentes mais baratos, tem acesso a uma linha de produção e
consegue criar um rádio. Que eu posso comprar? Pronto, qual será o melhor rádio? O rádio
que eu monto a partir das pecinhas. Ou é o rádio que eu compro? Pronto. Em geral, os eu
quero simplesmente um rádio para ouvir em é música de FM é mais fácil eu comprar um rádio
já pronto, vai ser mais barato ou não vou conseguir montar um rádio com mesmo custo aqui o
fabricante e como ele já tem ferramentas próprias para criar o seu rádio, ele vai criar um rádio
com um acabamento melhor, com funcionalidades melhores. Quando é que eu vou escolher
montar o meu próprio rádio quando eu não encontro na loja, um rádio que faz o que eu
quero? Eu, por exemplo, eu quero ouvir é transmissões de rádio, de polícia, de avião, de Ets do
outro mundo. Então eu vou ter que montar o meu rádio, rádios desse tipo a gente não
encontra pronto. A gente pode entender o encapsulamento assim. O rádio pronto, ele
fechou dentro de uma caixinha preta, todo o seu mecanismo. Eu sei como usar e se eu usar o
rádio muito bem, ele vai fazer o que eu quero. Mas se eu não encontro um rádio pronto, eu
faço o meu. A ideia do encapsulamento é um desses, escondeu um mecanismo, eu não
preciso saber como o rádio funciona, uma classe acaba fazendo isso, ela esconde. Dentro da
classe, qual o funcionamento interno dela? A classe pode fazer coisas que eu não preciso
saber como são feitas, só preciso que ela faça. Outro conceito é relacionado,
encapsulamento. Quando uma classe é abstrai, torna abstrato. Um conceito, esse conceito
pode ser a luminária pode ser um automóvel, pode ser uma caixa de ferramentas, por
exemplo. Como conectar com o banco de dados? Como conectar com a internet, enviar e
receber e-mails e assim por diante. Quando eu coloco esses conceitos dentro de uma classe,
estou encapsulando esses conceitos e abstraindo, tornando abstrato. Ou seja, estou criando
um código abstrato. É que o computador consegue entender o que é que eu coloco dentro dos
dados e comportamentos de uma classe. Vamos colocar apenas dados e comportamentos,
atributos e métodos que dizem respeito a esse conceito. No caso da classe carro, só vamos
colocar ali dados e comportamentos relacionados a automóvel, placa, chassi, cor, modelo,
fabricante, buzinar, andar e assim por diante. Não vou colocar nada que diga respeito a um
outro conceito, por exemplo, avião. Por exemplo, móvel, por exemplo, luminária, nada disso
vai estar dentro da classe automóvel. A outra parte diz, se um método ou atributo diz respeito
ao conceito modelado, ele não pode estar em nenhuma outra parte do sistema, por exemplo,
o método buzinar não pode aparecer em nenhum outro lugar do sistema, se não. Na classe
automóvel, então, nós vamos encapsular na classe automóvel tudo o que diz respeito ao
automóvel. Nada de fora vai estar aqui. E se algum conceito diz respeito, automóvel não pode
estar fora. Tem que estar aqui. As classes também podem se relacionar entre elas. Existem
várias maneiras que a gente pode relacionar uma classe com outro. Uma delas é a associação
imagine o seguinte, temos uma classe que representa pessoas que vão ser cadastradas no
nosso sistema. Que dados são interessantes para modelar, para abstrair uma pessoa no nosso
sistema, uma pessoa sempre tem um nome, uma pessoa pode ter alguns documentos como
CPF, RG, etc. Pessoa pode ter endereços, a pessoa pode ter etnia e assim por diante. Podemos
criar atributos para a pessoa, para cada uma dessas características que vão tornar as pessoas
diferentes no meu sistema. Mas olhem só. No caso do endereço. A gente pode criar um
atributo para armazenar um endereço das pessoas. Como é que a gente coloca o endereço
nesse atributo. E se a gente escreve de maneiras diferentes, digamos que a gente vai cadastrar
2 pessoas que moram no mesmo endereço, eu posso escrever uma vez com todas as letras
minúsculas. Na outra vez com todas as letras maiúsculas. Na outra vez, com algumas
maiúsculas, outras, minúsculas, abreviando algumas palavras ou não. Então, pessoas que
moram no mesmo endereço podem acabar tendo endereços diferentes no meu sistema. Uma
maneira de resolver isso é a gente criar uma outra classe específica para armazenar endereços.
Então essa classe vai ter atributos suficientes para a gente conseguir registrar um endereço,
por exemplo, o Logradouro, que é o nome da rua, avenida Alameda e assim por diante. Um
atributo apenas para o número 1, atributo apenas para o bairro, um atributo apenas para a
cidade e assim por diante. Então a gente está formalizando, a gente está criando um padrão
de armazenagem do endereço. Cada endereço no nosso sistema vai ser um objeto da classe
endereço. Esse objeto se relaciona com uma pessoa. Se nós tivermos 4 pessoas que residem
no mesmo endereço esses 4 objetos vão se associar a um só objeto, endereço que foi escrito
da mesma maneira. Você percebe que assim a gente evita erros. Eu escrevo o endereço uma
única vez e eu utilizo esse endereço, esse objeto para todas as pessoas que residem nesse
endereço. Isso melhora muito o nosso sistema. Quando uma associação tem um significado de
um componente de uma parte de uma coisa maior, a gente pode melhorar um pouquinho. Se
o símbolo da associação com esse símbolo mostrado que tem um balãozinho em uma das
pontas, esse símbolo representa o conceito em UML, chamado de agregação. Na agregação a
gente tem um conceito de todo e parte entre as classes associadas. Vejamos nesse exemplo.
Móvel? Que se associa a classe motor, suspensão, rádio e câmbio. Então, determinado objeto
da classe automóvel vai se associar um determinado objeto da classe motor motor, 1.0, 1.4,
diesel e combustível e assim por diante. Vai se associar a um objeto da classe? Suspensão,
suspensão de estradas, suspensão, fora de estrada e assim por diante. Vários tipos de rádio,
vários tipos de câmbio. Mas nós percebemos que essas classes motor suspensão.

Então nos conceitos é relacionado à orientação objetos. Temos um conceito muito


importante, conceito de herança. Imaginem só, estamos criando um sistema para armazenar
informações de clientes, de fornecedores e de funcionários. De uma loja de uma empresa, algo
do tipo. O que é que podemos colocar como características como atributos de um cliente, um
cliente terá nome, CPF, telefone e se é um cliente ativo ou um cliente que já não usa nossos
serviços há muito tempo. Um fornecedor também tem nome. Também tem CPF, também tem
telefone. E tem CNPJ? Um fornecedor é sempre uma empresa. Um funcionário tem nome, CPF,
telefone e o registro funcional dentro de nossa empresa. Então você deve ter notado. Existem
vários atributos que estão sendo repetidos no nas 3 classes. Quando a gente desenvolve um
sistema, uma coisa que a gente nunca deve fazer é repetir alguma coisa. Se a gente faz
alguma coisa mais de uma vez, a gente está errado. Qual o problema de fazer uma coisa mais
de uma vez? Digamos que eu escreva um código que faça uma conta que é importante o nosso
sistema escreveu uma vez esse código ele faz essa conta funciona então eu preciso agora usar
esse mesmo código num outro código. Um outro texto do programa, escreva o código de novo
copio daqui e cole. Funciona, se um funciona, o outro funciona e vou copiando. Digamos que
esse código ele calcule os juros de uma caderneta de poupança. Eu posso usar esse código em
várias partes do sistema, na caderneta de poupança, nas contas atreladas à poupança, e assim
por diante. De repente, o cálculo da caderneta de poupança muda. O que que eu tenho que
fazer agora? Eu tenho que corrigir o meu sistema em todos os pontos em que eu fiz esse
cálculo. E o problema é que quando a gente faz isso, a gente sempre esquece algum lugar, que
a gente colocou esse código, a gente vai esquecer de arrumar. E outro problema, às vezes a
gente corrige no lugar e corrige diferente em outro. Cada lugar vai calcular de um jeitinho um
pouquinho diferente. Isso gera muito problema. Então a gente nunca deve fazer a mesma
coisa várias vezes. Se a gente escreveu 11 algoritmo que calcula o rendimento da poupança, eu
escrevo uma vez e depois uso esse mesmo em qualquer lugar. Mas eu não vou copiar. Eu vou
mandar executar nesse lugar. Como é que a gente pode usar esse conceito de reuso nessa
situação? Temos 3 classes com atributos muito semelhantes, nome, CPF, telefone. Não seria
muito legal você escrever se eles num lugar e essas 3 classes, usa usassem esse lugar? Eu
posso fazer isso, eu posso criar uma outra classe com esses atributos e dizer para as classes
cliente, fornecedor e funcionário que eles podem usar esses dados da outra classe. Esse
conceito é chamado de herança. Eu crio uma classe chamada pessoa, defina os atributos
nome, CPF, telefone. E digo para o meu sistema que as classes cliente fornecedor de
funcionário é herdam da classe pessoa. Tudo o que está definido na classe pessoa é herdado,
passa automaticamente para as classes filhas. Então a gente pode dizer que pessoa é a
classe, pai. E as classes cliente, fornecedor e funcionário são as classes filhas da classe
pessoa. Reparem que eu só defini as classes filhas, os atributos que são diferentes entre elas,
cliente tem só o tributo ativo, fornecedor tem só o atributo CNPJ e funcionário tem só o
atributo registro funcional. Então quer dizer que a classe cliente não tem mais nome, CPF,
telefone? Sim, tem a classe cliente. Era esses atributos da classe pessoa, se eu preciso mudar,
como eu registro o telefone, eu posso é registrar o telefone como caracteres, como números
com ou sem código de longa distância Internacional. Se eu fizer uma mudança em como o
telefone é armazenado, eu modifico apenas na classe pessoa. Essa modificação é herdada por
todas as classes que eram da classe pessoa. Isso é uma ferramenta muito forte em
orientação a objetos, ferramenta da herança. Em UML, que é o símbolo que nós estamos
usando para representar as classes, o símbolo que representa a herança é essa seta. Essa seta
de corpo contínuo e ponta fechada sem pintar. Esse símbolo representa é chamado de
generalização. Generalização, porque ele aponta sempre para a classe geral. Então, quando a
gente se movimenta na direção da classe geral, estamos nos movimentando na direção da
generalização, caso geral. Quando nos movimentamos na outra direção para baixo, estamos
nos movimentando para a direção da especialização. São as classes especializadas, então
podemos dizer que cliente é uma especialização de pessoa. É um tipo de pessoa, fornecedor,
é uma especialização de pessoa. É um tipo de pessoa, funcionário é uma especialização de
pessoa. Também é um tipo de pessoa. Nós falamos um pouco até agora, meio que ao mesmo
tempo de classe, objeto mais ou menos como se fossem a mesma coisa. Isso é comum quando
a gente trata de orientação a objetos. Quando a gente fala de classe e objeto. Geralmente está
pensando sempre no objeto, mas quando nós vamos definir? Um objeto, a gente escreve a sua
classe é a mesma, mesma coisa na história dos bolos. Quando a gente pensa nos bolos, a gente
pensa também como eles são feitos a eu quero saber como se faz um determinado bolo. Eu
penso na receita daquele bolo. Mas existe uma diferença, assim como receita é uma coisa boa,
é outra. Em orientação, objeto a mesma coisa. Classe é uma coisa. Objeto é outra com uma
classe, nós criamos nós instanciamos vários objetos. Então, o termo que a gente usa para
cozinhar uma classe para assar uma classe em orientação, objeto, a gente diz, instanciar criar
uma instância, um exemplo, um objeto? Quando a gente tem uma classe como essa, digamos,
temos a classe motor, que representa vários tipos de motores. O que é que diferencia um
objeto de outro motor? O volume do motor ponto zero, 1.4, 1.8, etc. E quantos cilindros esse
motor tem 2 cilindros, 3812. E os comportamentos desse motor? Nesse caso, vamos colocar
apenas 2 acelerar e ligar. Com essa receita eu consigo cozinhar vários objetos, então com essa
classe eu consigo instanciar vários objetos. Até agora, a gente tem usado o diagrama de
classes, mais orientação objeto oferece para a gente o diagrama de objetos é muito parecido
com esse. Vamos ver então, como é que a gente pode representar os vários objetos da classe
motor? Temos aqui 3 objetos. O primeiro objeto é chamado econo. Como é que eu digo? Qual
é a classe desse objeto? Eu coloco depois dos: então econo é um objeto da classe motor. Quais
são os atributos do motor econo? Ele tem volume com um valor 1.0. Ele tem cilindros com o
valor 4 e ele também consegue acelerar e ligar. Os comportamentos são comuns a qualquer.
Objeto da classe motor. Um outro objeto, o objeto Power também é da classe motor. Quais
são as características do objeto Power? O objeto Power tem como volume 1.8 e o número de
cilindros também é 4, então existem características que tornaram o objeto Power diferente do
econom. Ele também é capaz de acelerar e ligar um terceiro objeto. O objeto elite também é
um objeto da classe motor. Tem como volume 2.4 tem como cilindros 6. Ele também consegue
acelerar EEE ligar. São 3 objetos obtidos instanciados da mesma classe, a classe motor, então
com uma classe, criamos quantos objetos nós precisarmos, assim como com a receita. Eu
consigo cozinhar quantos bolos eu quiser. Quando o nosso sistema está funcionando, nós
podemos ter na memória vários objetos da classe motor. Quantos forem necessários, se eu
estiver lidando com vários motores no nosso sistema, cada motor vai ser um objeto
instanciado vai ter na memória do nosso computador um objeto. Da classe ao motor. Muito
bem. Para a nossa interatividade.

Outras alternativas o uso de herança torna o código mais fácil então fica realmente mais fácil
de entender um código que usa herança. Alternativa de uso de herança reduz o custo de
manutenção do código. Quando o que, causa custo em manutenção de código? O tempo que
leva para corrigir? Se a gente tem que corrigir vários lugares, isso leva mais tempo. E torna a
manutenção mais cara. Então, se a gente isola numa classe pai, o código que vai ser dado por
todas as classes, filhas, a gente só tem um lugar para corrigir quando dá problema ou
quando a situação muda, a gente modificou uma vez. A modificação é feita em todas as
classes que eram da classe pai. Alternativa e ou uso de herança só é possível a linguagens
orientadas ao objeto. Realmente não tem jeito de usar herança em linguagens estruturadas, a
gente consegue usar, uso mais a herança só em linguagens orientadas a objeto. Muito bem.
Um outro assunto que aparece muito quando se fala em orientação a objetos é polimorfismo.
Polimorfismo, uma palavra que vem do grego, da junção de 2 palavras, Poli, que significa
muitas, e morfos, que significa formas, então significado de polimorfismo. O conceito de
polimorfismo quer dizer, nós vamos criar em nosso sistema coisas que podem aparecer de
maneiras diferentes, mas que fazem a mesma coisa ou coisas que são aparentemente iguais, e
fazem coisas diferentes. Vamos ver como é que o polimorfismo acontece. Em orientação a
objetos. Temos vários tipos de polimorfismo. O primeiro, um dos mais fáceis de entender é o
um conceito chamado de sobrecarga, sobrecarga ou sobrecarregar métodos. Quer dizer que
eu vou criar mais de um método com o mesmo nome e que faz mais ou menos a mesma
coisa. Imagina, é a classe, o motor que tem os atributos volume cilindro se tinham os métodos
acelerar. Desligar. Imagem de agora que a gente tem um motor bicombustível, ele consegue
acelerar com. Álcool, ele consegue acelerar com gasolina e ele consegue acelerar com uma
mistura de álcool e gasolina. Então nós temos 3 versões do método, acelerar um, acelerar. Ele
vai fazer a mesma coisa, mas com é combustíveis diferentes. O que a gente manda para o
método acelerar. Pode ser só a gasolina, ou pode ser os 2. Então, com a sobrecarga, eu crio 3
métodos capazes de lidar com essas 3, és tu, ações apenas um combustível, apenas outro, ou
os 2. Sobrecarga. Então é isso. Temos um método escrito com o mesmo nome, mas os
parâmetros são diferentes, seja ele em quantidade, seja em tipo. Outro tipo de polimorfismo.
Esse polimorfismo já aparece quando a gente tem herança. É a chamada de sobrescrita.
Imaginem que a gente modelou uma classe para armazenar a figura geométrica retângulo.
Essa classe vai armazenar a base e a altura do retângulo é o necessário para a gente conseguir.
É modelar um retângulo geométrico. É com os seus dados. Com essa classe, eu quero também
um comportamento. Eu quero também um método que calcula a área do retângulo, então eu
tenho um objeto que tem uma certa base, altura. Quando você cortar o método, calcula a área
desse objeto, ele faz aquela continha separada em azul, que diz qual é a área desse retângulo?
Muito bem para usar o reuso, eu vou criar uma classe que modela um triângulo que era da
classe retângulo. Existem várias maneiras de se modelar um triângulo. Uma delas é
armazenando sua base e soltura, então o triângulo pode ter base, altura e um triângulo.
Também tem área. Mas como é que a gente calcula a área de um triângulo, área de um
triângulo, já tem uma forma um pouquinho diferente, é base vezes, altura dividido por 2. Se eu
não tivesse definido o método, calcula área. Ângulo teria sido herdado pela classe triângulo,
então o triângulo teria atributo base, atributo, altura e o método calcula área que calcularia
com a primeira equação base, vezes, altura e daria um resultado errado. Então, método
calcular a área precisa ser reescrito, precisa ser modificado. Ele precisa ser sobre escrito.
Então, se temos uma classe que reescreve um método de uma classe pai de uma superclasse,
isso é chamado de sobre a escrita. Então vamos criar um novo método. Na classe triângulo,
com exatamente o mesmo nome e os mesmos parâmetros da classe retângulo. O que a gente?
é desenvolver dentro da do método calcular. A área vai ser executado em um objeto da classe
triângulo, um objeto da classe retângulo continua executando o calcula área da classe
retângulo. Outro exemplo de polimorfismo, esse é um polimorfismo que às vezes a gente deixa
de lado, mas é o mais importante da orientação. Objetos. Isso aqui economiza muitos
trabalhos da gente. Imagina o seguinte, quando falamos de herança, mostramos essa
estrutura de classes, a classe pessoa, que define atributos comuns. Das classes cliente,
fornecedor e funcionário e imaginem que a gente tem uma fábrica, a uma loja, uma loja onde
podem entrar clientes, fornecedores e funcionários. Essa loja tem 2 entradas, a entrada
principal, por onde entram a maioria dos clientes, dos fornecedores e funcionários. Então essa
entrada principal tem uma catraca que permite que todo mundo entre qualquer um consegue
entrar nessa loja. Mas essa loja também tem. Uma porta de serviço nos fundos da loja. Nessa
porta de serviço podem entrar funcionários e podem entrar fornecedores, mas clientes não
podem entrar pela porta de serviços. A porta de serviço só aceita funcionário e fornecedor. A
porta da frente, a porta principal aceita qualquer um, então podemos dizer que a porta
principal aceita pessoas em geral. Ela não distingue se é cliente, fornecedor ou funcionário,
só interessa se a pessoa consegue entrar pela porta principal, então você percebe se algum
lugar, uma catraca, aceita a classe pai, qualquer classe, filha, consegue entrar nesse mesmo
lugar. É a porta da frente. Já a porta de serviços não vai aceitar uma pessoa qualquer, só vai
aceitar 2 especializações de pessoa. Funcionário e fornecedor. A terceira especialização cliente
não consegue entrar pela porta de serviço. Como é que a gente pode modelar isso? UML,
digamos que eu faça uma classe para representar a loja. Essa loja pode ter. Os seguintes
métodos, entrada de serviço e entrada principal. Como parâmetros, o que pode entrar? Na
cada entrada a entrada principal. Aceita pessoas? Ou seja, qualquer objeto da classe pessoa ou
qualquer objeto das classes derivadas das classes filhas da classe pessoa consegue entrar na
entrada principal. Afinal, se a entrada principal aceita a pessoa. Vai aceitar cliente que é um
tipo de pessoa, vai aceitar funcionário que é um tipo de pessoa e vai aceitar é fornecedor, que
é um tipo de pessoa. Agora na entrada de serviços, eu quero limitar a entrada de clientes. Eu
quero que entre apenas funcionários e fornecedores, então criam 2 métodos para a entrada
de serviço. Um método entrada de serviço aceita fornecedor. E outro método, a entrada de
serviço. Aceita. Funcionário, então olha só, cria uma sobrecarga de métodos, uma para aceitar
o fornecedor, uma para aceitar funcionário, então consigo chamar o método entrada de
serviço apenas com esses 2 é objetos, objetos da classe fornecedor, objetos da classe
funcionário. Não consigo chamar uma entrada de serviço com um objeto da classe cliente.
Também não consigo chamar um objeto. É chamar a entrada de serviço com um objeto da
classe pessoa. Se entra, o filho não entra o pai. Se entra o pai, entra qualquer filho.

Você também pode gostar