Herencia (375814)

Anuncio
Herencia (informática)
En programación orientada a objetos la herencia es, después de la agregación o composición, el mecanismo más
utilizado para alcanzar algunos de los objetivos más preciados en el desarrollo de software como lo son la
reutilización y la extensibilidad. A través de ella los diseñadores pueden crear nuevas clases partiendo de una
clase o de una jerarquía de clases preexistente (ya comprobadas y verificadas) evitando con ello el rediseño, la
modificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de
otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos) y eventualmente los
atributos (variables) de su superclase.
Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si declaramos una clase párrafo
derivada de una clase texto, todos los métodos y variables asociadas con la clase texto, son automáticamente
heredados por la subclase párrafo.
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).
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
Una variable que se declara y se usa dentro de un método (o de un constructor) se dice que
es una variable local. Su ámbito es sólo el método o constructor y su tiempo de vida es solo
el del método, es decir, son variables temporales que se crean cuando comienza a
ejecutarse el método y se destruyen cuando termina de ejecutarse.
Protected
Hasta ahora habíamos dicho que una subclase no tiene acceso a los campos de una superclase de acuerdo con
el principio de ocultación de la información. Sin embargo, esto podría considerarse como demasiado restrictivo.
Decimos que podría considerarse demasiado restrictivo porque limita el acceso a una subclase como si se
tratara de una clase cualquiera, cuando en realidad la relación de una superclase con una subclase es más
estrecha que con una clase externa. Por ello en diferentes lenguajes, Java entre ellos, se usa un nivel de acceso
intermedio que no es ni public ni private, sino algo intermedio que se denomina como “acceso protegido”,
expresado con la palabra clave protected, que significa que las subclases sí pueden tener acceso al campo o
método.
Abstract
El sentido está en que una superclase permite unificar campos y métodos de las subclases, evitando la repetición
de código y unificando procesos. Ahora bien, una clase de la que no se tiene intención de crear objetos, sino que
únicamente sirve para unificar datos u operaciones de subclases, puede declararse de forma especial en Java:
como clase abstracta. La declaración de que una clase es abstracta se hace con la sintaxis public abstract class
NombreDeLaClase. Por ejemplo public abstract class Profesor. Cuando utilizamos esta sintaxis, no resulta
posible instanciar la clase, es decir, no resulta posible crear objetos de ese tipo. Sin embargo, sigue funcionando
como superclase de forma similar a como lo haría una superclase “normal”. La diferencia principal radica en que
no se pueden crear objetos de esta clase.
Final
En los programas que generemos usualmente intervendrán constantes: valores matemáticos como el número Pi,
o valores propios de programa que nunca cambian. Si nunca cambian, lo adecuado será declararlos como
constantes en lugar de cómo variables. Supongamos que queremos usar una constante como el número Pi
Super
En apartados anteriores del curso hemos trabajando con herencia, polimorfismo y sobre escritura de métodos.
Hemos usado como clases de ejemplo las clases Persona, Profesor, Profesor Interino y Profesor Titular, donde
Profesor hereda de Persona y los profesores interino y titular de Profesor.
Redefinición de métodos
En la clase derivada se puede redefinir algún método existente en la clase base, con el objeto de proveer una
implementación diferente. Para redefinir un método en la subclase, basta con declararlo nuevamente con la
misma signatura (nombre y parámetros). Si se invoca un cierto método de un objeto que no está definido en su
propia clase, se dispara la búsqueda hacia arriba en la jerarquía a la que dicha clase pertenece. Sin embargo, si
existieran dos métodos con la misma signatura, uno en la clase y otro en una superclase, se ejecutaría el de la
clase, no el de la superclase.
Cuando se redefine un método en una clase es posible acceder explícitamente al método original de su
superclase, mediante una sintaxis específica que depende del lenguaje de programación empleado (en muchos
lenguajes se trata de la palabra clave super).
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.
Estereotipos de herencia
Herencia simple
Una clase sólo puede heredar de una clase base y de ninguna otra.
Herencia múltiple
Una clase puede heredar las características de varias clases base, es decir, puede tener varios padres.
En este aspecto hay discrepancias entre los diseñadores de lenguajes. Algunos de ellos han preferido no
admitir la herencia múltiple debido a que los potenciales conflictos entre métodos y variables con igual
nombre, y eventualmente con comportamientos diferentes crea un desajuste cognitivo que va en contra
de los principio de la programación orientada a objetos. Por ello, la mayoría de los lenguajes orientados a
objetos admite herencia simple. En contraste, algunos pocos lenguajes admiten herencia múltiple, entre
ellos: C++, Python, Eiffel, mientras que Smalltalk, Java, Ada y C# sólo permiten herencia simple.
Descargar