Saltar la navegación

1.6.- Interfaces.

Diagrama UML del una clase producto, una interfaz i Muestra y una clase TV que hereda de producto e implementa la interfaz.
Captura de pantalla BlueJ (Elaboración propia.)

Un interface es como una clase vacía que solamente contiene declaraciones de métodos. Se definen utilizando la palabra interface.

Por ejemplo, antes viste que podías crear nuevas clases heredadas de Producto, como TV o Ordenador. También viste que en las subclases podías redefinir el comportamiento del método muestra para que generara una salida en HTML diferente para cada tipo de producto.

Si quieres asegurarte de que todos los tipos de productos tengan un método muestra, puedes crear un interface como el siguiente.

interface iMuestra {
    public function muestra();
}

Y cuando crees las subclases deberás indicar con la palabra implements que tienen que implementar los métodos declarados en este interface.

class TV extends Producto implements iMuestra {
    . . .
    public function muestra() {
        echo "<p>" . $this->pulgadas . " pulgadas</p>";
    }
    . . .
}
Todos los métodos que se declaren en un interface deben ser públicos. Además de métodos, los interfaces podrán contener constantes pero no atributos.

Un interface es como un contrato que la clase debe cumplir. Al implementar todos los métodos declarados en el interface se asegura la interoperabilidad entre clases. Si sabes que una clase implementa un interface determinado, sabes qué nombre tienen sus métodos, qué parámetros les debes pasar y, probablemente, podrás averiguar fácilmente con qué objetivo han sido escritos.

Por ejemplo, en la librería de PHP está definido el interface "Countable".

Countable {
    abstract public int count ( void )
}

Si creas una clase para la cesta de la compra en la tienda web, podrías implementar este interface para contar los productos que figuran en la misma.

Antes aprendiste que en PHP una clase sólo puede heredar de otra, que no existe la herencia múltiple. Sin embargo, sí es posible crear clases que implementen varios interfaces, simplemente separando la lista de interfaces por comas después de la palabra "implements".

class TV extends Producto implements iMuestra, Countable {
    . . .
}

La única restricción es que los nombres de los métodos que se deban implementar en los distintos interfaces no coincidan. Es decir, en nuestro ejemplo, el interface iMuestra no podría contener un método count, pues éste ya está declarado en Countable.

Debes conocer

En PHP también se pueden crear nuevos interfaces heredando de otros ya existentes. Se hace de la misma forma que con las clases, utilizando la palabra "extends".