Clase 10 - Herencia, jerarquía de clases abstractas.

Herencia, jerarquía de clases abstractas. 

Material pdf: Descargar pdf

HERENCIA

      Definición
      Permite a una clase compartir la misma estructura de datos y comportamiento de otra clase.
      La herencia minimiza la necesidad de duplicar código.
      El Polimorfismo permite utilizar el método de acuerdo al objeto heredado.

      Una subclase se define indicando a que superclase extiende.
      public class padre  {
      // Definición de la superclase Item.
      }
      public class hijo extends padre{
      // Atributos y métodos adicionales para distinguir una 
      // hijo de otros tipos de item
      }

      Una subclase hereda todas las variables instancia de la superclase.
      Las variables de instancia deben ser private para que instancias de la subclase hereden sus valores.
      public class Item {
      protected float precio = 0;
      protected String estado = "Excelente";
      }
      public class Pelicula extends Item {
      private String titulo = "";
      private int duracion = 0;
      }

      Una subclase no hereda ningún constructor de la superclase, debe declararse explícitamente.
      Solo en caso no se declare explícitamente, se ejecutaran los constructores por defecto de las superclases y finalmente de la subclase.
      Pelicula pelicula = new Pelicula ();
      //Inicia variables de la clase Item. Constructor por defecto.
      // Inicia variables de la clase Pelicula. Constructor por defecto.

La referencia super

                 Se refiere a la clase padre
                 Se usa para invocar constructores de la clase padre
                 Debe ser la primera sentencia del constructor de la clase hijo
                 Esta referencia también se usa para invocar cualquier método del padre.

                 public class Item {
                 protected float precio = 0;
                 Item (float precio) {
                 this.precio = precio;
                 }
                 }
                 public class Pelicula extends Item {
                 private String titulo = "";
                 Pelicula (float precio, String titulo) {
                 super(precio);
                 this.titulo = titulo;
                 }
                 }

Métodos

        La superclase define los métodos para todas las subclases.
        La subclase puede especificar métodos propios.
        File:item0.java
        package herencia;
        public class item0 {
        protected float precio=0;
        public item0(float precio) {
        this.precio=precio;
        }
        public float getPrecio() {
        return precio;
        }
        public void setPrecio(float precio) {
        this.precio = precio;
        }
        }

        File: pelicula.java
        package herencia;
        public class pelicula extends item0 {
        private String titulo="";
        public pelicula(float precio, String titulo) {
        super(precio);
        this.titulo=titulo;
        }
        public String getTitulo() {
        return titulo;
        }
        public void setTitulo(String titulo) {
        this.titulo = titulo;
        }    
        }
        package herencia;
        File:testsuper.java
        public class testsuper {
        public static void main(String []args){
        pelicula pelicula=new pelicula(2.2f,"Araña");
        System.out.println(pelicula.getPrecio());
        System.out.println(pelicula.getTitulo());
        }
        }

Ejemplo

        public class Mamifero{
        private int patas;
        private String nombre;
        public void imprimirPatas(){
        System.out.print(" Tiene "+patas+" patas\n");
        }
        public Mamifero(String nombre, int patas){
        this.nombre = nombre;
        this.patas = patas;
        }
        }
        //clases gato
        public class gato extends Mamifero {
        public gato(String nombre){
        super(nombre,4);
        }
        }
        //clase perro
        public class perro extends Mamifero {
        public perro(String nombre){
        super(nombre,4);
        }
        }
        //Creando perro
        public class crear_perro {
        public static void main(String []args){
        perro perrito=new perro("Pantaleon");
        perrito.imprimirPatas();
        }
        }

Clase Abstracta

La herencia permite que existan clases que nunca serán instanciadas directamente. En el ejemplo anterior, una clase "perro" heredaría los atributos y métodos de la clase "mamífero", así como también "gato", "delfín" o cualquier otra subclase; pero, en ejecución, no habrá ningún objeto "mamífero" que no pertenezca a alguna de las subclases. En ese caso, a una clase así se la conocería como Clase Abstracta. La ausencia de instancias específicas es su única particularidad, para todo lo demás es como cualquier otra clase.

Herencia y ocultación de información

  En ciertos lenguajes, el diseñador puede definir qué variables de instancia y métodos de los objetos de una clase son visibles. En C++ y java esto se consigue con las especificaciones private, protected y public. Sólo las variables y métodos definidos como públicos en un objeto serán visibles por todos los objetos. 
  Dependiendo del lenguaje que se utilice, el diseñador también puede controlar qué miembros de las superclases son visibles en las subclases. En el caso de java y C++ los especificadores de acceso (private, protected, public) de los miembros de la superclase afectan también a la herencia:
  Private: ningún miembro privado de la superclase es visible en la subclase.
  Protected: los miembros protegidos de la superclase son visibles en la subclase, pero no visibles para el exterior.
  Public: los miembros públicos de la superclase siguen siendo públicos en la subclase.

Ventajas

  Ayuda a los programadores a ahorrar código y tiempo, ya que la clase padre ha sido implementada y verificada con anterioridad, restando solo referenciar desde la clase derivada a la clase base (que suele ser extends, inherits, subclass u otras palabras clave similares, dependiendo del lenguaje).
  Los objetos pueden ser construidos a partir de otros similares. Para ello es necesario que exista una clase base (que incluso puede formar parte de una jerarquía de clases más amplia).
  La clase derivada hereda el comportamiento y los atributos de la clase base, y es común que se le añada su propio comportamiento o que modifique lo heredado.
  Toda clase pueden servir como clase base para crear otras.

Ejemplo – clase humano

         class humano {
         protected String nombre;
         protected String apellido;
         public humano(String nombre,String apellido) {
         this.nombre = nombre;
         this.apellido = apellido;
         }
         public String nombreCompleto() {
         return this.apellido + ", " + this.nombre;
         }
         public String identificacion() {
         return this.nombreCompleto();
         }
         }
         public class ciudadano extends humano {
         protected String documento;
         public ciudadano(String nombre,String apellido, String documento) {
         super(nombre,apellido);
         this.documento = documento;
         }
         public String identificacion() {
         return super.identificacion() + ", documento: " + this.documento;
         }
         }
         public class herencia {
         public static void main(String []args){
         ciudadano a=new ciudadano("Christian","Garcia","42809561");    
         System.out.println(a.identificacion());        
         }
        

No hay comentarios:

Publicar un comentario