dominios y alojamiento web en hostalia

La herencia en PHP5, Tercera parte

17 de junio de 2005
Valoración del artículo:
Creamos otras clases a partir de una clase padre, para continuar con nuestro ejemplo de videoclub.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
La clase soporte tiene otras clases que heredan de ella y que todavía no hemos definido.

Veamos primero el código de la clase "dvd", que es muy parecido al visto para la clase cinta_video. Lo único que cambia es que ahora vamos a definir otros atributos relacionados con los DVD, como son los idiomas disponibles en el DVD y el formato de pantalla que tiene la grabación.

class dvd extends soporte{
   public $idiomas_disponibles;
   private $formato_pantalla;

   function __construct($tit,$num,$precio,$idiomas,$pantalla){
      parent::__construct($tit,$num,$precio);
      $this->idiomas_disponibles = $idiomas;
      $this->formato_pantalla = $pantalla;
}

   public function imprime_caracteristicas(){
      echo "Película en DVD:<br>";
      parent::imprime_caracteristicas();
      echo "<br>" . $this->idiomas_disponibles;
   }
}
Nota:Para una explicación detallada de este código os referimos al capítulo anterior, donde se explicaba la clase cinta_video y la sobrescritura de métodos.


Por su parte, la clase juego, tendrá 3 nuevos atributos. Estos son "consola", para especificar la consola para la que está creado este juego, "min_num_jugadores", para especificar el número de jugadores mínimo y "max_num_jugadores", para especificar el máximo número de jugadores que pueden participar en el juego.

Este será el código de la clase juego.

class juego extends soporte{
   public $consola; //nombre de la consola del juego ej: playstation
   private $min_num_jugadores;
   private $max_num_jugadores;

   function __construct($tit,$num,$precio,$consola,$min_j,$max_j){
      parent::__construct($tit,$num,$precio);
      $this->consola = $consola;
      $this->min_num_jugadores = $min_j;
      $this->max_num_jugadores = $max_j;
   }

   public function imprime_jugadores_posibles(){
      if ($this->min_num_jugadores == $this->max_num_jugadores){
         if ($this->min_num_jugadores==1)
         echo "<br>Para un jugador";
         else
         echo "<br>Para " . $this->min_num_jugadores . " jugadores";
      }else{
       echo "<br>De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . " Jugadores.";
      }
   }

   public function imprime_caracteristicas(){
      echo "Juego para: " . $this->consola . "<br>";
      parent::imprime_caracteristicas();
      echo "<br>" . $this->imprime_jugadores_posibles();
   }
}


Nos fijamos en el constructor, que llama al constructor de la clase padre para inicializar algunos atributos propios de los soportes en general.

Luego nos fijamos en el método imprime_jugadores_posibles(), que muestra los jugadores permitidos. Ha sido declarada como public, para que se pueda acceder a ella desde cualquier lugar. Nos da un mensaje como "Para un jugador" o "De 1 a 2 Jugadores", dependiendo de los valores min_num_jugadores y max_num_jugadores.

Por su parte, se sobrescribe la función imprime_caracteristicas(), para mostrar todos los datos de cada juego. Primero se muestra la consola para la que se ha creado el juego. Los datos generales (propios de la clase "soporte") se muestran llamando al mismo método de la clase "parent" y el número de jugadores disponibles se muestra con una llamada al método imprime_jugadores_posibles().

Podríamos utilizar un código como el que sigue, si es que queremos comprobar que la clase funciona correctamente y que nos ofrece la salida que estábamos pensando.

$mijuego = new juego("Final Fantasy", 21, 2.5, "Playstation",1,1);
$mijuego->imprime_caracteristicas();

//esta línea daría un error porque no se permite acceder a un atributo private del objeto
//echo "<br>Jugadores: " . $mijuego->min_num_jugadores;
//habria que crear un método para que acceda a los atributos private
$mijuego->imprime_jugadores_posibles();

echo "<p>";
$mijuego2 = new juego("GP Motoracer", 27, 3, "Playstation II",1,2);
echo "<b>" . $mijuego2->titulo . "</b>";
$mijuego2->imprime_jugadores_posibles();


Este código que utiliza la clase "juego" dará como salida:

Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador

Para un jugador
GP Motoracer
De 1 a 2 Jugadores.

Compartir en redes sociales

Comentarios
Fueron enviados 2 comentarios al artículo
1 comentario no revisado
1 comentario revisado:

Nessia
re: duda
30/5/2011
Creo que no has entendido bien como funciona la herencia. Hijo no tiene a padre, hijo solo tiene los atributos que tu le digas, ademas de los atributos que tiene padre.

Cuando una clase hereda de otra, es como si la clase hijo fuese lo mismo que la clase padre pero más específica. Por ejemplo, si tienes la clase padre Mascota y la clase Perro hereda de ella, no significa que el perro tenga una mascota, significa que el perro ES una mascota.

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo económico...