Polimorfismo, Interfaces, Classes Abstractas: Difference between revisions
From Wiki**3
No edit summary |
No edit summary |
||
| Line 13: | Line 13: | ||
** ''late binding'' -- o método a invocar é apenas conhecido em tempo de execução (habitual em Java; única possibilidade em PHP e outras linguagens semelhantes; e métodos declarados com '''virtual''' em C++) | ** ''late binding'' -- o método a invocar é apenas conhecido em tempo de execução (habitual em Java; única possibilidade em PHP e outras linguagens semelhantes; e métodos declarados com '''virtual''' em C++) | ||
=Interfaces= | ==Interfaces== | ||
* Princípios e propriedades | * Princípios e propriedades | ||
* Separação de interface e implementação | * Separação de interface e implementação | ||
=Classes Abstractas= | ==Classes Abstractas== | ||
* Noção de classe abstracta | * Noção de classe abstracta | ||
* Propriedades | * Propriedades | ||
=== Abstracção e Polimorfismo === | |||
O conceito de abstracção está relacionado com a capacidade de descrição de conceitos "abstractos", i.e., conceitos que descrevem múltiplos conceitos concretos. Em linguages OO, como Java ou C++, estes conceitos abstractos correspondem a classes abstractas (Java e C++), interfaces (Java; ou classes virtuais puras em C++), ou mesmo classes concretas não específicas (Animal, por exemplo, por oposição a Cão ou Gato). Nestas linguagens, existe ainda a possibilidade de abstracção genérica, i.e., definição de classes com dependência de tipos não especificados quando a classe é escrita. Estão neste caso, os ''generics'' do Java (e.g. '''ArrayList<Integer>''') e os ''templates'' do C++ (e.g. '''std::vector<int>'''). | |||
O conceito de polimorfismo corresponde à capacidade de referir objectos através de tipos que não o seu próprio ou de tipos genéricos. Deste modo, estes últimos correspondem a polimorfismo na manipulação dos objectos numa estrutura genérica (exemplos acima). Outro tipo de polimorfismo, importante quando existem hierarquias de classes, é o polimorfismo de inclusão, que permite referir com tipos superiores na hierarquia objectos de tipos inferiores. | |||
As consequências para a programação são positivas: a abstracção e o polimorfismo permitem a código para tipos menos específicos (ou mesmo genéricos) que é utilizável com tipos mais específicos (numa hierarquia de classes), ou concretos e definidos independentemente da classe (como é o caso dos genéricos -- note-se que podem existir algumas restrições pontuais). Em termos de gestão da produção de código, estes aspectos são importantes para a reutilização e desenvolvimento incremental. | |||
=== Outros aspectos === | |||
* Discussão de aspectos problemáticos | * Discussão de aspectos problemáticos | ||
* Contraste com interfaces | * Contraste com interfaces | ||
==Exemplos== | ==Exemplos== | ||
Revision as of 09:21, 18 November 2013
Vários aspectos de polimorfismo:
- Polimorfismo e tipos primitivos
- Polimorfismo e tipos compostos (classes).
- Herança e polimorfismo: upcasting e downcasting.
- Definição de métodos: overloading vs. overriding
- Selecção do método a invocar:
- early binding -- o método a invocar é conhecido em tempo de compilação (e.g., final em Java e não-virtual em C++)
- late binding -- o método a invocar é apenas conhecido em tempo de execução (habitual em Java; única possibilidade em PHP e outras linguagens semelhantes; e métodos declarados com virtual em C++)
Interfaces
- Princípios e propriedades
- Separação de interface e implementação
Classes Abstractas
- Noção de classe abstracta
- Propriedades
Abstracção e Polimorfismo
O conceito de abstracção está relacionado com a capacidade de descrição de conceitos "abstractos", i.e., conceitos que descrevem múltiplos conceitos concretos. Em linguages OO, como Java ou C++, estes conceitos abstractos correspondem a classes abstractas (Java e C++), interfaces (Java; ou classes virtuais puras em C++), ou mesmo classes concretas não específicas (Animal, por exemplo, por oposição a Cão ou Gato). Nestas linguagens, existe ainda a possibilidade de abstracção genérica, i.e., definição de classes com dependência de tipos não especificados quando a classe é escrita. Estão neste caso, os generics do Java (e.g. ArrayList<Integer>) e os templates do C++ (e.g. std::vector<int>).
O conceito de polimorfismo corresponde à capacidade de referir objectos através de tipos que não o seu próprio ou de tipos genéricos. Deste modo, estes últimos correspondem a polimorfismo na manipulação dos objectos numa estrutura genérica (exemplos acima). Outro tipo de polimorfismo, importante quando existem hierarquias de classes, é o polimorfismo de inclusão, que permite referir com tipos superiores na hierarquia objectos de tipos inferiores.
As consequências para a programação são positivas: a abstracção e o polimorfismo permitem a código para tipos menos específicos (ou mesmo genéricos) que é utilizável com tipos mais específicos (numa hierarquia de classes), ou concretos e definidos independentemente da classe (como é o caso dos genéricos -- note-se que podem existir algumas restrições pontuais). Em termos de gestão da produção de código, estes aspectos são importantes para a reutilização e desenvolvimento incremental.
Outros aspectos
- Discussão de aspectos problemáticos
- Contraste com interfaces
Exemplos
- Exemplo simples: Animal, Mamífero, Gato
- Exemplos Simples de Interfaces em Java e C++ (classes virtuais puras)
- Exemplo com vários conceitos:
Cão,Vigilante,CãoDeGuarda,CãoPastor,Chihuahua,Robot,XP,XP2003