| Creación de un Televisor estándar |
| Paso 9: Operativa |
Polimorfismo a través de la sobreescritura de método
Cuando al nuevo televisor virtual le desconectamos el sonido, éste se queda en silencio.
Para volver a conectar el sonido simplemente tenemos que invocar al método setSonido(true)
- pero ganaríamos en flexibilidad si diéramos al televidente la posibilidad de conectar el sonido de forma automática si éste decidiera invocar los métodos subirVolumen() o bajarVolumen()
- pero estos métodos ya están implementados en la Clase Televisor. Entonces ¿Qué podemos hacer?
Este es el Diagrama de Clases de Diseño actualizado para esta nueva situación
- +subirVolumen():void
- la segunda forma de implementar el Polimorfismo es a través de la sobreescritura de método. (La primera forma de implementarlo la vimos en la Operativa del Paso 3 a través de la sobrecarga de método)
- la sobreescritura de método consiste en volver a implementar en la Subclase uno o más métodos que ya están implementados en la Superclase
- esta técnica nos es extremadamente útil cuando queremos heredar de una Superclase pero la operativa de uno o más métodos heredados de dicha Superclase no se ajusta a la operativa que nosotros queremos aplicar a la nueva Subclase
Este es el código ampliado de la Clase TelevisorVirtual
|
package paqtvestandar;
public class TelevisorVirtual extends Televisor {
private boolean sonido = true;
public TelevisorVirtual() {
}
public void setSonido(boolean valorSonido){
sonido = valorSonido;
}
public boolean isSonido(){
return sonido;
}
public void subirVolumen() {
super.subirVolumen();
if (this.isSonido() == false){
setSonido(true);
}
}
public void bajarVolumen() {
super.bajarVolumen();
if (!isSonido()){
setSonido(true);
}
}
} |
- public void subirVolumen() {
- en este caso la sobreescritura de método es posible porque la signatura de método del método subirVolumen() de la Subclase coincide con la signatura de método del método subirVolumen()de la Superclase
- para que dos métodos tengan la misma signatura, éstos tienen que tener
- el mismo nombre de método
- el mismo número de argumentos
- y que estos argumentos coincidan con el mismo tipo de datos
- dentro de este método tenemos que escribir nuestro nuevo código
- super.subirVolumen();
- la palabra clave super, se utiliza para indicar que queremos invocar a un método que se encuentra en la Superclase y así poder distinguirlo del mismo método que se en encuentra en la Subclase.
- en nuestro caso, la funcionalidad de bajarVolumen() de la Superclase Televisor se ajusta a nuestras necesidades y por tanto no la volvemos a escribir. De esta forma
- nos ahorramos tener que volver a escribir o cortar-y-pegar el mismo código
- y sobre todo evitamos tener el mismo código diseminado por toda la aplicación, y con el consiguiente engorro y el riesgo de error de tener que
actualizarlo
en "800" sitios si se tuviera que modificar dicho código
- if (this.isSonido() == false){
- la palabra clave this, se utiliza para indicar que queremos invocar a un método que se encuentra en la propia Clase.
- en nuestro caso, invocamos al método this.isSonido() para saber si el sonido está conectado o desconectado
- if (!isSonido()){
- la ausencia de la palabra clave this, también se utiliza para indicar que queremos invocar a un método que se encuentra en la propia Clase.
- si el código lo genera un Asistente o Wizard del entorno de desarrollo, éste lo que acostumbra hacer al escribir código por nosotros es poner de forma explicita la palabra clave this.
- si el código lo escribimos nosotros, lo habitual es no utilizar la palabra clave this, por que sin ella ya se
sobreentiende
que estamos invocando a métodos de nuestra propia Clase
- (!isSonido())es equivalente a (isSonido() == false)
- setSonido(true);
Después de haber añadido el nuevo código compilamos la Clase TelevisorVirtual.
Y este es el código de la Clase Aplicacion que interactúa con una instancia de tipo TelevisorVirtual
package paqtvestandar;
public class Aplicacion {
public Aplicacion() {
}
public static void main(String[] args) {
TelevisorVirtual tv = new TelevisorVirtual();
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
tv.setSonido(false); // Desactivamos el sonido
System.out.println("El telvisor tiene el sonido: " + tv.isSonido());
tv.subirVolumen();
System.out.println("La posición del volumen es: " + tv.getVolumen());
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
}
} |
- tv.subirVolumen();
- desde la Clase Aplicacion nos es totalmente transparente el hecho de que ahora el método subirVolumen() esté sobrescrito en la Clase TelevisorVirtual, desde aquí no percibimos ninguna diferencia
- System.out.println("El televisor tiene el sonido: " + tv.isSonido());
- comprobamos que el sonido se ha activado sin que se lo hayamos indicado de forma explícita con el método setSonido(true)
Al ejecutar la Clase Aplicacion vemos como el sonido se ha activado por el hecho de haber subido el volumen