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).
<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