domingo, 2 de diciembre de 2012

Herencia


La herencia es uno de los mecanismos de los lenguajes de programación orientada a objetos basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad. La clase de la que se hereda se suele denominar clase base, clase padre, superclase, clase ancestro (el vocabulario que se utiliza suele depender en gran medida del lenguaje de programación).

En los lenguajes que cuentan con un sistema de tipos fuerte y estrictamente restrictivo con el tipo de datos de las variables, la herencia suele ser un requisito fundamental para poder emplear el Polimorfismo, al igual que un mecanismo que permita decidir en tiempo de ejecución qué método debe invocarse en respuesta a la recepción de un mensaje, conocido como enlace tardío (late binding) o enlace dinámico (dynamic binding).
 

Ejemplo en Java

<import javax.*; import javax JOptionPane;">

 public class Mamifero{
   private int patas;
   private String nombre;
   public void imprimirPatas(){
     JOptionPane.showMessageDialog(null," Tiene " + patas + " patas\n","Mamifero",
                                   JOptionPane.INFORMATION_MESSAGE);
   }
   public Mamifero(String nombre, int patas){
     this.nombre = nombre;
     this.patas = patas;
   }
 }
 
 public class Perro extends Mamifero {
   public Perro(String nombre){
     super(nombre, 4);
   }
 }
 
 public class Gato extends Mamifero {
   public Gato(String nombre){
     super(nombre, 4);
   }
 }
 
 public class CrearPerro {
   public static void main(String [] args) {
     Perro perrito = new Perro("Pantaleon");
     perrito.imprimirPatas();   /*Está en la clase mamífero*/
   }
 }
public static void main args </source>
 

Se declaran las clases mamíferos, gato y perro, haciendo que gato y perro sean unos mamíferos (derivados de esta clase), y se ve como a través de ellos se nombra al animal pero así también se accede a patas dándole el valor por defecto para esa especie.

Es importante destacar tres cosas. La primera, es que la herencia no es un mecanismo esencial en el paradigma de programación orientada a objetos; en la mayoría de los lenguajes orientados a objetos basados en prototipos las clases no existen, en consecuencia tampoco existe la herencia y el polimorfismo se logra por otros medios. La segunda, es que el medio preferido para lograr los objetivos de extensibilidad y reutilización es la agregación o composición. La tercera, es que en lenguajes con un sistema de tipos débiles, el polimorfismo se puede lograr sin utilizar la herencia.

Por otra parte y aunque la herencia no es un concepto indispensable en el paradigma de programación orientada a objetos, es mucho más que un mecanismo de los lenguajes basados en clases, porque implica una forma de razonar sobre cómo diseñar ciertas partes de un programa. Es decir, no sólo es un mecanismo que permite implementar un diseño, sino que establece un marco conceptual que permite razonar sobre cómo crear ese diseño.

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. En otros lenguajes como Smalltalk, todas las variables de instancia son privadas y todos los métodos son públicos.

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.

No hay comentarios:

Publicar un comentario