Linguagens Orientadas a Objetos (Parte I)

Propaganda
Caio Argolo
Luiz Daud
Jorge Roberto
•
•
•
•
O que é abstração?
Empresa x Academia
Vamos abstrair?
Quais atributos importantes em cada contexto?
• Quais são os processos?
• Quando vieram os dados?
•
•
•
•
•
Como facilitar a vida de um programador?
A modularização (processos, containers, módulos
E quando a coisa é muito grande?
As unidades de compilação!
O grande trunfo do escalonamento!!!
• É um encapsulamento que inclui somente a representação dos
dados de um tipo específico de dado e os subprogramas
relacionados a ele.
• Cuma?
• Classes e objetos!
• E assim surgiu a orientação a objetos!
•
•
•
•
E ele é um dado abstrato?
E quem aceita ele?
O que fazemos com ele?
A revelação!
• As unidades sintáticas.
• Iteradores – Permissão de acesso a todos os dados do objeto
de forma segura (Get e Set);
• Construtores – Permissão de criação de uma instância do objeto
respeitando normas internas do tipo de dado abstrato.
• Destrutores – Indicadores de descarte de instâncias.
•
•
•
•
Abstração de dados!
Encapsulamento!
Garbage collection!
Ocultação da informação.
•
•
•
•
•
•
Abstração de dados!
Encapsulamento!
Garbage collection!
Ocultação da informação.
Tipos de dados (private, limited private)
Acesso e modificação!
•
•
•
•
•
•
Simula
Smalltalk
O que define se o paradigma é orientação a objetos?
Tipos de dados abstratos
Herança
Vinculação dinâmica
•
•
•
•
•
•
•
•
•
Aumentando a produtividade
Estabelecimento de um padrão
A coexistência de tipos de dados semelhantes
Vamos criar então as subclassses!
Classe pai = Superclasse
Classe filho = Subclasse
E esses tais métodos?
E essas tais mensagens?
Que história é essa de sobrecarga?
• Classe FrenchGothic que tem um método com o estilo de
fachada.
• Suas subclasses terão particularidades nesse método de estilo,
cada uma com seus toques especiais.
• Então as subclasses Reims, Amien e Chartres terão métodos
diferentes da classe pai.
• Jamais limite a liberdade oferecida pela utilização de dados
abstratos.
• Fique atento a hierarquização para não causar dependência!
• Herança simples - Há somente uma classe pai
• Herança múltipla - Há várias classes pai C++ & Python
• O curioso caso do Java!
• Mas desde quando interfaces são classes?
• São pseudo-classes, definem um tipo, métodos e propriedades.
As classes que
implementarem essa interface deverão
adquirir também seus métodos. Não podemos
restringir
acesso aos membros da interface, isso só é possível nas classes
nas quais elas
forem implementadas.
• São classes que podem possuir métodos ou propriedades não
implementados quanto alguns já implementados. É o meio
termo entre interfaces e classes. Não podem ser instanciadas,
apenas utilizadas como superclasses. Durante gerações de
herança os métodos podem ou não ser implementados, mas a
classe só deixará de ser abstrata quando estiver com todos os
métodos implementados.
•
•
•
•
•
•
Classes diferentes
Métodos de mesmo nome
Reutilizando os métodos!
E as classes abstratas?
A economia de tempo!
Pode-se comparar a orientação a objetos a uma sinulação
onde a computação é separada entre diferentes
computadores. Cada objeto seria um computador que
representa um
elemento do mundo real, com suas
características, métodos e afins.
• public class OperacaoMatematica {
•
calculaCoisa(float a, float b) {
•
}
•
}
•
•
public class Multiplica extends OperacaoMatematica{
•
calculaCoisa(float a, float b){
•
return a*b;
•
}
•
}
•
•
public class Soma extends OperacaoMatematica{
•
calculaCoisa(float a, float b){
•
return a+b;
•
}
•
}
• Quando nos referimos a vinculação dos métodos aos objetos
através das mensagens, a vinculação será dinâmica. Caso o
programador opte por vincular estaticamente, estará ganhando
tempo de execução em troca de tempo de produção.
3.1 – Suporte em C++
• 3.1 – Suporte em C++
• 3.1.1 – Características Gerais:
• Compatibilidade quase completa com C original.
• Linguagem Híbrida:
• Estrutura de Classes da orientação a objetos.
• Tipos das linguagens imperativas tradicionais.
•
•
•
•
Objetos alocados no mesmo lugar que as variáveis.
Toda classe tem um método construtor.
A maioria das definições de classe incluem um método destrutor.
Fornece controle de acesso sobre variáveis e métodos, diferentemente
do SmallTalk.
• 3.1 – Suporte em C++
• 3.1.2 – Herança.
• Um classe pode ser derivada de outra.
• Diferente do SmallTalk um classe do C++ pode ser independente de
um Superclasse
• Alguns ou todos os dados e funções da Superclasse podem ser
herdados pelas subclasses.
• A acessibilidade aos membros da subclasses podem ser diferentes da
classe “Pai”.
• Assim que as classes do C++ podem ser impedidas de serem subtipos.
• O modo de acesso a uma classe pode ser public ou private.
• 3.1 – Suporte em C++
• 3.1.2 – Herança.
• Se uma classe Pai é pública e uma classe filha é pública.
• Os métodos públicos e protegidos da Pai serão públicos e protegidos na
filha.
• Em uma classe derivada privada.
• Os membros públicos e protegidos da classe básica são privados.
• A classe privada derivada interrompe o acesso a todos os membros de todas as
classes ancestrais e suas sucessoras e os protegidos podem ou não ser acessíveis
às classes subsequentes.
• 3.1 – Suporte em C++
• 3.1.3 – Vinculação Dinâmica.
• Numa vinculação estática, uma chamada de função é vinculada
estaticamente a uma definição de função.
• No C++ uma variável ponteiro ou referência que tenha como tipo
uma classe pai pode apontar para objetos de qualquer classe filha.
• Para chamar uma função da classe filha a partir de uma dessas
variáveis utiliza-se a palavra virtual na declaração da função.
3.1 – Suporte em C++
3.1.3 – Vinculação
Dinâmica.
• 3.1 – Suporte em C++
• 3.1.3 – Vinculação Dinâmica.
• A função da classe pai não deve ter corpo pois será uma função
virtual pura.
• Apenas as funções das derivadas terão corpo pois serão chamadas
dinamicamente a partir da referencia feita pela classe pai
• Uma classe que inclui uma função virtual pura é uma classe abstrata e
não pode ser instanciada.
• Esse recurso permite alterações ou adições na função desenhar das
classes filhas sem grandes alterações de código.
• 3.1 – Suporte em C++
• 3.1.4 – Avaliação.
• A herança do C++ é mais confusa que a do SmallTalk
• No C++ o programador deve especificar a vinculação estática ou
dinâmica
• A verificação estática de tipos do C++ é muito mais eficiente que
dinâmica do SmallTalk
• SmallTalk preza pela elegância enquanto C++ pela
retrocomptibilidade com o C e desempenho.
• C++ chegou a ser 10 vezes mais rápida que o SmallTalk em
benchmarks.
3.2 – Suporte em Java
• 3.2 – Suporte em Java
• 3.2.1 – Características gerais.
• Não utiliza apenas objetos
• Tipos primitivos não são objetos
•
•
•
•
•
•
Não possui tipos enumeração ou registro.
Arrays são objetos.
As classes sempre tem um pai ao contrario do C++
Todas as classes derivam da classe object ou de alguma filha dela.
Todos os objetos em java são heap-dinâmicos explícitos.
Utiliza coletor de lixo.
• 3.2 – Suporte em Java
• 3.2.2 – Herança.
• Diretamente Java suporta apenas herança simples.
• Existe uma um tipo de classe virtual, a interface, que implementa uma espécie de
herança múltipla.
• Interfaces definem apenas a especificação de uma classe.
• Um classe pode herdar de uma classe pai e implementar um interface.
• Um exemplo de herança são os Applets.
• Quando um applet implementa uma animação é normalmente definida para rodar em
seu próprio Thread.
• Porém uma classe não pode herdar de Applet e Thread ao mesmo tempo
• Por isso utiliza-se a interface predefinida Runnable.
• Public class Clock extends Applet implementes Runnable.
• No java um método pode ser declarado como final, assim ele não pode ser
sobrescrito em nenhuma classe descendente.
• Quando um classe é declarada final em sua definição ela não pode ser pai de
nenhuma classe.
• 3.2 – Suporte em Java
• 3.2.3 – Vinculação Dinâmica.
• Todas as chamadas de métodos são Vinculadas dinamicamente.
• Métodos declarados como final não podem ser sobrescritos por isso
possuem vinculação estática.
• Diferente do C++ que é preciso declarar um método como virtual
para utilizar vinculação dinâmica.
• Aqui a vinculação estática precisa de declaração.
• 3.2 – Suporte em Java
• 3.2.4 – Encapsulamento.
• Dois tipos Classes e Pacotes
• Pacotes são um Encapsulamento lógico.
• Um pacote cria um novo nome de espaço.
• Variáveis sem modificador de acesso tem um escopo de pocte.
• Todos os métodos e variáveis privados não declarados são visíveis em
todo o pacote no qual são declarados
• Ampliação do conceito de protegido do C++
• Alternativa aos amigos no C++
• 3.2 – Suporte em Java
• 3.2.5 – Avaliação.
• Projeto similar ao C++
• Mas tem diferenças
•
•
•
•
Ausência de funções.
Não permite classes sem pais.
Vinculação dinâmica é normal
Controles de acesso simplificados, Variando de controles de derivação a
funções amigas.
3.3 – Suporte em ADA 95
• 3.3 – Suporte em ADA 95
• 3.3.1 – Características gerais.
• Derivada do ADA 83, mas com extensões significativas.
• Projetada para suportar orientação o objetos.
• ADA 83 já possuía suporte a tipos abstratos.
• Implementaram apenas suporte a vinculação dinâmica e herança.
• Tinha o objetivo de mudar o mínimo no ADA 83
• E manter a verificação de tipos estática.
• Classes como uma nova categoria, tipos marcados.
• Esses tipos podem ser registros ou tipos privados.
• São encapsulados em pacotes que permitem compilação separada.
• OS tipos são chamados marcados porque incluem implicitamente uma tag.
• O subprograma que define as operações em um tipo-marcado aparece
na mesma lista da declaração que a do tipo.
3.3 – Suporte em ADA 95
3.3.1 – Características
gerais.
• 3.3 – Suporte em ADA 95
• 3.3.2 – Herança.
• Os tipos derivados baseiam-se em tipos marcados.
• Novas entidades são adicionadas às herdadas incluindo uma
definição de registro.
• Essa nova classe é definida em um pacote separado, para não exigir
a recompilarão do tipo-pai.
• Por esse mecanismo de herança não existe nenhuma maneira de
impedir que as entidades da classe-pai sejam incluídas na derivada.
• Classes derivadas podem somente estender classes-pai, e portanto
são subtipos.
• 3.3 – Suporte em ADA 95
• 3.3.3 – Vinculação Dinâmica.
• Oferece tanto vinculação dinâmica quanto estática.
• A vinculação dinâmica é forçada utilizando tipos de classe ampla.
• Três tipos básicos puramente abstratos podem ser definidos no ADA
95.
• Basta declarar como abstract nas definições de tipos
• As definições de subprogramas não podem ter corpos.
• 3.3 – Suporte em ADA 95
• 3.3.4 – Avaliação.
• Não é possível comparar ADA 95 com C++, baseando apenas no que foi
apresentado.
• Elas são muito diferentes.
• Porém as classes C++ tem seu próprio sistemas de tipos usual herdado do
C
• C++ oferece melhor suporte a herança múltipla.
• ADA não inclui suporte a construtores e destrutores.
• ADA não restringe a vinculação dinâmica apenas a ponteiros e
referências. E sim aos próprios objetos.
3.4 – Considerações Finais
• 3.4 – Considerações Finais
• A programação Orientada a a objetos inclui três conceitos fundamentais:
• Tipos de dados abstratos.
• Herança.
• Vinculação Dinâmica.
• Paradigma suportado com:
• Classes
• Métodos
• Objetos
• Passagem de mensagens
• Alguma linguagens são Puramente OO (SmallTalk)
• Outras Híbridas (C++)
• E outras controversas (Java)
Download