Programación orientada a objetos en PHP 5: Herencia II

En la entrega anterior dejamos algunos temas en el tintero. Entre ellos estaba cómo funcionan las propiedades public, private y protected cuando hay clases heredadas de por medio. También quedó pendiente el overriding. En la entrega de hoy voy a hablar de ambos.

Herencia y public, private y protected

Ya comenté que a las propiedades y métodos public se puede acceder desde fuera de la clase y a las private solo se puede acceder desde dentro de la clase.

Vamos a recuperar el código de la clase noticia:

y de la clase NoticiaFutbol:

Supongamos que en la clase NoticaFutbol necesitamos una función que, usando el título, los equipos participantes y el resultado, cree un título completo. Algo así “Gran partidazo – Algarrobo FC / RC Vesarrubia (1-0)”

A esta función vamos a llamarla generarTituloCompleto y va a ir dentro de la clase NoticiaFutbol:

Esta función la usaríamos así:

Y el resultado sería:

Todo ha ido a la perfección porque los métodos son públicos. Pero ¿qué hubiera pasado si la función getTitulo hubiese sido privada?

El resultado ahora sería un error:

Vaya, parece que no podemos acceder a él desde la clase hijo. Claro, a una propiedad o método private solo se puede acceder desde la clase que la definió. Entonces ¿qué hacemos?

¿Recuerdas que comenté algo sobre propiedades y métodos protected? Pues son precisamente para esto. A los miembros protected solo se puede acceder desde la clase donde están definidas o desde las clases heredadas.

Si cambiamos el método a protected:

Como puedes comprobar getTitulo es accesible desde la clase hijo pero sigue siendo inaccesible desde el “exterior”. Prueba a llamarla directamente desde el objeto:

verás este error:

Resumen

A las propiedades y métodos public de una clase se puede acceder desde la propia clase, desde clases heredadas y desde el “exterior”.

A las que son private solo se puede acceder desde esa propia clase.

Y si son protected podemos acceder solo desde la propia clase y desde las clases heredadas.

Overriding

Ahora imagina que quien ha solicitado el desarrollo de la aplicación te dice que la función getTitulo debería devolver siempre un título compuesto y no solo el título de la noticia (al estilo de lo que hace la función generarTituloCompleto).

En la clase padre definimos una función getTitulo genérica que devuelve solo el título. Esto tiene que ser así porque la clase padre no sabe cómo va a ser la clase hija (vamos, igual que sucede en la realidad entre padres e hijos).

Luego, en cada subclase volvemos a definir la función getTitulo:

Esto que hemos hecho se llama, en inglés, override.

Un detalle importante, para poder acceder a la propiedad título de la clase Noticia tendríamos que redefinirla como protected:

Así que, cuando llamamos a un método se le busca primero en la clase hijo. Si no existe se busca en la clase padre. Si el método no existe ni en la clase padre ni en la subclase se produce un error.

Para verlo vamos a recuperar el código de la clase NoticiaCiclismo:

Y usamos esta clase así:

Aquí el resultado sería:

La clase NoticiaCiclismo no tiene un método llamado getTitulo así que se usa el de la clase padre.

Próxima entrega

En el próximo artículo hablaré sobre las clases abstractas, que es un tema que suele confundir mucho a la gente.

Leave a Comment