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).
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