Programación orientada a objetos con PHP (VIII), abstracción

abstraccion en programacion orientada a objetos

 

Programación orientada a objetos con PHP. Clases y métodos abstractos

Usamos clases abstractas cuando queremos comprometer al programador (ya sea uno mismo o alguien más) para escribir un cierto método de clase, pero solo estamos seguros del nombre del método y no de los detalles de cómo debería escribirse.

Por poner un ejemplo, los círculos, rectángulos, octágonos, etc. pueden parecer diferentes, pero todas son formas 2D y, por lo tanto, todas poseen los rasgos de área y circunferencia.

Por lo tanto, tiene mucho sentido agrupar el código que tienen en común en una clase principal.

En esta clase principal, tendríamos las dos propiedades de área y circunferencia, e incluso podríamos considerar agregar un método que calcule el área (lo que podría ser problemático ya que diferentes formas requieren diferentes cálculos).

En este tipo de casos, cuando necesitamos comprometer las clases secundarias a ciertos métodos que heredan de la clase primaria pero no podemos confirmar el código que debería usarse en los métodos, usamos clases abstractas.

Utilizamos clases y métodos abstractos cuando necesitamos comprometer las clases secundarias a ciertos métodos que heredan de la clase principal, pero no podemos comprometernos sobre el código que debe escribirse dentro de los métodos.

Una clase abstracta es una clase que tiene al menos un método abstracto .

Los métodos abstractos solo pueden tener nombres y argumentos, y ningún otro código. Por lo tanto, no podemos crear objetos a partir de clases abstractas. En cambio, necesitamos crear clases secundarias que agreguen el código a los cuerpos de los métodos, y usar estas clases secundarias para crear objetos.

 

¿Cómo declarar clases y métodos como abstractos?

Para declarar una clase como abstracta, necesitamos anteponer el nombre de la clase con la palabra clave abstract.

Vea el siguiente ejemplo:

abstract class Car { }

Ponemos los métodos abstractos que también se declaran con la palabra clave abstract dentro de la clase abstract. Los métodos abstractos dentro de una clase abstracta no tienen un cuerpo, solo un nombre y parámetros dentro de paréntesis.

En el ejemplo que se proporciona a continuación, creamos un método abstracto público, calcNumMilesOnFullTank () , que es el esqueleto de los métodos que crearemos en las clases secundarias. Una vez creados, estos métodos devolverán la cantidad de millas que un automóvil puede conducir con un tanque de gasolina.

 

// Abstract classes are declared with the abstract keyword, and contain abstract methods.
abstract class Car {
  abstract public function calcNumMilesOnFullTank();
}

Es importante saber que una vez que tenemos un método abstracto en una clase, la clase también debe ser abstracta.

 

¿Podemos tener métodos no abstractos dentro de una clase abstracta?

Una clase abstracta puede tener métodos no abstractos. De hecho, incluso puede tener propiedades, y las propiedades no pueden ser abstractas.

Agreguemos a nuestro ejemplo la propiedad protegida, $ tankVolume y el método público con el nombre de setTankVolume () .

abstract class Car {
  // Abstract classes can have properties
  protected $tankVolume;
 
  // Abstract classes can have non abstract methods
  public function setTankVolume($volume)
  {
    $this -> tankVolume = $volume;
  }
 
  // Abstract method
  abstract public function calcNumMilesOnFullTank();
}

¿Cómo crear clases secundarias a partir de una clase abstracta?

Como no podemos crear objetos a partir de clases abstractas, necesitamos crear clases secundarias que hereden el código de clase abstracta. Las clases secundarias de clases abstractas se forman con la ayuda de la palabra clave extend , como cualquier otra clase secundaria. Son diferentes en el sentido de que tienen que agregar los cuerpos a los métodos abstractos.

Las clases secundarias que heredan de clases abstractas deben agregar cuerpos a los métodos abstractos.

Creemos una clase secundaria con el nombre de Honda , y definamos en ella el método abstracto que heredó del padre, calcNumMilesOnFullTank () .

class Honda extends Car {
  // Since we inherited abstract method, we need to define it in the child class, 
  // by adding code to the method's body.
  public function calcNumMilesOnFullTank()
  {
    $miles = $this -> tankVolume*30;
    return $miles;
  }
}

Podemos crear otra clase secundaria a partir de la clase abstracta Car y llamarla Toyota , y aquí nuevamente definimos el método abstracto calcNumMilesOnFullTank () con un ligero cambio en el cálculo. También agregaremos a la clase secundaria su propio método con el nombre de getColor () que devuelve la cadena «beige» .

class Toyota extends Car {
  // Since we inherited abstract method, we need to define it in the child class, 
  // by adding code to the method's body.
  public function calcNumMilesOnFullTank()
  {
    return $miles = $this -> tankVolume*33;
  }
 
  public function getColor()
  {
    return "beige";
  }
}

Creemos un nuevo objeto, $toyota1 , con un volumen de 10 galones, y dejemos que devuelva el número de millas en el tanque lleno y el color del automóvil.

$toyota1 = new Toyota();
$toyota1 -> setTankVolume(10);
echo $toyota1 -> calcNumMilesOnFullTank();//330
echo $toyota1 -> getColor();//beige

Conclusión

En este tutorial, tuvimos nuestro primer encuentro con el concepto de abstracción, que nos permite comprometer las clases secundarias a los nombres de los métodos y no a los cuerpos de los métodos.

Compartir esta entrada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

CAPTCHA ImageChange Image