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)