Está en la página 1de 11

República Bolivariana de Venezuela

Ministerio del Poder Popular para la Defensa

Universidad Nacional Experimental Politécnica de la Fuerza Armada Nacional


Bolivariana (UNEFA)

Extensión – Guacara

Guacara, Edo – Carabobo

Unidad 4:
Herencia y polimorfismo

Profesor:​ Luis Solano Alumno:​ Jeykel Infante

Asignatura:​ Lenguajes de programación III CI ​27.927.489

Ing. En sistemas

6 to Semestre

Sábado, 21 de noviembre de 2020


Polimorfismo

En programación orientada a objetos, el polimorfismo se refiere a la propiedad por la que es


posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único
requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber
responder al mensaje que se les envía.

La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice,
más allá de las obvias diferencias sintácticas.

En lenguajes basados en clases y con un sistema de tipos de datos fuerte


(independientemente de si la verificación se realiza en tiempo de compilación o de
ejecución), es posible que el único modo de poder utilizar objetos de manera polimórfica sea
que compartan una raíz común, es decir, una jerarquía de clases, ya que esto proporciona
la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma
variable de referencia (que podrá apuntar a objetos de diversas subclases de dicha
jerarquía) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de objetos que
se tratan de manera polimórfica.

No obstante, algunos lenguajes de programación (Java, C++) permiten que dos objetos de
distintas jerarquías de clases respondan a los mismos mensajes, a través de las
denominadas interfaces (esta técnica se conoce como composición de objetos). Dos objetos
que implementen la misma interfaz podrán ser tratados de forma idéntica, como un mismo
tipo de objeto, el tipo definido por la interfaz. Así, distintos objetos podrán intercambiarse en
tiempo de ejecución –siempre que sean del mismo tipo–, y además con dependencias
mínimas entre ellos. Por estos motivos se considera un buen principio de diseño en
programación orientada a objetos el favorecer la composición de objetos frente a la herencia
de clases.Polimorfismo y ligadura

Se puede clasificar el polimorfismo en dos grandes clases:


● Polimorfismo dinámico​ (o ​polimorfismo paramétrico​) es aquel en el que el
código no incluye ningún tipo de especificación sobre el tipo de datos sobre el
que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.
● Polimorfismo estático​ (o p​ olimorfismo ad hoc​) es aquél en el que los tipos a
los que se aplica el polimorfismo deben ser explícitos y declarados uno por uno
antes de poder ser utilizados.
El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como
programación genérica.
También se clasifica en herencia por redefinición de métodos abstractos y por método
sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros.
Otra clasificación agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez
sobrecarga de operadores y coerción, Universal (inclusión o controlado por la herencia,
paramétrico o genericidad).
Ejemplo de polimorfismo
En el siguiente ejemplo hacemos uso del lenguaje C++ para ilustrar el polimorfismo. Se
observa a la vez el uso de las funciones virtuales puras, como se les conoce en C++, estas
funciones constituyen una interfaz más consistente cuando se trabaja con una jerarquía de
clases, puesto que hacen posible el enlace durante la ejecución. Sin embargo, como se
verá, para que el polimorfismo funcione no es una condición obligatoria que todas las
funciones en la clase base sean declaradas como virtuales.
Ligadura

La ligadura dinámica se encarga de ligar o relacionar la llamada a un método con el cuerpo


del método que se ejecuta finalmente.

Ligadura estática:

1. Consiste en realizar el proceso de ligadura en tiempo de compilación según el tipo


declarado del objeto al que se manda el mensaje.
2. La utilizan (en Java) los métodos de clase y los métodos de instancia que son
privados o final (ya que estos últimos no pueden ser sobrescritos).

Ligadura dinámica:

1. Consiste en realizar el proceso de ligadura en tiempo de ejecución siendo la forma


dinámica del objeto la que determina la versión del método a ejecutar.
2. Se utiliza en todos los métodos de instancia de Java que no son privados ni final.

Funcionamiento de la Ligadura Dinámica:

Resolución de conflictos entre Superclases y Subclases:

1. Cuando existe un conflicto entre un método de una superclase y un método de la


subclase, el comportamiento correcto es que el método de la subclase sobreescriba
al de la superclase.
2. Si estamos llamando a un método de la subclase desde una variable que ha sido
declarada del tipo de la superclase. ¿Cómo se consigue que funcione
correctamente?

Ligadura Dinámica:

3. Significa que la forma dinámica del objeto determina la versión de la operación que
se aplicará.
4. Esta capacidad de las operaciones para adaptarse automáticamente a los objetos a
los cuales se aplican es una de las propiedades más importantes de la orientación a
objetos.

Características de la Ligadura Dinámica:

Puede variar de un lenguaje a otro, pero básicamente presentan unas características


comunes. Los métodos que necesitan ligadura dinámica:
1. Deben presentar ligadura dinámica solo aquellos que pueden ser redefinidos.
2. Por ejemplo, en Java, los métodos de clase y los métodos de instancia privados y/o
finales no presentan ligadura dinámica.
3. En Java, si no se especifica nada se entenderá que el método puede ser redefinido y
por tanto debe presentar ligadura dinámica.

Clases interfaz

Interfaz (Java)

Una interfaz en Java es una colección de métodos abstractos y propiedades constantes.

En las interfaces se especifica qué se debe hacer pero no su implementación. Serán las
clases que implementen estas interfaces las que describen la lógica del comportamiento de
los métodos.

La principal diferencia entre interface y abstract es que un interface proporciona un


mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a
utilizar la herencia.

Ventajas

El uso de las interfaces Java proporciona las siguientes ventajas:

Organizar la programación.

permiten declarar constantes que van a estar disponibles para todas las clases que
queramos (implementando esa interfaz)

Obligar a que ciertas clases utilicen los mismos métodos (nombres y parámetros).

Establecer relaciones entre clases que no estén relacionadas.

Uso

Java proporciona dos palabras reservadas para trabajar con interfaces: interface e
implements.

Para declarar una interfaz se utiliza:


modificador_acceso puede ser una clase de objetos que nos permite utilizar herencia en
abstracción constante en las clases en las que se implemente.

Para implementarla en una clase, se utiliza la forma:

Una clase puede implementar varias interfaces de los paquetes que se han importado
dentro del programa, separando los nombres por comas.

Ejemplo

Definición de una interfaz:

Extensión de Clases

Cuando se construye una clase se hace atendiendo a unas necesidades concretas. Así, un
objeto de la clase A se comportará de una determinada manera. Pero resulta bastante
común que la clase A dada no se acomode a las necesidades concretas sino que en
algunos casos se necesitaría una clase A1 que, manteniendo las propiedades de la clase A,
se comporte como un caso particular de ésta. Esto es, que la clase A1 sea una extensión de
la clase A. Esta es una de las ventajas de la programación orientada a objetos que hace
posible la reutilización de código. Así, si alguien programó perfectamente la clase A,
nosotros no tendremos que realizar todo el trabajo otra vez para conseguir la clase A1, sólo
tendremos que añadir la funcionalidad que no esté en A.
Una Clase Extendida: Herencia

Veamos un ejemplo de clase que implementa un reloj en el que la hora se almacena en


campos para la hora, minutos y segundos, y se disponen de métodos para poner la hora del
reloj y para mostrar la hora.

Las funciones del reloj construido son un poco limitadas y el siguiente paso podría consistir
en conseguir un reloj construido para que sea capaz de considerar también el año, el mes y
el día. Este proceso se denomina extensión de una clase para obtener una subclase que
hereda los campos y métodos de la superclase de la que parte.

Así, la extensión de la clase reloj original se realizaría de la siguiente manera:

La clase RelojAnual, una subclase de Reloj, hereda automáticamente todos los campos y
miembros de la clase Reloj.

La herencia nos hace mucho más fácil la generación y el mantenimiento del código al poder
reutilizar código escrito y depurado con anterioridad. Pero vamos a estudiar con un poco
más de detalle el procedimiento seguido para extender la clase Reloj.
Jerarquía y Herencia

La herencia permite crear una nueva clase a partir de una clase existente, esto quiere decir
que la clase nueva (hija) hereda todos los atributos y métodos de la clase principal (padre)
siempre y cuando el nivel de acceso lo permita.

La herencia tiene muchas ventajas una de ellas es el reutilizar código ya que no necesitas
escribir de nuevo el código si no, solamente heredar de la clase padre.

La herencia es la que permite crear una estructura jerárquica de clases más especializadas.

Herencia Simple

Esta es la relación de clases más importante, es esencial en los sistemas orientados a


objetos ya que permite definir la relación de clases y brindar la estructura del
comportamiento en una nueva clase.

Esta se puede representar como una jerarquía de clases, como una vista en un árbol ya que
está comienza con la superclase que es quien contiene la abstracción principal del objeto y
de allí se derivan varias clases con el fin de lograr ciertas características especiales en el
objeto y es así como se descubre que la herencia implica una relación de especialización y
denota una relación de << es un >> la siguiente imagen puede aclarar aún más el concepto.

En la imagen podemos observar como la Clase Animal es la superclase pero de ella


heredan diferentes clases entre ellas Perro y Gato podemos decir entonces que Perro <es
un> Animal o Gato <es un> Animal.
Conversiones

La conversión de tipos (type casting en inglés) se refiere a la transformación de un tipo de


dato en otro. Esto se hace para tomar las ventajas que pueda ofrecer el tipo a que se va a
convertir. Por ejemplo, los valores de un conjunto más limitado, como números enteros, se
pueden almacenar en un formato más compacto y más tarde convertidos a un formato
diferente que permita las operaciones que anteriormente no eran posibles, tales como la
división con decimales.

Tipos de conversión

Hay dos tipos de conversión, la implícita y la explícita:

En la implícita se convierte un tipo de dato de menor rango a un supertipo (tipo de dato de


mayor rango); este tipo de conversión lo realiza el compilador, ya que no hay pérdida de
datos si, por ejemplo, se pasa un int (tipo entero) a long.

En la conversión explícita, el compilador no es capaz de realizarla por sí solo y por ello debe
definirse explícitamente en el programa.

Existen varios tipos de conversión explícita:

● Controlada: antes de realizar la conversión se controla en tiempo de ejecución si el


tipo de destino puede tener el valor de origen, y si no se produce un error.
● No controlada: no se realiza ningún control, si el tipo de dato destino no puede
contener al de origen el resultado es indefinido (generalmente se produce un
desbordamiento de búfer y en algunos casos como en java el cambio se produce sin
mayores consecuencias).
● Patrón de bits: La representación de bits en bruto de la fuente es una copia literal, y
se reinterpreta de acuerdo con el tipo de destino. Esto también puede lograrse a
través de aliasing.

También podría gustarte