POO: Polimorfisme
El polimorfisme és una important propietat de la POO, molt rellevant sobretot en llenguatges on no hi ha tipus dinàmics com el C++ o el Java. El què significa és que una referència (punter) a un objecte genèric (pare), al cridar a una funció que està sobrescrita per un objecte derivat, executarà la funció més "nova", és a dir, la de l'objecte instanciat realment.
El cas típic és tenir un array de punters a objectes pare que no sabem de quin tipus derivat exactament son, per exemple, un array de Pilotes. Segons com l'haguem creat, el punters apuntaran a objectes dels tiups PilotaDeTennis, PilotaDeFutbol i PilotaDeBasket, però no tenim perquè saber-ho, tot i que sabem segur que tots hereden de Pilota. Quan cridem al mètode accelera() s'executarà el de l'objecte derivat, no el del pare genèric, encara que el punter apunti a Pilota.
En el cas del Python no ens resulta molt rellevant ja que tenim tipus dinàmics amb total introspecció. Això vol dir que en tot moment sabem de quin tipus és cada objecte. A sobre, en Python podem tenir arrays d'objectes heterogenis, cosa que no es pot fer amb Java o C++. Així, el polimorfisme no en aquests llenguates és molt important, però no en Python.
Exemple de polimorfisme en C++
Repetim l'exemple de la Pilota i l'objecte derivat PilotaDeTennis. Podeu veure que l'objecte derivat sobreescriu la funció accelera. Si aquesta s'ha definit com a "virtual" (i això es important), la funció que s'executarà serà la més derivada possible (en aquest cas, la corresponent a la de la Pilota de Tennis):
#include <stdio.h>
class Pilota
{
public:
int posx;
int posy;
int velocitat;
virtual int accelera() {
velocitat += 5;
}
Pilota() {
posx=10;
posy=20;
velocitat=10;
}
};
class PilotaDeTennis : public Pilota
{
int color;
int accelera() {
velocitat += 12;
};
};
int main(void)
{
Pilota p;
PilotaDeTennis pt;
Pilota *a[5];
a[0] = &p;
a[1] = &pt;
a[0]->accelera();
a[1]->accelera();
printf("vel0=%d vel1=%d\n",a[0]->velocitat,a[1]->velocitat);
}
Per compilar-lo i executar-ho podem fer:
$ g++ pilotes.c $ ./a.out vel0=15 vel1=22
Podem veure que l'element [1] de l'array (PilotaDeTennis) s'ha accelerat diferent de l'element [0] (Pilota).