Baixe o app para aproveitar ainda mais
Prévia do material em texto
Abstração Genérica Renata Carvalho UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Unidades genéricas e instanciação • Uma unidade genérica é uma unidade de programa que é parametrizada em relação às enKdades das quais ela depende • A instanciação de uma unidade genérica cria uma unidade de programa ordinária, na qual, cada parâmetro formal da unidade é trocado por um argumento • Gera sob demanda uma família de unidades de programas similares evitando a redundância de código • Favorece a reusabilidade porque uma mesma unidade de programa pode ser instanciada em diferentes programas Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Unidades genéricas e instanciação • Unidades genéricas seguem o princípio da abstração • Uma unidade genérica é uma abstração sobre uma declaração • Possui um corpo – a declaração – e uma instanciação genérica é uma declaração que produzirá ligações pela elaboração do corpo da unidade genérica • Unidades genéricas são suportadas por Ada, C++ e Java em diferentes perspecKvas Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo • C++ suporta funções genéricas (func%on templates) e classes genéricas (class templates) template <int capacity> class Queue { private: char elems[capacity]; int front, rear, length; public: Queue(); void add (char e); char remove(); } Parâmetro formal da classe genérica – denota um valor inteiro a ser conhecido durante a instanciação Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo • Definição de construtores e métodos em separado template <int capacity> Queue<capacity>::Queue() { front = rear = length = 0; } template <int capacity> void Queue<capacity>::add (char e) { elems[rear] = e; rear = (rear + 1) % capacity; length++; } template <int capacity> char Queue<capacity>::remove () { char e = elems[front]; front = (front + 1) % capacity; length-‐-‐; return e; } Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo • Instanciação de pacotes genéricos typedef Queue<80> Input_Buffer; typedef Queue<120> Line_Buffer; • A instanciação resulta em classes nas quais os parâmetros formais são subsKtuídos pelo valor do argumento Input_Buffer inbuf; Line_Buffer outbuf; Line_Buffer errbuf; • ou Queue<80> inbuf; Queue<120> outbuf; Queue<120> errbuf; Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo • A instanciação on the fly de classes genéricas resulta num problema conceitual e em outro de ordem pragmáKca • O problema conceitual diz respeito a equivalência de Kpos • Duas variáveis outbuf e errbuf declaradas com Kpos Queue<120> e Queue<120> são equivalentes • Mas se duas variáveis são declaradas com Kpos Queue<m> e Queue<n-‐1>, o compilador não tem como decidir se os Kpos são equivalentes • ⇒ instanciações em C++ devem obrigatoriamente poder avaliar seus argumentos em tempo de compilação • O problema pragmáKco pode levar o programador a perder o controle sobre a expansão de código • Se Queue<120> ocorre em vários locais do código, um compilador não profissional pode gerar várias instâncias de Queue, enquanto um profissional geraria apenas uma única instância Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Tipos e classes parâmetros • Como uma unidade de programa usa um valor definido em qualquer lugar, a unidade de programa pode tornar-‐se genérica e parametrizada com relação a esse valor • Graças ao princípio da correspondência • Como uma unidade de programa usa um %po (ou classe) definido em qualquer lugar, a unidade de programa pode tornar-‐se genérica e parametrizada com relação a esse Kpo • Tem-‐se uma nova modalidade de parâmetro: o parâmetro que é um Kpo (ou uma classe) • Unidade genéricas em Ada, C++ e Java podem ter Kpos como parâmetros Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADECATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo: classe genérica em Java • Unidades genéricas foram introduzidas em Java com o lançamento da plataforma Java 2SE 5.0 em 2004 • Classes genéricas – classes que podem ser parametrizadas em relação a outras classes class List <Element> { private int length; private Element[] elems; public List () { ... } public void append (Element e) { ... } } Parâmetro formal da classe genérica List. Denota uma classe desconhecida a priori Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo: classe genérica em Java • Instanciação de classes genéricas • List<Character> sentence; List<TransacKon> transacKons; • O argumento na instanciação deve ser uma classe – Kpos primiKvos são proibidos • List<char> sentence; Instanciação ilegal Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo: classe genérica em Java • Caso uma classe genérica assuma que a classe parâmetro está equipada com operações, a classe parâmetro deve ser especificada como implementando uma interface adequada • Diz-‐se que tal classe parâmetro é limitada (bounded) pela interface class Sequence <Element implements Comparable<Element>> { private int length; private Element[] elems; ... public void sort () { Element e; if (e.compareTo(elems[i] < 0) ... } } Element é um parâmetro formal que denota uma classe Desconhecida, mas que deve implementar a interface Comparable, onde o método compareTo está especificado. Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Exemplo: classe genérica em Java • Em geral, se uma unidade genérica em Java tem uma classe parâmetro C, ela é especificada pela cláusula • C implements Interface; • O compilador verifica a unidade genérica para assegurar que • operações usadas por C na unidade genérica ⊆ nas operações declaradas em Interface • O compilador verifica separadamente cada instanciação da unidade genérica para assegurar que • operações declaradas na Interface ⊆ nas operações que equipam a classe passada como argumento • Uma vez implementada, as unidades genéricas em Java podem ser reusadas com segurança em relação a verificação de Kpos Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação UNICAP – UNIVERSIDADE CATÓLICA DE PERNAMBUCO Renata Carvalho Notas de Implementação • Unidades genéricas com Kpos parâmetros suscitam interessantes problemas de implementação • Como o Kpo parâmetro denota um Kpo desconhecido, o compilador não pode determinar, apenas da unidade genérica, como os valores do Kpo serão representados • Não há como saber o espaço de memória requerido, por exemplo • Somente quando a unidade genérica é instanciada é que o compilador pode saber essa informação Unidades genéricas e instanciação Exemplo Tipos e classes parâmetros Exemplo: classe genérica em Java Notas de Implementação
Compartilhar