Clase abstracta

Publicado: junio 12, 2010 en POO

Clase abstracta

A diferencia de las clases, en una clase abstracta no podemos crear objetos ya que contiene una abstracción muy general, en pocas palabras una clase abstracta puede generalizar clases.

Tomemos el ejemplo de la clase carro, ¿habrá alguna forma de generalizar esta clase?
La respuesta es que ¡si! , se acuerdan que un coche, una moto y una bicicleta tenían comportamientos semejantes es por ello que podemos generalizar una clase (abstracta) en la cual la clase coche derive de ella. Por cierto incluso una clase abstracta puede derivar de otra clase abstracta.

El siguiente organigrama nos muestra un ejemplo de cómo pueden estar organizados los vehículos (para el ejemplo expandimos mas la raíz que lleva al automóvil).
organigrama automovil

En la imagen anterior en la última parte del organigrama se puede ver claramente que carro es de tipo terrestre y sabemos que un carro es un vehículo.

De este organigrama podemos ver que la clase Carro deriva de de la clase Terrestre y este a su vez deriva de la clase Vehículo. La clase Terrestre y Vehículo son clases abstractas por lo que No se pueden instanciar para crear objetos.

En una clase abstracta podemos implementar comportamientos y también características o estados pero recuerden que deben de ser generales por ejemplo: la clase abstracta Vehículo puede tener como característica la velocidad actual ya que cualquier vehículo puede tener una velocidad y como comportamiento puede tener: aumentarVelocidad (). Ahora para la clase Terrestre podemos tener la característica tipoDeSuelo en donde podemos poner: suelo montañoso, suelo firme, etc y como comportamiento podemos poner PasarBache() jeje suena sacado de la manga verdad , pero quien no ha tenido este problema cuando va manejando ya sea en un carro o una bicicleta jejeje también podemos poner el funcionamiento de frenar(). Y por ultimo como característica en un carro tenemos el número de puertas y como comportamiento podemos poner encender ().

Como ejemplo de todo lo anterior implementemos La Clase Carro que deriva (extiende) de la clase Terrestre y que a su vez extiende de la clase vehículo.
todos los archivos estan en una misma carpeta
Vehiculo.php

<?
//---------------------
//Clase abstracta vehiculo
abstract class Vehiculo{
	var $velocidad=0;  //velocidad actual del carro
    var $velocidadMaxima=0;
	
	function Vehiculo(){}
	
	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}
	
	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}
	
	function velocidadMaxima($velocidad){
		$this->velocidadMaxima=$velocidad;
		echo "<br> velocidad maxima=$this->velocidadMaxima";
	}
	
	
}
?>
    

Terrestre.php

<?
include_once("Vehiculo.php");

abstract class Terrestre extends Vehiculo{
	var $tipoDeSuelo="";  //velocidad actual del carro
    
	
	function Vehiculo($suelo){
		$this->tipoDeSuelo=$suelo;
	}
	    
	function PasarBache(){
		echo "<br>Pasando un bache";
	} 
	
	function frenar(){
		echo "<br>se puso el freno ";
	}
}
?>
    

Carro.php

<?php
include_once("Terrestre.php");

class Carro extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
    var $numeroDePuertas=2;

	function Carro($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(200);
	}
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}
	

}

?>
    

Moto.php

<?php
include_once("Terrestre.php");

class Moto extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
    

	function Moto($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(180);
	}
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}
	

}

?>
    

Bicicleta.php

<?php
include_once("Terrestre.php");

class Bicicleta extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $pedaleando=false;

	function Bicicleta($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(70);
	}
	
	function empezarApedalear(){
		$this->pedaleando=true;
		echo "<br>empezando a pedalear";
	}
	
	function dejarDepedalear(){
		$this->pedaleando=false;
		echo "<br>Dejando de pedalear";
	}

}

?>
    

index.php

<?php
//---------- Corre igual que la clase Coche del ejemplo anterior
	include_once("Carro.php");
	echo "<br>-------------------  FORD - MUSTANG   --------------------";
	$carro1=new Carro("FORD","MUSTANG","suelo firme");
	$carro1->encender();
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->aumentarVelocidad();
	   
	$carro1->aumentarVelocidad(50);
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->disminuirVelocidad();
	$carro1->disminuirVelocidad(50);
	$carro1->apagar();

	   
echo "<br>-------------------  OTRAS CARACTERISTICAS  De un carro --------------------";

   $carro3=new Carro("carro FORD","MUSTANG","suelo firme");
   $carro3->encender();
   $carro3->aumentarVelocidad(50);
   $carro3->disminuirVelocidad(30);
   $carro3->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $carro3->disminuirVelocidad(5);
   $carro3->frenar();
   $carro3->apagar();  

echo "<br>-------------------  PROBANDO UNA MOTOCICLETA   --------------------";
   include_once("MOTO.php");
   $moto=new Moto("HONDA","MOTO CBR 1000 RR Fireblade 2010","suelo firme");
   $moto->encender();
   $moto->aumentarVelocidad(50);
   $moto->disminuirVelocidad(30);
   $moto->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $moto->disminuirVelocidad(5);
   $moto->frenar();
   $moto->apagar();  
echo "<br>-------------------  Caracteristicas de una bicicleta --------------------";
include_once("Bicicleta.php");
   $bicicleta=new Bicicleta("KMC","bicicleta K710 Kool Chain","montaña");
   $bicicleta->empezarApedalear();
   $bicicleta->aumentarVelocidad(50);
   $bicicleta->disminuirVelocidad(30);
   $bicicleta->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $bicicleta->disminuirVelocidad(5);
   $bicicleta->dejarDepedalear();
   
?>
    

visualizen el index.php en su buscador y veran las similitudes de los tres vehiculos terrestres

About these ads
Comentarios
  1. Mario A. Martinez Leandro dice:

    Hola rodrigo, la verdad que esta muy bueno tu blog, desde hace mucho que estaba buscando algo asi, solo si me hicieras un favor ya que soy nuevo en todo esto, crees que pudieras explicar un poco mas la siguiente sentencia.

    parent::Terrestre($suelo);

    es que no existe ninguna funcion que se llame Terrestre… por que se invoca asi y tambien la funcion parent.

    Saludos

    • yeshuaijzus dice:

      La función parent manda llamar al constructor del padre
      Por ejemplo:
      La clase carro proviene de la clase terrestre y este a su vez de la clase Vehiculo
      Tenemos que:
      1-Vehiculo es padre de terrestre.
      2-Terrestre es padre de carro
      En los ejemplos mencionados arriba se manda llamar a parent::Terrestre($suelo) el cual mandaría llamar al constructor de la clase Terrestre pero como no se se definió el constructor en la clase terrestre el “parent” se dispara al próximo padre que es el constructor de la clase Vehiculo el cual no haría nada ya que no tuene sentencias que realizar.
      function Vehiculo(){} // este es el contructor de vehiculo
      // puedes poner un echo el cual indique que entro a este constructor
      Tambien puedes cambiar el nombre de la función Vehiculo dentro de la clase Terrestre y darle el nombre “Terrestre” esto indicara que es el constructor de la clase terrestre y este es el que se ejecutaria al llamar con “parent”.
      function Vehiculo($suelo)
      // cambiar por function Terrestre($suelo) en la clase Terrestre
      // creo que ese fue mi error en un principio :P

  2. debo decir que muy buenos ejemplos, solo me queda una duda. Por ejemplo en el archivo terrestre.php linea 7, si pones un método con el nombre del parent funciona como constructor del parent?? o se sobreescribe?? o funciona como constructor de la misma clase que lo tiene?? o que?? jaja muchas gracias y saludos

    • yeshuaijzus dice:

      En el archivo Terrestre.php no se definió un constructor para la clase Terrestre, pero si existe un método que se llama Vehiculo el cual es el mismo nombre que tiene el constructor de la clase Vehiculo y aunque tiene el mismo nombre del constructor este no remplaza al constructor de la clase Vehiculo simplemente funciona como un método más de la clase terrestre.
      El parent funciona para llamar aún método o constructor de la clase padre y esta sentencia debe de ser llamada dentro de un método o constructor de la clase hijo.
      (ver la respuesta al comentario anterior)

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s