Diferencia entre Clases Abstractas e Interfaces (PHP)

Como siempre hay amigos, familia, amigos de la familia, entusiastas del SL y de la Programación que encuentran mi correo por internet o me conocen por referencia y aprovechan la oportunidad para hacerme preguntas sobre temas diversos, en esta oportunidad 3 personas diferentes que estan comenzando a programar en PHP y estan estudiando el paradigma de la Programación Orientada a Objetos se han estado confundiendo mucho con las definiciones de Clases Abastractas e Interfaces proporcionadas en la documentación oficial de php.net y esta publicación es un intento para diluir esas dudas adicionalmente aprovecho esta oportunidad para disculparme con ellos pues prometí escalercer las dudas antes, pero esta semana los problemas terrenales me alcanzaron y tuve que lidiar con las diligencias/molestias/atenciones que conlleva una operación de emergencia, dando gracias porque todo salio bien y no hubo inconvenientes mayores.

¿Qué son las Clases Abstractas?

Las clases abstractas son clases normales con super poderes capacidades especiales, dado a que sus propiedades y metodos que pueden ser implementados o no dependiendo a las reglas del juego, pero, como sucede esto?, no hay mejor manera de explicarlo que con un ejemplo extraido de la documentación de php.net


class Fruta {
private $color;

public function comer() {
//Masticar
}

public function setColor($c) {
$this->color = $c;
}
}

class Manzana extends Fruta {
public function comer() {
//Masticar hasta llegar al Centro
}
}

class Naranja extends Fruta {
public function comer() {
//Pelar la Naranja
//Masticar
}
}

Instanciamos la clase, es decir, te doy una manzana y tu te la comes.


$manzana = new Manzana();
$manzana->comer();

Al finalizar el metodo “comer()”, podrías decir a que te supo la fruta, la respuesta sería a Manzana pues fue lo que te di y si te diera una fruta de manera generica…


$fruta = new Fruta();
$fruta->comer();

A que te supo la fruta?, no tiene mucho sentido ya que no deberias haber podido comerte la fruta pues no deberia funcionar de esa manera, en algun punto deberia de existir una restricción en la implementación de metodos y propiedades, por eso es que deberia declarar la Clase Fruta como abstracta y a su vez el metodo “comer()” que esta contiene.

Ejemplo:


abstract class Fruta {
private $color;

abstract public function comer()

public function setColor($c) {
$this->color = $c;
}
}

¿Que son las Interfaces?

Pensemos en las interfaces como declaraciones de metodos que objetos en comun pueden compartir, inclusive si esos objetos no guardan relación ninguna. Digamos que tenemos una serie de objetos que mediante la herencia no pueden conectarse o no pueden heredar metodos de un objeto padre ya que no tendria sentido, aqui es donde la interfaz juega un papel muy importante, por supuesto no hay mejor manera de explicar esto que con un ejemplo:


interface interaccion {
public function encender() {
//Procedimiento para encender
}

public function apagar() {
//Procedimiento para apagar
}
}

class lampara implements interaccion {
//Heredada de la Interfaz
public function encender() {
}
//Heredada de la Interfaz
public function apagar() {
}
}

class automobil implements interaccion {
//Heredada de la Interfaz
public function encender() {
}
//Heredada de la Interfaz
public function apagar() {
}
}

Espero que los ejemplos hallan sido suficientes para lograr su comprensión sobre el tema y en palabras finales podemos resumir que la diferencia entre las clases abstractas y las interfaces es que cada una se utiliza para disgregar y discernir limites en la estructura de la aplicacion que se quiere construir usando el paradigma de “Programación Orientada a Objeos”. Las interfaces nos permiten compartir comportamientos entre objetos no relacionados mientras que las clases abstractas nos permiten limitar y/o definir con precisión las capacidades de cada objeto.

Anuncios

5 comentarios en “Diferencia entre Clases Abstractas e Interfaces (PHP)

  1. Excelente explicacion, casulidad hoy estaba repasando el tema y con este post me ayudo a entender mas. Tenia mis dudas de cuando usar interfaces, pero la frase de que no tiene sentido heredarlos me hizo entenderlo todo

  2. Al principio no entendia, ni tus ejemplos. Pero ahora si entendi, gracias brother.

  3. Existe un error cuando se habla de interfaces. Los métodos de las mismas no pueden declararse (aún sin contenido) mediante el uso de llaves “{ }”.

  4. lastima que dejaste el ejemplo de la abstraccion a mitad… porque yo sigo estancado en las clases y metodos abstractos, no entiendo muy bien su uso, cuando y porque usarlo.

Los comentarios están cerrados.