Conviértete en un emprendedor,profesional del conocimiento en la programación

sábado, 7 de enero de 2012

HERENCIA

Compartir con:


HERENCIA


Jerarquía de Clases, extends, super


La Herencia es una de las características más importantes y beneficiosas para el enfoque de programación orientado a objetos. En resumen se trata de “utilizar lo que ya está hecho” para agregarle y/o cambiarle funcionalidad, nunca quitarle. Esto en la vida real tiene mucho sentido. Por ejemplo, Existiendo el televisor en blanco y negro (clase Padre) fabricaron el televisor a color (clase Hija) aprovechando todo lo bueno del televisor en blanco y negro ya implementado como cambio de canales, administración del volumen, mecanismo de encendido/apagado. Al televisor a color le agregaron más funcionalidad como: soportar audio, video, cable. Otro ejemplo: Existiendo el televisor a color (clase Padre) fabricaron el televisor digital (clase Hija) al que le cambiaron y agregaron funcionalidad para el soporte de la tecnología digital.

En programación sucede lo mismo, por ejemplo: Existiendo una clase Fecha (clase Padre) cuya funcionalidad soporta un formato de presentación DD/MM/AA , se puede construir una nueva clase FechaM (clase Hija) cuya funcionalidad soporte más formatos de presentación como DD/NOMBRE DEL MES/AAAA, AA/MM/DD, etc.

A la clase ya existente se le conoce como clase Padre ó clase Base ó clase Ascendiente o Super clase. En cambio a la nueva clase que hereda se le conoce como clase Hija ó clase Derivada ó clase Descendiente o Subclase.

Cuando uno va a desarrollar por primera vez una clase y piensa que con el tiempo se podría utilizar como clase Padre, entonces el nivel de acceso a sus atributos deja de ser prívate y se debe considerar como protected ya que sigue permitiendo el encapsulamiento pero además dispone su acceso directo de todas sus clases descendientes. En cambio, cuando la clase que se va a heredar ya existe con un nivel de acceso prívate para sus atributos, entonces la clase hija tiene que utilizar la funcionalidad pública de acceso a sus atributos.

La palabra reservada que implementa la herencia es extends.

Si la clase Padre no tiene un constructor explícito, entonces la clase Hija no está obligada a tenerlo. Sin embargo, cuando la clase Padre sí tiene un constructor explícito, entonces la clase Hija sí está obligada a tener su constructor desde donde debe invocar al constructor de la clase Padre utilizando la palabra reservada super.

La clase Hija puede tener métodos con el mismo nombre que algún método de la clase Padre. Para diferenciar su invocación al método de la clase Padre se le antepone la palabra reservada super.

Ejemplo 1

Considere la existencia de la clase TV desarrollada anteriormente y diseñe una nueva clase hija de nombre TVH, aplicando herencia, considerando los siguientes atributos protegidos adicionales: origen(entero), tecnología(entero). Considere para el campo origen: nacional, americano, japonés, koreano, chino, otro. Considere para el campo tecnología: Tradicional, LCD, Plasma, Digital. Considere métodos adicionales para que retornen el nombre del origen y el nombre de la tecnología.

La nueva clase hija debe ser utilizada para el proceso de la siguiente GUI:




 Diseño de la clase hija:
public class TVH extends TV {  
     // atributos protegidos
      protected int origen, tecnologia;

       // constructor
      public TVH(String serie, int marca, int tamaño, double precio, int origen, int tecnologia){

       // invocación al constructor de la clase Padre
           super(serie, marca, tamaño, precio);

     // inicializa sus propios atributos
         this.origen = origen;
         this.tecnologia=tecnologia; }

    // métodos get-set
          public int getOrigen() {
           return origen; }

     public void setOrigen(int origen) {
      this.origen = origen; }
       public int getTecnologia() {
             return tecnologia; }

       public void setTecnologia(int tecnologia) {
             this.tecnologia = tecnologia; }

         // metodos adicionales

          public String nombreOrigen(){
            switch(origen){
                        case 1: return "Nacional";
                        case 2: return "Americano";
                        case 3: return "Japonés";
                        case 4: return "Koreano";
                       case 5: return "Chino";
                       default: return "Otro"; } }

          public String nombreTecnologia(){
             switch(tecnologia){
                       case 1: return "Tradicional";
                       case 2: return "LCD";
                       case 3: return "Plasma";
                       default: return "Digital"; }
 }

        }
// fin de la clase hija

La nueva clase hija tendrá acceso a todo lo public y protected de la clase padre. Sin embargo, no tendrá acceso a ningún elemento private. La nueva clase hija tiene sus atributos con nivel de acceso protected porque estamos previniendo que ésta sea heredada por otras clases.

Observe y analice la aplicación de Herencia: extends, super

Programamos la acción del botón Nuevo
private void btnNuevoActionPerformed(java.awt.event.ActionEvent evt) {
TVH nuevo = new TVH(leeSerie(),leeMarca(),leeTamaño(),leePrecio(), leeOrigen(), leeTecnologia()); lista(nuevo);
 }

private void lista(TVH t){
          imprime("Datos de la clase Padre-------------");
          imprime("Nro. Serie\t:"+t.getSerie());
          imprime("Marca\t:"+t.nombreMarca());
         imprime("Tamaño\t:"+t.getTamaño());
         imprime("Precio us$\t:"+t.getPrecio());
          imprime("Precio S/.\t:"+t.precioSoles(2.85));
          imprime("Datos de la clase Hija--------------");
          imprime("Origen\t:"+t.nombreOrigen());
          imprime("Tecnologia\t:"+t.nombreTecnologia());
          imprime("----------------------------------");
 }

Observe e identifique los datos que se utilizan al momento de crear el objeto. Observe y verifique la compatibilidad entre la invocación del método lista() y su desarrollo. Repase el desarrollo de los métodos de lectura de los datos de la GUI y también el método imprime().






0 comentarios:

Publicar un comentario