Clases Abstractas

La característica más importante de este tipo de clases es que no se pueden instanciar, es decir, no se puede crear un objeto de ese tipo de clase en memoria. ¿Entonces para que sirven? Se suelen utilizar en jerarquías complejas en las que todas las subclases deben incluir y reemplazar un método concreto, lo que también se puede hacer con una interfaz.

Utilizaremos la palabra reservada **abstract** delante del método que queramos redefinir en las subclases y delante de la definición de la clase, puesto que una clase con un método abstracto ya es abstracta. En los casos donde todos los métodos sean abstractos diremos que la clase es abstracta pura.

Un ejemplo sencillo

<?php
   abstract class A {
      abstract function operationX($param1, $param2);
      public function doble($n) {
         echo $n * $n . "<br>";
      }
   }
   class B extends A {
      public function operationX($param1, $param2) {
         echo $param1 + $param2 . "<br>";
      }
   }
   $b = new B();
   $b->operationX(2,3); //6
   A::doble(4); //16
   B::doble(5); //25
?>

**Ejemplo más complejo**

Tenemos una clase base **FiguraGeometrica** que tiene un atributo color y dos métodos **Dibuja()** y **Area()**, la cual esta última devuelve un valor doble. En la siguiente figura vemos un dibujo explicativo y su diseño UML.

Este es el código que implementa el diseño UML:

Dibujo explicativo más su diseño UML

<?php
   abstract class FiguraGeometrica {
      protected $color;
      public function __set($name, $value) {
         if( $name == 'Color' && is_string($value) === true )
            $this->color = $value;
      }
      abstract public function Dibuja();
      abstract public function Area();
   }
   class Cuadrado extends FiguraGeometrica {
      public function Dibuja() {
         echo 'Dib Cuadrado '.$this->color;
      }
      public function Area() {
         return 0;
      }
   }
   class Circulo extends FiguraGeometrica {
      public function Dibuja() {
         echo 'Dib Circulo '.$this->color;
      }
      public function Area() {
         return 0;
      }
   }
   class Triangulo extends FiguraGeometrica {
      public function Dibuja() {
         echo 'Dib Triang ' . $this->color;
      }
      public function Area() {
         return 0;
      }
   }
   $cuadrado = new Cuadrado();
   $cuadrado->Color = 'Negro'; // Estamos llamando al __set de FiguraGeometrica
   $cuadrado->Dibuja();
   // ERROR FATAL, no se puede instanciar una clase abstracta
   $prueba = new FiguraGeometrica;
?>

Cuando creamos una clase que hereda de FiguraGeometrica, nos obliga "por contrato" a implementar los métodos de la clase base (en caso contrario se produciría un error fatal).

Como vemos, una de las principales diferencias respecto a los interfaces es que podremos definir métodos con cuerpo, que podrán ser llamados desde las subclases.

results matching ""

    No results matching ""