Prévia do material em texto
12 Abudo João Daudo Age Chame Xavier Nasir Camilo Paquile Perisitide Felisberto Polimorfismo e Tipos de Classes (Licenciatura em Ensino de Informática) Universidade Rovuma Nampula 2020 Abudo João Daudo Age Chame Xavier Nasir Camilo Paquile Perisitide Felisberto Polimorfismo e Tipos de Classes Trabalho de Pesquisa sobre Polimorfismo e Tipos de classe, recomendado na Faculdade de Engenharia e Ciência de Comunicação, na cadeira de Programação Funcional, no curso de Informática Pós-Laboral, 1º ano, pelo docente: dr. Adelino delima Universidade Rovuma Nampula 2020 Índice Introdução 3 Polimorfismo 4 Sobrecarga 4 Coerção 4 Inclusão 5 Paramétrico/Generics 5 Tipo de classe 6 Classe e Objecto 6 Encapsulamento 6 Herança 7 Polimorfismo 8 Associação de uma classe 8 Agregação 9 Composição 9 Classes abstractas e concretas 9 Conclusão 11 Bibliografia 12 ii Introdução O presente trabalho que fala de polimorfismo e tipos de classe, iremos iniciar o aprendizado do princípio que serve de base para a Programação. Esse princípio também aposta na ideia da reutilização para facilitar o dia a dia da programação. Definimos Polimorfismo como um princípio a partir do qual as classes derivadas de uma única classe base são capazes de invocar os métodos que, embora apresentem a mesma assinatura, comportam-se de maneira diferente para cada uma das classes derivadas.Com o Polimorfismo, os mesmos atributos e objetos podem ser utilizados em objetos distintos, porém, com implementações lógicas diferentes. Ele é também bastante importante tanto para o entendimento de programas de Linguagens de programacao, como também é um mecanismo bastante sofisticado para permitir a reutilização e flexibilidade durante o desenvolvimento de tais programas. Objectivos · entender o princípio do Polimorfismo; · saber quais são os tipos existentes de Polimorfismo; · saber Tipos de classe. Polimorfismo Segundo HORSTMANN (2013), O Polimorfismo é um mecanismo por meio do qual selecionamos as funcionalidades utilizadas de forma dinâmica por um programa no decorrer de sua execução. É a capacidade de um objecto em decidir que método aplicar a si mesmo. Termo originário do grego: "muitas formas"(poli = muitas, morphos = formas). Polimorfismo é uma funcionalidade da Programação Orientada a Objecto que permite chamar métodos de uma classe padrão e que os mesmos tenham assinatura similares, porém, funcionam de formas diferentes. Sua característica é quando duas ou mais classes diferentes têm métodos com o mesmo nome, de forma que uma função possa usar um objecto de qualquer uma das classes polimórficas, sem necessidade de tratar de forma diferenciada conforme a classe do objecto. Exemplo simples: em um jogo de xadrez temos várias peças, cada peça se movimenta, porém cada tipo de peça se movimenta de uma maneira diferente (o peão vai pra frente, o cavalo anda em L, o bisbo em diagonal e assim por diante) Métodos/Funções: · São polimórficos se têm pelo menos dois tipos diferentes. Sobrecarga Técnica conhecida também por Overloading, é uma técnica que permite a existência de vários métodos com o mesmo nome, porém com assinaturas levemente diferentes. Estas mudanças podem ser variando no número, tipo de argumentos, no valor de retorno e até variáveis diferentes. Em orientação a objectos, uma sobrecarga se refere aos métodos de uma classe, sendo que os mesmos podem ser sobrecarregados em relação aos seus nomes, podendo diversos métodos possuir o mesmo nome, porém os tipos de dados da lista de parâmetros devem ser diferentes, RAMNATH(2010). Coerção Técnica conhecida também por Casting, acontece quando um tipo primitivo ou um objecto é convertido em outro tipo de objecto ou tipo primitivo. Isto é muito comum em casos em que precisamos definir um modelo genérico que seja redefinido depois por outras classes de objectos. Para que isso aconteça o padrão é construído usando somente tipos abstractos, do qual se derivam diversos tipos de objectos dependendo da necessidade. Quando aplicado em tipos primitivos, ele serve para converter um tipo primitivo em outro RAMNATH(2010). Exemplo 1: int total = 0; double average = (double) total; Quando aplicado em objectos, ele serve para reinterpretar o tipo do valor de variável ou parâmetro, ou então retornado por um método. Exemplo 2: Numero n = new Long (10); Long x = (Long) n; Neste caso Long é uma subclasse de Numero. Sabe-se que a variável n (cujo tipo é Numero) possui um objecto do tipo Long. Portanto você pode efectuar a coerção para Long. Normalmente este método é utilizado em contas com variáveis de tipos diferentes, onde a variável que sofre a coerção é temporariamente convertida no tipo que você deseja. Inclusão Através de uma referência para interfaces ou super classes, é possível abordar um conjunto amplo de tipos de objectos. A inclusão permite a um objecto pertencer a várias classes simultaneamente, criando uma hierarquia de herança. Numa subclasse, um objecto pode ter um comportamento modificado com relação à classe original. Assim só ocorre em linguagens que permitem subtipo e herança. Uma instância de uma subclasse pode ser manipulada pelas mesmas funções que manipulam instâncias da superclasse. Logo Em programação , polimorfismo de inclusão é um polimorfismo de subtipo, como é comummente conhecido por Subtype, RAMNATH(2010). Paramétrico/Generics Também é chamado de Generics, basicamente é uma função ou um tipo de dado que pode ser escrito genericamente para que ele possa lidar com valores de forma idêntica sem depender do seu tipo. Genehrics pode ser feito tanto com estruturas ou classes. É usado para tornar uma linguagem mais expressiva e mantém sua tipagem estática segura. Esse tipo de polimorfismo só ocorrem em linguagens tipadas, e não é tão comum em linguagens OO como Java e C#, e sim mais comum em linguagens funcionais como Haskell e OCaml. Tipo de classe Classe e Objecto Segundo WEISFELD, 2013, Uma classe é uma forma de definir um tipo de dado em uma linguagem orientada a objecto. Ela é formada por dados e comportamentos. Para definir os dados são utilizados os atributos, e para definir o comportamento são utilizados métodos. Depois que uma classe é definida podem ser criados diferentes objectos que utilizam a classe Em uso casual, as pessoas muitas vezes referem-se a "classe" de um objecto, mas objectos estritamente falando tem tipo : a interface, ou seja, os tipos de variáveis de membro, as assinaturas de funções membro (métodos) e propriedades estes satisfazem. Ao mesmo tempo, uma classe tem uma aplicação (especificamente a aplicação dos métodos), e pode criar objectos de um determinado tipo, com uma dada implementação. Tipos geralmente representam substantivos, como uma pessoa, lugar ou coisa, ou algo nominalizado , e uma classe representa uma implementação destes. Por exemplo, um Banana tipo pode representar as propriedades e funcionalidades de bananas em geral, enquanto os ABCBanana e XYZBanana aulas representaria formas de bananas produtores (por exemplo, fornecedores de bananas ou estruturas de dados e funções para representar e desenhar bananas em um jogo de vídeo). Encapsulamento O conceito do encapsulamento consiste em “esconder” os atributos da classe de quem for utilizá-la. Isso se deve por dois motivos principais. É a característica do objecto de esconder seus dados e suas operações dos outros objectos. As operações e os dados são encapsulados em um módulo chamado classe que pode ser visto como um pattern para criar objectos (instanciação). O usuário não se preocupa com a implementação dos métodos, mas apenas com a interface da classe, alcançando um alto grau de desacoplamento, uma vez que é possível alterar a implementação de um método sem alterar a interface. Segundo Edward Bernard: "Abstracção e encapsulamento são definições distintas, porém estão fortemente relacionadas. Abstracção é uma técnica que ajuda a identificar quais informações devem ser visíveis e quais não devem ser. Encapsulamento é a técnicapara encapsular a informação de modo a esconder o que deve ser escondido e fazer visível o que deve ser visível." Herança É um mecanismo que ajuda definir relações de subtipo e reusar código. Contudo herança e subtipo são mecanismos distintos e devem ter construtores diferentes nas linguagens de programação. Herança é um conceito muito poderoso, uma vez que possibilita que os desenvolvedores maximizem o uso dos métodos (comportamento) e dos dados (estrutura) dos objectos existentes. Pode-se entender herança, sob a óptica de linguagem de programação orientada a objectos, como sendo um mecanismo para construir classes a partir de classes existentes. MEYER, (1997). O mecanismo de herança pode ser classificado de três maneiras independentes: Estático ou Dinâmico; Implícito ou Explícito; por Objecto ou por Grupo. A maioria das linguagens que utilizam o paradigma de orientação a objectos são: i) estáticas (a herança é estabelecida em tempo de compilação); ii) ii) implícitas (o comportamento de um objecto depende da sua classe, que não pode ser alterada) e iii) iii) por grupo (as características de herança são especificadas para uma classe, não para objectos específicos). Existe 2 tipos de Heranças por grupo: Simples: quando há uma relação de hierarquia de uma ou mais classes com apenas um outra classe. Ou seja, uma ou mais classes (subclasses) herdam atributos e/ou operações de uma única classe (super classe); Múltipla: quando há uma relação de hierarquia de uma classe com duas ou mais classes. Ou seja, uma classe (subclasse) herda atributos e/ou operações de duas ou mais classes (superclasses). A herança múltipla pode impactar em uma das características de orientação a objectos: encapsulamento e pode introduzir complexidade nas linguagens orientadas a objectos. No mundo real, existem situações onde uma classe pode derivar de duas ou mais classes, com o uso da herança múltipla evita-se redundância e repetição de código, contudo torna-se mais difícil semanticamente entender o relacionamento entre elas. Polimorfismo O polimorfismo permite que referências de tipos de classes mais abstractas representem o comportamento das classes concretas que referenciam. Assim, um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efectivamente separada da implementação que a representa. O termo polimorfismo é originário do grego e significa 'muitas formas' (poli = muitas, morphos = formas). HORSTMANN (2013). Associação de uma classe Uma associação é um vínculo que permite que objectos de uma ou mais classes se relacionem. Através destes vínculos é possível que um objecto convoque comportamentos e estados de outros objectos. Exemplo de associação unária em UML As associações podem ser: · unárias - quando a associação ocorre entre objectos de uma mesma classe. · binárias - quando a associação ocorre entre dois objectos de classes distintas. · múltiplas - quando a associação ocorre entre mais de dois objectos de classes distintas. Cada associação possui características de: · cardinalidade ou multiplicidade - determina quantos objectos no sistema são possíveis em cada vértice da associação. · navegação - se é possível para cada objecto cessar outro objecto da mesma associação. No exemplo de associação unária acima, cada pessoa tem um único pai (cardinalidade 1) e qualquer número de filhos (cardinalidade *). De acordo com a seta de navegação, só é possível navegar para o pai de cada pessoa. Desta forma cada objecto da classe Pessoa consegue a cessar seu objecto pai, mas não consegue a cessar seus objectos filhos. Agregação Tipo de relacionamento com características todo-parte, onde existe um grau de acoplamento entre o todo e as partes menos intenso, podendo haver certo grau de independência entre eles. Composição Tipo de relacionamento com características todo-parte, onde existe um alto grau de coesão entre o todo e as partes, com total grau de dependência entre eles (todo e as partes). Desta forma, se o todo não existir, as partes também não existirão. Um exemplo de composição é a mão: Uma mão é composta por dedos. Os dedos compõem a mão. Não há lógica em existir um dedo sem mão, porém pode-se ter uma mão sem um ou mais dedos Classes abstractas e concretas Uma classe abstracta é desenvolvida para representar entidades e conceitos abstractos. A classe abstracta é sempre uma superclasse que não possui instâncias. Ela define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta - a parte genérica dessa funcionalidade - que é compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas completa a funcionalidade da classe abstracta adicionando um comportamento específico. Uma classe abstracta normalmente possui métodos abstractos. Esses métodos são implementados nas suas classes derivadas concretas com o objectivo de definir o comportamento específico. Os objectos armazenam dados e possuem interface definida que determina o seu comportamento. O método abstracto define apenas a assinatura do método e, portanto, não contém código. Por outro lado, as classes concretas implementam todos os seus métodos e permitem a criação de instâncias. Uma classe concreta não possui métodos abstractos e, geralmente, quando utilizadas neste contexto, são classes derivadas de uma classe abstracta. Conclusão Na linguagem de Programação está em nosso dia-a-dia facilitando as nossas vidas. Uma classe abstracta normalmente possui métodos abstractos. Esses métodos são implementados nas suas classes derivadas concretas com o objectivo de definir o comportamento específico. Os objectos armazenam dados e possuem interface definida que determina o seu comportamento. O método abstracto define apenas a assinatura do método e, portanto, não contém código. Em linguagem de Programação possui ainda inúmeras ferramentas e aplicativos facilitadores que interagem ajudando os desenvolvedores e, apresenta aos iniciantes um leque de opções, dando a oportunidade de se identificarem com a linguagem de estudo de trabalho geralmente representam substantivos, como uma pessoa, lugar ou coisa, ou algo nominalizado , e uma classe representa uma implementação destes. Bibliografia HORSTMANN, C. Java for everyone: late objects. 2nd ed. Danvers: Wiley, 2013. 589 p. RAMNATH, S.; DATHAN, B. Object-oriented analysis and design. New York: Springer, 2010. 440 p. WEISFELD, M. The object-oriented thought process. 4th ed. Addison Wesley, 2013. 36 p MEYER, B. Object Oriented Software Construction. 2a ed. Prentice-Hall, 1997. 1254 p. Abudo João Daudo Age Chame X a v ier Nasir Camilo Paquile Peris itide Felisberto Polimorfismo e Tipos de C lasses ( Licenciatura em Ensino de Informática ) Universidade Rovuma Nampula 2020 Abudo João Daudo Age Chame Xavier Nasir Camilo Paquile Perisitide Felisberto Polimorfismo e Tipos de Classes (Licenciatura em Ensino de Informática) Universidade Rovuma Nampula 2020