Polimorfismo, Interfaces, Classes Abstractas
From Wiki**3
Vários aspectos de polimorfismo:
- Polimorfismo e tipos primitivos
- Polimorfismo e tipos compostos (classes).
- Herança e polimorfismo: upcasting e downcasting.
- 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
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.
Definição de métodos: overloading vs. overriding
- Overloading: definição de métodos com o mesmo nome, mas com diferenças nos argumentos (tipo, número ou ambos) na mesma ou em classes relacionadas;
- Overriding: redefinição de um método definido anteriormente por uma das superclasses da hierarquia de uma classe.
- Overloading: Gato(int age) {...} e Gato(String name) {...}
- Overriding: redefinição por parte de Gato.respirar() de Animal.respirar() (sendo Gato uma subclasse de Animal)
Outros aspectos
- Discussão de aspectos problemáticos
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