Hablaremos de esta peculiar característica para hacer copias independientes y personalizadas de clases ya construidas, propia de la programación orientada a objetos.
La programación orientada a objetos tiene un mecanismo llamado herencia por el que se pueden definir clases a partir de otras clases. Las clases realizadas a partir de otra clase o mejor dicho, que extienden a otra clase, se llaman clases extendidas o clases derivadas.
Las clases extendidas heredan todos los atributos y métodos de la clase base. Además, pueden tener tantos atributos y métodos nuevos como se desee.
Para ampliar el ejemplo que venimos desarrollando, la clase Caja, vamos a crear una clase extendida llamada Caja_tematica. Esta clase hereda de caja, pero además tiene un "tema", que es la descripción del tipo de cosas que metemos en la caja. Con esto podemos tener varias cajas, cada una con cosas de un tema concreto.
class Caja_tematica extends Caja{
var $tema;
function define_tema($nuevo_tema){
$this->tema = $nuevo_tema;
}
}
En esta clase heredamos de Caja, con lo que tenemos a nuestra disposición todos los atributos y métodos de la clase base. Además, se ha definido un nuevo atributo, llamado $tema, y un método, llamado define_tema(), que recibe el tema con el que se desea etiquetar la caja.
Podríamos utilizar la clase Caja_tematica de manera similar a como lo hacíamos con la clase Caja original.
$micaja_tematica = new Caja_tematica();
$micaja_tematica->define_tema("Cables y contectores");
$micaja_tematica->introduce("Cable de red");
$micaja_tematica->introduce("Conector RJ45");
$micaja_tematica->muestra_contenido();
En este caso, el resultado que se obtiene es parecido al que se obtiene para la clase base. Sin embargo, cuando se muestra el contenido de una caja, lo más interesante sería que se indicara también el tipo de objetos que contiene la caja temática. Para ello, tenemos que redefinir el método muestra_contenido().
Redefinir métodos en clases extendidas
Redefinir métodos significa volver a codificarlos, es decir, volver a escribir su código para la clase extendida. En este caso, tenemos que redefinir el método muestra_contenido() para que muestre también el tema de la caja.
Para redefinir un método, lo único que debemos hacer es volverlo a escribir dentro de la clase extendida.
function muestra_contenido(){
echo "Contenido de la caja de <b>" . $this->tema . "</b>: " . $this->contenido;
}
En este ejemplo hemos codificado de nuevo el método entero para mostrar los datos completos.
En algunas ocasiones es muy útil apoyarse en la definición de un método de la clase base para realizar las acciones de la clase extendida. Por ejemplo, para este ejemplo, tenemos que definir un constructor para la clase Caja_tematica, en el que también se inicialice el tema de la caja. Como ya existe un método constructor en la clase base, no merece la pena reescribir el código de éste, lo mejor es llamar al constructor que había definido en la clase Caja original, con lo que se inicializarán todos los datos de la clase base, y luego realizar la inicialización para los atributos de la propia clase extendida.
Para llamar a un método de la clase padre dentro del código de un método que estamos redefiniendo, utilizamos una sintaxis como esta:
function Caja_tematica($alto=1,$ancho=1,$largo=1,$color="negro",$tema="Sin clasificación"){
parent::Caja($alto,$ancho,$largo,$color);
$this->tema=$tema;
}
Aquí vemos la redefinición del constructor, de la clase Caja, para la clase Caja_tematica. El constructor hace primero una llamada al constructor de la clase base, a través de una referencia a "parent". Luego inicializa el valor del atributo $tema, que es específico de la Caja_tematica.
En la misma línea de trabajo, podemos redefinir el método muestra_contenido() apoyándonos en el que fue declarado en la clase base. El código quedaría como sigue:
function muestra_contenido(){
echo "Contenido de la caja de <b>" . $this->tema . "</b>: ";
parent::muestra_contenido();
}
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...