16 - Métodos abstractos.


Vimos en conceptos anteriores que podemos definir clases abstractas que tienen por objetivo agrupar atributos y métodos comunes a un conjunto de subclases.

Si queremos que las subclases implementen comportamientos obligatoriamente podemos definir métodos abstractos.

Un método abstracto se declara en una clase pero no se lo implementa.

En nuestra clase Operacion tiene sentido declarar un método abstracto: operar. Esto hará que todas las clases que hereden de la clase Operación deban implementar el método operar.

Veamos la sintaxis para declarar un método abstracto con el problema de las clases Operacion, Suma y Resta.

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
abstract class Operacion {
  protected $valor1;
  protected $valor2;
  protected $resultado;
  public function cargar1($v)
  {
    $this->valor1=$v;
  }
  public function cargar2($v)
  {
    $this->valor2=$v;
  }
  public function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
  public abstract function operar();
}

class Suma extends Operacion{
  public function operar()
  {
    $this->resultado=$this->valor1+$this->valor2;
  }
}

class Resta extends Operacion{
  public function operar()
  {
    $this->resultado=$this->valor1-$this->valor2;
  }
}

$suma=new Suma();
$suma->cargar1(10);
$suma->cargar2(10);
$suma->operar();
echo 'El resultado de la suma de 10+10 es:';
$suma->imprimirResultado();

$resta=new Resta();
$resta->cargar1(10);
$resta->cargar2(5);
$resta->operar();
echo 'El resultado de la diferencia de 10-5 es:';
$resta->imprimirResultado();
?>
</body>
</html>

Dentro de la clase Operacion declaramos un método pero no lo implementamos:

  public abstract function operar();

Con esto logramos que todas las subclases de la clase Operacion deben implementar el método operar():

class Suma extends Operacion{
  public function operar()
  {
    $this->resultado=$this->valor1+$this->valor2;
  }
}

Si una subclase no lo implementa se produce un error (supongamos que la subclase Suma se nos olvida implementar el método operar):

Fatal error: Class Suma contains 1 abstract method and must therefore be declared abstract or
 implement the remaining methods (Operacion::operar)

Solo se pueden declarar métodos abstractos dentro de una clase abstracta. Un método abstracto no puede ser definido con el modificador private (esto es obvio ya que no lo podría implementar la subclase)

Retornar