Herencia
Explicación de la implementación de la herencia.
Para explicar este concepto vamos a extender un poco la clase Slime antes de empezar:
Explicación del código
Se han añadido funciones muy sencillas como sayHello
, heal
, attack
o evolve
. Estas funciones me permitirán explicar los conceptos que faltan de POO.
El problema que tenemos que solucionar actualmente es que tenemos Slimes de varios colores. Cada color de Slime tiene su propio tipo y por tanto sus ataques serán diferentes así como sus métodos.
Por ejemplo, el slime azul será de tipo agua y podrá mantener la respiración bajo el agua más que el resto. El rojo, de tipo fuego, tendrá resistencia a altas temperaturas. Sin embargo, todos ellos comparten todas las propiedades de la clase Slime.
La clase Slime
en este caso se convertirá en la clase Padre o Superclase de las clases específicas de SlimeAgua
o SlimeFuego
.
Las clases específicas SlimeAgua
y SlimeFuego
compartirán las propiedades de la clase padre Slime
y además podrán tener las suyas particulares. Esto es lo que conocemos como Herencia.
La clase Any
La clase Any es la raíz de la jerarquía de clases en Kotlin. Esto significa que cualquier clase que no herede explícitamente de otra superclase, lo hará implícitamente de la clase Any.
Esta clase Any tiene tres métodos según su implementación en Any.kt:
equals()
: Indica si otro objeto es igual al actual.hashCode()
: Retorna el código hash asociado al objeto.toString()
: Retorna la representación enString
del objeto.
Sintaxis
La sintaxis para aplicar la herencia es muy sencilla en Kotlin:
Modificador open
Las clases por defecto tienen el modificador final
, lo que significa que son el útimo eslabón de su arbol genealógico. Para que se pueda heredar de la clase Padre, hay que añadir a su cabecera el modificador open
.
Constructor primario
En el caso de que haya un constructor primario en la clase padre, habrá que inicializarlo en la clase descendiente:
Es importante darse cuenta de la inicialización de las variables en el ejemplo superior. Arg1
y Arg2
no están inicializadas en la clase descendiente
por que se van a inicializar en el constructor de la clase padre
.
Constructor secundario
Si la clase padre no tiene constructor primario o deseas realizar la llamada del mismo, desde un constructor secundario de la subclase, entonces usa la palabra reservada constructor
junto a la palabra reservada super
para la llamada.
Aplicación práctica
La sintaxis de aplicación de la herencia es la siguiente:
Como puede ver, los argumentos que se le pasan a la clase SlimeAgua
pero pertenecen a la clase Slime
, no se inicializan con val o var.
lungs
tampoco se inicializa con val o var por que no es un atributo, sino que se utiliza para inicializar el atributo waterResistance
.
La clase SlimeAgua
luego llama al constructor de la clase Slime
de la que hereda para que se cree una instancia de la misma y poder crearse a partir de esa una instancia de la clase SlimeAgua
.
Después nos encontramos con las propiedades que son exclusivas de la clase SlimeAgua
. Tanto atributos como métodos pueden ser específicos.
Ahora si que podemos hacer un objeto azulito como dios manda:
Se ve en el ejemplo anterior que azulito tiene acceso a todos los miembros de Slime
así como a las propiedades específicas de SlimeAgua
.
Last updated