JavaDabbaDoo.org -Tu comunidad Java parlante Fundamentos
Inicio | Cursos infosintesis.net liberados | JavaSE | Iniciación a la Orientación a Objetos paso a paso
Creación de un Televisor estándar
Paso 12: Operativa

Debido a la facilidad de uso, fiabilidad y calidad de nuestro televisor estándar, hemos conseguido que una empresa que se dedica a la fabricación de televisores se interese por el televisor estándar y se lo hemos vendido como base para sus modelos de televisores.

Este fabricante de televisores está creando un nuevo modelo de televisor con pantalla de plasma

El TelevisorPlasma pertenece al paquete paqtvfabricante tal y como podemos ver en el siguiente Diagrama de Clases de diseño

Viendo el potencial de clientes que podemos tener con un perfil de fabricantes de televisores, y que se van a crear ellos mismos diferentes modelos de televisores con diferentes tecnologías para mostrar imágenes en sus pantallas (Plasma, TFT, Cristal líquido, etc...), queremos que los desarrolladores de dichos fabricantes tengan los mismos accesos a las partes internas del televisor que nosotros tuvimos cuando lo creamos.

Tal y como hemos diseñado la Clase Televisor de momento esto no es posible. Veamos que es lo que sucede si la Clase TelevisorPlasma quiere acceder al método privado subirColorAyuda() perteneciente al paquete paqtvestandar y además se crea una nuevo método para su televisor de plasma llamado subirColorAyuda2(). De la misma forma también se querrá bajar la intensidad del color del televisor

Nos vamos a crear un paquete llamado paqtvfabricante y una Clase llamada TelevisorPlasma.

Este es el código correspondiente a la Clase TelevisorPlasma

package paqtvfabricante;
import paqtvestandar.Televisor;

public class TelevisorPlasma extends Televisor {

 public void subirColor(){
  System.out.println("TelevisorPlasma - subirColor(): estoy subiendo el color");
  
// subirColorAyuda();
  subirColorAyuda2();
 }

 private void
subirColorAyuda2() {
  System.out.println("TelevisorPlasma - subirColorAyuda2(): sigo subiendo el color");
 }

 public void bajarColor(){
  System.out.println("TelevisorPlasma - bajarColor(): estoy bajando el color");
  bajarColorAyuda2();
 }

 private void
bajarColorAyuda2() {
  System.out.println("TelevisorPlasma - bajarColorAyuda2(): sigo bajando el color");
 }

 public void usarMenu(){
  System.out.println("TelevisorPlasma - usarMenu(): utilizo el menu");
 }
}

Ahora vamos a descomentar la invocación al método subirColorAyuda(). Debido a que este método tiene el ámbito o acceso privado en la Superclase Televisor, desde la Clase hija no podemos acceder. Este es el mensaje del error:

dsf

Y esta es la Clase Aplicacion perteneciente al paquete paqtvfabricante

package paqtvfabricante;

public class Aplicacion {

 public static void main(String[] args) {
  TelevisorPlasma tv = new TelevisorPlasma();
   tv.setCanal(3);
   System.out.println("El canal seleccionado es el: " + tv.getCanal());
   tv.subirColor();
   tv.usarMenu();
   // tv.subirColorAyuda();
 }
}

El modificador protected

Ahora modificamos la Clase Televisor para que otras Clases hijas que pertenezcan tanto al mismo paquete como a otros paquetes puedan tener visibilidad de los métodos subirColorAyuda() y bajarColorAyuda()

Esta es la Clase Televisor modificada

package paqtvestandar;

public abstract class Televisor {
 private int canal;
 private int volumen = 5;

 public Televisor() {}
  
 public Televisor(int canal) {
 
 setCanal(canal);
 
 

 public void subirCanal() {
  setCanal(canal + 1);
 }

 public void bajarCanal() {
  setCanal(canal - 1);
 }

 public int getCanal() {
  return canal;
 }

 public void setCanal(int canal) {
  if (canal < 0){
   this.canal = 0;
  }
  else {
   this.canal = canal;
  }
 }

 public void subirColor(){
  System.out.println("Televisor - subirColor(): estoy subiendo el color");
  subirColorAyuda();
 }

 protected void subirColorAyuda() {
  System.out.println("Televisor - subirColorAyuda(): sigo subiendo el color");
 }

 public void bajarColor(){
  System.out.println("Televisor - subirColor(): estoy bajando el color");
  bajarColorAyuda();
 }

 protected void bajarColorAyuda() {
  System.out.println("Televisor - bajarColorAyuda(): sigo bajando el color");
 }

 public void subirVolumen() {
  volumen = volumen + 1;
 }

 public void bajarVolumen() {
  volumen = volumen - 1;
 }

 public int getVolumen() {
  return volumen;
 }

 public abstract void usarMenu();
}

Compilamos la Clase Televisor y descomentamos la invocación al método subirColorAyuda() desde la Clase TelevisorPlasma

 

Demostración de que en Java se puede tener visibilidad de un miembro protected desde cualquier otra Clase que pertenezca al mismo paquete

Para ver que podemos acceder al método subirColorAyuda() de la Clase Televisor desde la Clase Aplicacion del paquete paqtvestandar vamos a añadir la siguiente línea de código a la Clase Aplicacion del paquete paqtvestandar

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);
    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.usarMenu();
    tv.subirColorAyuda();
  }
}

 

Demostración de que en Java NO se puede tener visibilidad de un miembro protected desde cualquier otra Clase que pertenezca a OTRO paquete

Recordemos que este es el código de la Clase Aplicacion del paquete paqtvfabricante

package paqtvfabricante;

public class Aplicacion {

 public Aplicacion() {
 }

 public static void main(String[] args) {
  TelevisorPlasma tv = new TelevisorPlasma();
   tv.setCanal(3);
   System.out.println("El canal seleccionado es el: " + tv.getCanal());
   tv.subirColor();
   tv.usarMenu();
   // tv.subirColorAyuda();
 }
}

Ahora lo ejecutamos y obtenemos el siguiente resultado

Sin embargo si descomentamos la invocación al método subirColorAyuda() desde la Clase Aplicacion vemos que el compilador se sigue quejando

NetBeans 6 - Error: subirColorAyuda() has protected access in paqtvestandar.Televisor

Siguiendo el ejemplo del concesionario de coches que nos permitían probar un coche. Podemos decir que si utlizamos el coche como usurios normales no tenemos acceso a los mecanismos encapsulados que hay debajo del capó

La siguiente tabla nos será de gran ayuda cuando queramos despejar cualquier duda sobre los controles de acceso o ámbito

control de acceso o ámbito
public
private
friendly
protected
mismo paquete
misma Clase
otra Clase
una Subclase



no
no




otro paquete
otra Clase
una Subclase

no
no
no
no
no

Página anterior
Ignasi Pérez Valls
fundador-director Infosintesis Solutions Group
asesor-formador independiente
ignasiperez[ARROBA]javadabbadoo[PUNTO]org
Diciembre 2008
JavaDabbaDoo.org
Tu comunidad Java parlante. Cursos abiertos, tutoriales y mucho mucho más ...