Programação Orienta a Objetos - Profº Erinaldo Sanches ... · PDF fileUm...
Transcript of Programação Orienta a Objetos - Profº Erinaldo Sanches ... · PDF fileUm...
Linguagem de Programação – 1
http://erinaldosn.wordpress.com
Programação Orienta a Objetos
Os atores principais do paradigma de projetos orientados a objetos são chamados
de objetos. Um objeto se origina de uma classe, que é uma especificação tanto dos
campos de dados, também chamados de variáveis de instância que um objeto contém,
como dos métodos (operações) que pode executar. Cada classe apresenta para o mundo
exterior uma visão concisa e consistente dos objetos que são instâncias dessa classe,
sem detalhes desnecessários ou acesso às estruturas internas dos objetos. Essa
abordagem de computação visa atingir diversos objetivos, robustez, adaptabilidade e
reusabilidade.
Produzir um software correto, que produz as saídas certas para todas as entradas
previstas pela aplicação do programa, além de ser um software robusto, ou seja, capaz
de lidar com entradas inesperadas que não estão explicitamente definidas pela aplicação.
O software deve ser capaz de evoluir ao longo do tempo em resposta a alterações
nas condições de seu ambiente. O software tem de ser executado em diferentes
plataformas de hardware ou sistemas operacionais, com alterações mínimas.
Desenvolver um software de qualidade pode ser um empreendimento caro,
podendo seu custo ser diluído caso seja projetado de forma a ser reutilizável em
aplicações futuras.
Os princípios da abordagem orientada a objetos são: abstração, encapsulamento
e modularidade.
2 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
A noção de abstração significa decompor um sistema complicado em suas partes
fundamentais e descrevê-las em uma linguagem simples e precisa. A descrição das
partes de um sistema implica atribuir-lhes um nome e descrever suas funcionalidades.
O conceito de encapsulamento estabelece que os diferentes componentes de um
sistema de software não devem revelar detalhes de suas respectivas implementações.
Uma das maiores vantagens do encapsulamento é que ele oferece ao programador
liberdade na implementação dos detalhes do sistema. A única restrição ao programador
é manter a interface abstrata que é percebida pelos de fora.
A modularidade se refere a uma estrutura de organização na qual os diferentes
componentes de um sistema de software são divididos em unidades funcionais
separadas.
Organização hierárquica A estrutura imposta pela modularidade auxilia a tornar o software reutilizável.
Se os módulos do software forem escritos de uma forma abstrata para resolver
problemas genéricos, então os módulos podem ser reutilizados quando instâncias do
mesmo problema geral surgirem em outros contextos.
Uma forma natural de organizar vários componentes estruturais de um pacote de
software é de uma forma hierárquica, que agrupa definições abstratas similares juntas
nível a nível, partindo do mais específico para o mais genérico, à medida que se
percorre a hierarquia.
Padrões de projeto O projeto orientado a objetos facilita o desenvolvimento de software reusável,
robusto e adaptável.
O conceito de padrão de projeto descreve uma solução para um determinado
problema de projeto de software típico. Um padrão provê um esquema genérico de uma
solução que pode ser aplicada em muitas situações diferentes. Descreve os elementos
principais da solução de forma abstrata que pode ser especializada para o problema
específico que se apresenta.
Existe dois grupos de padrões: padrões para resolver problemas de projeto de
algoritmos e padrões para resolver problemas de engenharia de software. Alguns dos
padrões para projeto de algoritmos incluem: recursão, amortização, divisão e conquista,
poda e busca (diminuição e conquista), força bruta, método guloso e programação
dinâmica.
Herança É uma forma de reutilização de software na qual uma nova classe é criada,
absorvendo membros de uma classe existente e aprimorada com capacidades novas ou
modificadas. Com a herança os programadores economizam tempo durante o
desenvolvimento de programa reutilizando software de alta qualidade testado e
depurado.
Ao criar uma classe o programador pode designar que a nova classe deverá
herdar membros de uma classe existente. Esta classe existente é chamada de
superclasse, e a nova classe, de subclasse. Cada subclasse pode tornar-se a superclasse
para futuras subclasses.
Linguagem de Programação – 3
http://erinaldosn.wordpress.com
Superclasses e subclasses Os relacionamentos de herança forma estruturas hierárquicas do tipo árvore.
Uma superclasse existe em um relacionamento hierárquico com suas subclasses.
É possível tratar objetos de superclasse e objetos de subclasse de maneira
semelhante. Os objetos de todas as classes que herdam uma superclasse comum podem
ser tratados como objetos dessa superclasse. Entretanto, os objetos de superclasse não
podem ser tratados como objetos de suas subclasses.
Um problema com herança é que uma subclasse pode herdar métodos que ela
não necessita ou que não deveria ter. Mesmo quando um método de superclasse é
adequado a uma subclasse, essa subclasse precisa frequentemente de uma versão
personalizada do método. A subclasse pode sobrescrever (redefinir) o método de
superclasse com uma implementação adequada.
Membros protected Utilizar acesso protected oferece um nível intermediário de acesso entre
public e private. Os membros protected de uma superclasse podem ser
acessados por membros dessa superclasse, por membros de usas subclasses e por
membros de outras classes no mesmo pacote.
Todos os membros de superclasse public e protected retêm seu
modificador de acesso original quando se tornam membros da subclasse.
Os métodos de subclasse podem referir-se a membros public e protected
herdados da superclasse utilizando os nomes de membro. Quando um método de
subclasse sobrescrever um método de superclasse, o método de superclasse pode ser
acessado a partir da subclasse precedendo o nome de método de superclasse com a
palavra chave super e um separador de ponto (.).
Relacionamento entre superclasses e subclasses Em uma empresa, os empregados comissionados (representados como objetos de
uma superclasse) recebem uma porcentagem de suas vendas, enquanto empregados
comissionados com salário-base (representados como objetos de uma subclasse)
recebem um salário-base mais uma porcentagem de suas vendas.
1. Declarar a classe ComissaoEmpregado, que herda diretamente da classe Object e
declara como variáveis de instância private o nome, sobrenome, CPF, taxa de
comissão e quantidade de venda bruta (total).
A linha 1 inicia a declaração de classe e indida que ComissaoEmpregado
extends, isto é, herda a classe Object do pacote java.lang. A classe
ComissaoEmpregado os métodos da classe Objeto. A classe Object não tem nenhum
4 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
campo. Se uma classe não especificar que ela herda outra classe, a nova classe herda
Object implicitamente.
A linha 2 a 6 declara as variáveis de instância de classe. Cada uma de suas
variáveis de instância foi declarada como private, então os objetos de outras classes não
podem acessar essas variáveis diretamente.
Os serviços public da classe ComissaoEmpregado incluem um construtor (linhas
8 a 15) e os métodos ganhos (linhas 57 a 59) que calcula os lucros
e toString (linhas 61 a 67) que retorna a representação String do objeto
ComissaoEmpregado.
As linhas 17 a 46 declaram os métodos públic get e set para manipular as
variáveis de instância de classe (nome, sobrenome, cpf, vendas e comissão). A classe
ComissaoEmpregado declara cada uma de suas variáveis de instância como private,
então os objetos de outras classes não podem acessar essas variáveis diretamente. Os
métodos setVendaBruta e setComissao, por exemplo, validam seus argumentos antes de
atribuir os valores às variáveis de instância vendas e comissão, respectivamente.
A classe TesteComissaoEmpregado testa a classe ComissaoEmpregado. As
linhas 3 e 4 instanciam um objeto ComissaoEmpregado e invocam o construtor de
ComissaoEmpregado (linhas 5 a 16). Os métodos get de ComissaoEmpregado
recuperam os valores das variáveis de instância do objeto para a saída. As linhas 17 e 18
invocam os métodos setVendaBruta e setComissao do objeto para alterar os valores das
variáveis de instância vendas e comissão. As linhas 19 a 21 geram a saída da
representação de string de ComissaoEmpregado atualizada.
Linguagem de Programação – 5
http://erinaldosn.wordpress.com
Classe que testa a classe ComissaoEmpregado.
6 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
2. Declarar a classe BaseMaisComissaoEmpregado, que herda da classe Object e
declara como variáveis de instância private nome, sobrenome, CPF, taxa de
comissão, quantidade bruta de vendas e salário-base.
a. Criar a classe BaseMaisComissaoEmpregado sem utilizar herança.
A classe BaseMaisComissaoEmpregado contém nome, sobrenome, CPF,
quantidade de vendas brutas, taxa de comissão e salário base.
A classe BaseMaisComissaoEmpregado representa um empregado que recebe
um salário base além da comissão.
Os serviços public BaseMaisComissaoEmpregado incluem um construtor
BaseMaisComissaoEmpregado entre as linhas 9 e 17. Um construtor de seis
argumentos.
As linhas 19 a 54 declaram os métodos public get e set para as variáveis de
instância private da classe, que foram declaradas nas linhas 2 a 7.
Linguagem de Programação – 7
http://erinaldosn.wordpress.com
As linhas 56 a 58 apresenta o método ganhos que calcula os lucros de um
empregado comissionado com salário base e as linhas 60 a 68 apresenta o método
toString para retornar uma String contento informações de
BaseMaisComissaoEmpregado.
Essas variáveis e métodos encapsulam todos os recursos necessários de um
empregado comissionado com salário base.
8 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
A classe TesteBaseMaisComissaoEmpregado instanciam um objeto
BaseMaisComissaoEmpregado. As linhas 7 a 18 utilizam os métodos get para recuper
os valores das variáveis de instância do objeto para saída. A linha 20 invoca o método
setSalarioBase do objeto para alterar o salário base. As linhas 22 a 25 invocam o
método toString do objeto explicitamente para obter a representação de string do objeto.
b. Criar uma hierarquia de herança ComissaoEmpregado-
BaseMaisComissaoEmpregado com variáveis de instância protected.
Para permitir que a classe BaseMaisComissaoEmpregado acesse diretamente as
variáveis de instância de superclasse primeiroNome, ultimoNome, numeroCPF,
vendasBrutas e porcentagemComissao, você pode declarar esses membros como
protected na superclasse. Os membros protected de uma superclasse são herdados
por todas as subclasses dessa superclasse.
Linguagem de Programação – 9
http://erinaldosn.wordpress.com
As linhas 2 a 6 da classe declara as variáveis de instância como protected em vez
de private.
Acima um construtor de cinco argumentos.
10 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
Os métodos get e set para obter e retornar os valores das variávies de instância.
O método que calcula os lucros do empregado.
O método que retorna as informações dos conteúdos das variáveis e dos lucros
obtidos.
Linguagem de Programação – 11
http://erinaldosn.wordpress.com
A classe BaseMaisComissaoEmpregado3 herda ComissaoEmpregado2.
A classe BaseMaisComissaoEmpregado3 não herda o construtor da classe
ComissaoEmpregado2. Entretanto, o construtor de seis argumentos da classe BaseMais
ComissaoEmpregado3 chama explicitamente o construtor de cinco argumentos da
classe ComissaoEmpregado2.
A classe BaseMaisComissaoEmpregado3 herda a maior parte de sua
funcionalidade da classe ComissaoEmpregado2.
A classe TesteBaseMaisComissaoEmpregado3 testa a classe BaseMaisComissao
Empregado3.
12 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
3. Herança da classe Progressao e suas subclasses.
A figura acima apresenta o diagrama para visualizar a maneira pela qual as três
diferentes progressões (aritmética, geométrica e de Fibonacci) são derivadas da classe
genérica Progressao.
Uma progressão numérica é uma sequência de números em que o valor de cada
um depende de um ou mais valores anteriores. A classe Progressao estabelece os
campos e métodos genéricos de uma progressão numérica. O primeiro valor da
progressão e o valor atual da progressão, bem como três métodos. O método
primeiroValor() que retorna a progressão ao primeiro valor e retorna esse valor. O
método proxValor() que avança a progressão para o próximo valor e retorna esse valor.
Linguagem de Programação – 13
http://erinaldosn.wordpress.com
O método impremeProgressao que retorna a progressão para o início e imprime os
primeitos n valores da progressão.
Uma progressão aritmética determina o próximo número por meio de adições. A
classe ProgressaoAritmetica herda os campos primeiro e atual, bem como os métodos
primeiroValor() e imprimeProgressao() da classe Progressao. Adiciona um novo campo,
inc, para armazenar o incremento, e dois construtores para inicializá-lo. Subscreve o
método proxValor() para adequá-lo à forma pela qual será obtido o próximo termo de
uma progressão aritmética.
O construtor default chama o método parametrizado usando a palavra reservada
this e passando 1 como valor do parâmetro a ser usado como incremento.
Uma progressão geométrica determina o próximo número por meio de
multiplicações. A classe ProgressaoGeometrica é declarada como subclasse da classe
Progressao, e herda os campos primeiro e atual, e os métodos primeiroValor,
impremeProgressao da classe Progressao.
14 – Herança: Programação Orientada a Objetos
http://erinaldosn.wordpress.com
Na progressão de Fibonacci o próximo valor é definido pela soma dos valores
atuais com os anteriores. A classe ProgressaoFibonacci oferece uma forma diferente de
iniciar a progressão.
A classe TestarProgressao executa um teste simples com cada uma das três
classe.
Linguagem de Programação – 15
http://erinaldosn.wordpress.com
O resultado do teste.
Exercícios Escreva uma hierarquia de herança para as classes Quadrilátero, Trapézio,
Paralelogramo, Retângulo e Quadrado. Utilize Quadrilateral como superclasse da
hierarquia. Escreva um programa que instancia objetos de suas classes e gera saída da
área de cada objeto (exceto Quadrilátero).