En una entrada anterior del blog, introdujimos un concepto muy importante en la programación orientada a objetos: Las clases. Ahora repasaremos otro concepto fundamental: La herencia, el mecanismo que permite a una clase adquirir el comportamiento de otra clase.
¿Recuerdas el ejemplo de la entrada anterior con la clase «Persona»? Imaginemos un colegio y queremos gestionar alumnos y profesores. Ambos son personas, pero con características diferentes. Así que creamos una clase «Profesor» y una clase «Alumno», y ambas clases heredan características de la clase «Persona».
¿Cómo se hereda una clase de otra?
Una nueva Class extends para facilitar la herencia. Utilizando nuestro ejemplo de la escuela, creamos una clase «Estudiante» que hereda la clase «Persona».
Class Extends Person
¿Y el constructor?
Pues para el constructor (si no has definido un constructor específico para la clase «Alumno»), se llama automáticamente al constructor de la clase «Persona».
También se puede anular un constructor. Por ejemplo, en el caso de «Estudiante»: un estudiante tiene un nombre, apellido y fecha de nacimiento como una persona, pero un estudiante también tiene un grado y una escuela. En este caso, puede utilizar el comando new Super que permite llamar al constructor de la clase padre. Luego, en el constructor «Estudiante», puede añadir el código específico para el grado y la escuela.
Class constructor
.
C_TEXT( ) ( ) ( ) ( ) ( ) ( ; ; ) $1 // FirstName
C_TEXT$2 // LastName
C_DATE$3 // Birthdate
C_TEXT$4 // SchoolName
C_TEXT$5 // Grade
Super$1$2$3 // Call the "Person" constructor
ThisSchoolName:= . :=$4
ThisGrade$5
¿Y las funciones?
Se pueden añadir funciones propias de la clase «Alumno» desde las que se puede llamar a una función de la clase padre («Persona»).
En el siguiente ejemplo, tenemos una función que devuelve una cadena que contiene el nombre, el grado y la escuela del estudiante. En la clase «Persona», ya tenemos una función que devuelve el nombre completo de una persona. Así que llamamos a esta función, getFullName, y añadimos la información específica de un estudiante.
Function getIdentity
C_TEXT( ) := . ()+", "+ . +" nota en "+ .$0
$0SupergetFullNameThisGradeThisSchoolName
En un método, instanciamos una instancia de la clase «Estudiante». Llamamos a la función getFullName de la clase padre, «Persona». Luego, llamamos a la función getIdentity desde la clase «Alumno». Como puedes ver, no hay diferencias entre las funciones getFullName y getIdentity.
C_OBJECT($s)
$s :=cs.Student.new("Joe"; "Doe";!2002-02-20!; "Waco High School"; "10th")
$name :=$s.getFullName() //return John Doe
$identity :=$s.getIdentity(
) //return Joe DOE, 10th grade in Waco High School