En esta publicación hablaré de las Clase Abstractas y de las Interfaces, usaremos el ejemplo de las figuras geométricas expuesto en la publicación anterior.
En la Unidad I expliqué que una clase era un concepto o plantilla y que esta al ser instanciada se transformaba en un objeto en memoria, una clase abstracta sigue siendo un concepto, pero a diferencia de la clase normal (clase concreta) esta no puede ser instanciada.
Una clase abstracta posee funciones abstractas, son métodos que no han sido escritos, sólo está su cabecera, y sólo estas clases pueden representarlos, su objetivo es ser escritos (implementados) por las subclases, y así aplicar el polimorfismo explicado en la Unidad II.
Explicaré mejor las diferencias entre clases abstractas y clases concretas mediante una tabla:
| Clases Abstractas | Clases Concretas |
| Se usan para generalizar o clasificar clases concretas | Se usan para representar un objeto |
| Son usadas para ser heredadas, por que no pueden ser instanciadas | Pueden ser instanciadas y heredadas si se desea |
| Poseen métodos abstractos (sin implementación) | No poseen métodos abstractos |
| Poseen métodos implementados | Poseen métodos implementados |
Para crear una clase o función abstracta usaremos la palabra reservada abstract.
Ahora mejorando el código de la Unidad II, la nueva superclase:
Nuevo Archivo: Figura.php
<?php
abstract class Figura {//Inicio de la clase abstracta
//Atributos
private $color;
private $nombre;
//Funciones
public function getColor(){
return $this->color;
}
public function setColor($color){
$this->color=$color;
}
public function getNombre(){
return $this->nombre;
}
public function setNombre($nombre) {
$this->nombre=$nombre;
}
abstract public function area();//Funcion sin implementacion
}//Fin de la clase
?>
Notemos la sintaxis, en la cabecera de la clase se colocó abstract class, y ahora la función area() también es abstracta, notemos que no tiene llaves {...}, la función termina en punto y coma ;
abstract public function area();//Funcion sin implementacion
Si intentaramos instanciar Figura generaría un error ( $figura = new Figura(); )
Fatal error: Cannot instantiate abstract class Figura in...
Este dice que no se puede instanciar una clase abstracta.
Los otros archivos quedarían igual.
Una interfaz es una colección de funciones sin implementación, son similares a las clases abstractas, no pueden ser instanciadas, pero además todas las funciones son abstractas, su objetivo principal es obligar a las clases concretas a que implementen todos sus métodos abstractos, así se asegura que todas las clases que la usen o mejor dicho que implementen la interfaz tengan los métodos que deben ser comunes, y asegurar el polimorfismo de los mismos. Si una clase abstracta implementa una interfaz no necesita implementar las funciones de la misma.
Para declarar una interfaz usaremos la palabra reservada interface.
Archivo: IFigura.php
<?php
interface IFigura {//Inicio de la interfaz
public function area();
}//Fin de la interfaz
?>
Ahora cambiemos la clase abstracta Figura, simplemente eliminamos el método area();
Luego veamos como quedaria la clase Rectangulo, para usar una interfaz usaremos la palabra implements:
Nuevo Archivo: Rectangulo.php
<?php
class Rectangulo extends Figura implements IFigura {//Inicio de la clase
//Atributos
private $ladoA;
private $ladoB;
//Funciones
public function getLadoA(){
return $this->ladoA;
}
public function setLadoA($ladoA){
$this->ladoA=$ladoA;
}
public function getLadoB(){
return $this->ladoB;
}
public function setLadoB($ladoB){
$this->ladoB=$ladoB;
}
//Funcion Polimorfica
public function area(){
return ($this->ladoA*$this->ladoB);
}
}//Fin de la clase
?>
Si no implementaramos area() cuando corrieramos el codigo pasaría esto:
Fatal error: Class Rectangulo contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (IFigura::area) in...
Nos dice que hay un método abstracto declarado en la interfaz y que en Rectangulo no ha sido implementado.
Recordemos incluir la interfaz en el index:
Nuevo Archivo: index.php
<?php
include 'Figura.php';
include 'IFigura.php';//Nueva inclusion
include 'Triangulo.php';
include 'Rectangulo.php';
.
.
.
?>
Recuerda hacer preguntas si tienes dudas en algo...
Postear en Twitter
Postear en Facebook
Feed RSS
Agregar a Favoritos
php, unidad, clase, abstractas, usaremos, ser, concreta, funciones, metodos, clases, pueden, implementados, concretas, poseen, palabra, nuevo, archivo, figura, class, area, error, fatal, interfaz, ifigura, rectangulo, index
¡Amigo! te demorarás 10 segundos en crear tu cuenta.
Disfrutarás de todos los beneficios de DocumentoWeb.