Cómo construir una jerarquía de clases
Construir una jerarquía de clases no es solo por amor al arte.
Si divides un problema entre las clases y decides cuál de ellas debe ubicarse en la parte superior y cuál debe ubicarse en la parte inferior de la jerarquía, debes analizar cuidadosamente el problema, pero antes de mostrarte cómo hacerlo (y cómo no hacerlo), queremos resaltar un efecto interesante. No es nada extraordinario (es solo una consecuencia de las reglas generales presentadas anteriormente), pero recordarlo puede ser clave para comprender cómo funcionan algunos códigos y cómo se puede usar este efecto para construir un conjunto flexible de clases.
Echa un vistazo al código en el editor. Analicémoslo:
- Existen dos clases llamadas
Uno
yDos
, se entiende queDos
es derivada deUno
. Nada especial. Sin embargo, algo es notable: el métododoit()
. - El método
doit()
está definido dos veces: originalmente dentro deUno
y posteriormente dentro deDos
. La esencia del ejemplo radica en el hecho de que es invocado solo una vez - dentro deUno
.
La pregunta es: ¿cuál de los dos métodos será invocado por las dos últimas líneas del código?
La primera invocación parece ser simple, el invocar el método haz_algo()
del objeto uno
obviamente activará el primero de los métodos.
La segunda invocación necesita algo de atención. También es simple si tienes en cuenta cómo Python encuentra los componentes de la clase. La segunda invocación lanzará el método hazlo()
en la forma existente dentro de la clase Dos
, independientemente del hecho de que la invocación se lleva a cabo dentro de la clase Uno
.
En efecto, el código genera el siguiente resultado:
hazlo de Uno
hazlo de Dos
Nota: la situación en la cual la subclase puede modificar el comportamiento de su superclase (como en el ejemplo) se llama polimorfismo. La palabra proviene del griego (polys: "muchos, mucho" y morphe, "forma, forma"), lo que significa que una misma clase puede tomar varias formas dependiendo de las redefiniciones realizadas por cualquiera de sus subclases.
El método, redefinido en cualquiera de las superclases, que cambia el comportamiento de la superclase, se llama virtual.
En otras palabras, ninguna clase se da por hecho. El comportamiento de cada clase puede ser modificado en cualquier momento por cualquiera de sus subclases.
Te mostraremos cómo usar el polimorfismo para extender la flexibilidad de la clase.