| Creación de un Televisor estándar |
| Paso 8: Operativa |
Herencia a través de las relaciones de Generalización
Después de mucho trabajo y esfuerzo hemos conseguido crear un televisor estándar con una funcionalidad suficiente para poder ser utilizado.
A partir de este televisor estándar, vamos a crear un nuevo televisor que tendrá una funcionalidad añadida
- para ponerlo en práctica, nos vamos a crear un televisor que lo llamaremos TelevisorVirtual y que nos va a permitir desconectar el sonido en caso de que por ejemplo recibiéramos una llamada telefónica y no quisiéramos bajar el volumen paulatinamente,
- es decir invocando al método bajarVolumen() n veces seguidas
Este es su Diagrama de Clases de Diseño correspondiente
- este tipo de flecha en UML representa una relación de Generalización
- este tipo de relación
- nos indica que la Clase hija, en este caso TelevisorVirtual, hereda todos los atributos y métodos de la Clase padre, en este caso Televisor
- es muy conveniente cuando queremos crear una Clase muy afin a otra u otras Clases , pero que no se ajusta cien por cien a nuestras necesidades
- entonces lo que hacemos es implementar los nuevos métodos de nuestra Clase y nos ahorramos el tener que escribir o copiar-y-pegar código que ya ha sido escrito anteriormente. Este código que reutilizamos puede ya haber sido escrito
- por nosotros mismos,
- por otra persona de nuestro departamento o de nuestra empresa
- o por cualquier otra persona u organización que no pertenezca a nuestra empresa
- gracias a la herencia,
se puede crear una Clase general que define características comunes a un conjunto de elementos relacionados.
Esta Clase puede ser heredada por otras Clases más específicas, añadiendo a cada una de estas Clases específicas aquellas cosas que son particulares a ellas
- la Clase general recibe el nombre de Superclase o Clase padre
- a las Clases más específicas se les llama Subclases o Clases hijas
- una Subclase puede ser a su vez una Superclase de una Subclase y así sucesivamente
Ahora vamos a crear una nueva Clase llamada TelevisorVirtual que va a heredar de la Clase Televisor
Este es el código de la Clase TelevisorVirtual
package paqtvestandar;
public class TelevisorVirtual extends Televisor {
private boolean sonido = true;
public void setSonido(boolean valorSonido){
sonido = valorSonido;
}
public boolean isSonido(){
return sonido;
}
}
|
- public class TelevisorVirtual extends Televisor {
- en Java, cuando una Clase hereda de otra se indica con la palabra reservada extends
- private boolean sonido = true;
- declaramos una variable booleana y hacemos que tome el valor verdadero cuando se cree una instancia de la Clase
- public void setSonido(boolean valorSonido){
- si algún televidente decide ver las imágenes pero no escuchar el televisor, entonce lo que tiene que hacer es
- invocar este método con la variable valorSonido con valor falso
- public boolean isSonido(){
- de la misma forma que existe la convención de utilizar los getters y setters para acceder a las variables de instancia, también es muy habiutual utilizar el prefijo is para saber el estado de una variable de instancia booleana
Compilamos la Clase TelevisorVirtual.
Para que la Clase Aplicacion pueda interactuar con la Clase TelevisorVirtual, vamos a tener que realizar bastantes cambios en la Clase Aplicacion.
- para que podamos mantener el código de lo que hemos estado haciendo hasta ahora, vamos a realizar una copia de las Clases Aplicacion y Televisor
- el IDE NetBeans a la copia de estas Clases las llamará Aplicacion_1 y Televisor_1.
- nosotros seguiremos trabajando sobre las Clases Aplicacion y Televisor y dejaremos las Clases copiadas como clases históricas para poderlas repasar en el futuro siempre que queramos
Ahora vamos a hacer que la Clase Aplicacion_1 interactúe con la Clase Televisor_1.
package paqtvestandar;
public class Aplicacion_1 {
public static void main(String[] args) {
Televisor_1 tv;
tv = new Televisor_1();
System.out.println("El canal por defecto es el: " + tv.getCanal());
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirCanal();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.bajarCanal();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
Televisor_1 televisor = new Televisor_1(-5);
System.out.println("El canal del segundo televisor es el: " + televisor.getCanal());
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
// tv.subirColorAyuda();
}
} |
Modificación por completo de la Clase Aplicacion
Este es el nuevo código que sustituye al código anterior de Clase Aplicacion
package paqtvestandar;
public class 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 televisor tiene el sonido: " + tv.isSonido());
}
} |
- TelevisorVirtual tv = new TelevisorVirtual();
- con el operador new creamos una instancia de la Clase TelevisorVirtual
- tv.setCanal(3);
- si nos fijamos, la Clase TelevisorVirtual no contiene el método setCanal(int valorCanal), pero sí que lo tiene su Clase padre Televisor
- como TelevisorVirtual hereda de Televisor, la variable de referencia tv puede invocar tanto a métodos propios de la Clase TelevisorVirtual como a métodos propios de la Clase Televisor
- tv.setSonido(false);
- System.out.println("El telvisor tiene el sonido: " + tv.isSonido());
- verificamos que el sonido está desactivado
Al ejecutar la Clase Aplicacion vemos los siguientes mensajes