PHP » Tutorial » Diseño Orientado a Objetos Unidad III

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.

Clase Abstracta

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.

Interfaz

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

sauljp07

Publicado el 18 de Julio del 2010 por sauljp07

1224 visitas y 3 ediciones

¡Amigo! te demorarás 10 segundos en crear tu cuenta.

Disfrutarás de todos los beneficios de DocumentoWeb.

Twitter Twitter Facebook Facebook Feed RSS Feed RSS

www.DocumentoWeb.com Licencia Creative Commons