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)