17 - Métodos y clases final.


Si a un método le agregamos el modificador final significa que ninguna subclase puede sobreescribirlo. Este mismo modificador se lo puede aplicar a una clase, con esto estaríamos indicando que dicha clase no se puede heredar.

Confeccionaremos nuevamente las clases Operacion y Suma utilizando este modificador. Definiremos un método final en la clase Operacion y la subclase la definiremos de tipo final.

pagina1.php

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Operacion {
  protected $valor1;
  protected $valor2;
  protected $resultado;
  public function __construct($v1,$v2)
  {
    $this->valor1=$v1;
    $this->valor2=$v2;
  }
  public final function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
}

final class Suma extends Operacion{
  private $titulo;
  public function __construct($v1,$v2,$tit)
  {
    Operacion::__construct($v1,$v2);
    $this->titulo=$tit;
  }
  public function operar()
  {
    echo $this->titulo;
    echo $this->valor1.'+'.$this->valor2.' es ';
    $this->resultado=$this->valor1+$this->valor2;
  }
}

$suma=new Suma(10,10,'Suma de valores:');
$suma->operar();
$suma->imprimirResultado();
?>
</body>
</html> 

Podemos ver que la sintaxis para definir un método final es:

class Operacion {
...
  public final function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
}

Luego si una subclase intenta redefinir dicho método:

class Suma extends Operacion {
...
  public function imprimirResultado()
  {
    ...
  }
}

Se produce el siguiente error:

Fatal error: Cannot override final method Operacion::imprimirResultado()

El mismo concepto se aplica cuando queremos que una clase quede sellado y no dejar crear subclases a partir de ella:

final class Suma extends Operacion{
...
}

Agregando el modificador final previo a la declaración de la clase estamos indicando que dicha clase no se podrá heredar.

Luego si planteamos una clase que herede de la clase Suma:

class SumaTresValores extends Suma {
...
}

Produce el siguiente error:

Fatal error: Class SumaValores may not inherit from final class (Suma)

Retornar