martes, 20 de agosto de 2013

PHP orientado a objetos - Clases y métodos Final

Gracias a la herencia, los métodos definidos en una clase base estarán disponibles en las clases que hereden de esta. Siempre y cuando tengan una visibilidad permisiva. O lo que es lo mismo, que su visibilidad no sea privada. Sin embargo hay ocasiones en las que queramos que las clases hijas puedan utilizar los métodos heredados pero no puedan modificarlos o 'sobreescribirlos'. Para ello antepondremos la palabra reservada final a la definición del método en la clase base (la que va a ser heredada). Se antepondrá a otros modificadores.

 class Usuario{  
   protected $nombre;  
   function getNombre(){  
     return $this->nombre;  
   }  
   final function setNombre($name){  
     $this->nombre = $name;  
   }  
 }  
 class Editor extends Usuario{  
   function setNombre($name){  
     echo "intento de modificar método padre";  
   }  
 }  

Si ejecutamos esto obtendremos el siguiente error: Fatal error: Cannot override final method Usuario::setNombre() in ... Con lo que protegemos al método setNombre() de que sea modificado por una clase heredera.

Pero no solo se puede utilizar la palabra final en los métodos de una clase. También se puede utilizar en la definición de una clase.

 final class Prueba{  
 }  

Si la utilizamos en la definición de una clase, esta clase no podrá ser heredada.

 final class Usuario{  
   protected $nombre;  
   function getNombre(){  
     return $this->nombre;  
   }  
   function setNombre($name){  
     $this->nombre = $name;  
   }  
 }  
 class Editor extends Usuario{  
   function setNombre($name){  
     echo "intento de modificar método padre";  
   }  
 }  

Este sería el resultado de intentar heredar de una clase final: Fatal error: Class Editor may not inherit from final class (Usuario) in...

Hay que tener cuidado con el uso de la palabra final, ya que estamos limitando el uso de la herencia y la programación orientada a objetos. Pero en ocasiones puede resultar útil.

Para terminar, es importante conocer que la palabra reservada final solo puede usarse en métodos y definiciones de clases. En caso contrario obtendríamos un error.


Entradas relacionadas

PHP orientado a objetos - Introducción

No hay comentarios:

Publicar un comentario