Está en la página 1de 38

Programación Orientada a Objetos

Fase 4 - Herencia en lenguaje de programación Java

Presentado a:

Entregado por:

Jonathan Echavarria

Código:

Grupo:

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básica, Tecnología e Ingeniería

Cali
-Herencia y Polimorfismo

La herencia es un mecanismo que sirve para reutilizar clases, se utiliza cuando existen clases

que comparten muchas de sus características, se extiende la funcionalidad de clases más genérica

y adicional se introducen los conceptos de superclase y subclase

Como podemos ver este ejemplo tenemos la superclase persona y abajo dos clases que son

cliente y empleado (subclases), por un lado la clase cliente y empleado tenían propiedades que

eran comunes lo cual eran nombres, apellidos, documentos, tipo para que de esta manera la clase

persona van a heredar todas estas propiedades tanto la clase cliente como la clase empleado,

como pueden evidenciar la clase persona no tiene ningún método, si lo tuviera, estos métodos

van hacer heredados por la clase cliente como por la clase empleado.
La herencia es una técnica de abstracción que nos permite agrupar objetos con características

comunes. Todas las aplicaciones Java usan herencia, aunque no lo hagan de forma explícita. Esto

es así porque cuando creamos una clase sin ninguna referencia a una superclase, el propio

compilador inserta en la clase creada una relación de herencia directa con la la clase

java.lang.Object. Por este motivo todos los objetos, sean de la clase que sean, pueden invocar

métodos de la clase java.lang.Object como equals() y toString(), aunque no siempre se van a

obtener buenos resultados así.

Polimorfismo

En programación orientada a objetos el polimorfismo se refiere a la posibilidad de definir

clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se

comportan de manera distinta. El concepto de polimorfismo se puede aplicar tanto a funciones

como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos.

Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de

datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que

contienen al menos un elemento cuyo tipo no está especificado.


Tipos de polimorfismo

Polimorfismo de sobrecarga

El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con

funcionalidad similar, en clases que son completamente independientes una de otra (éstas no

tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase

image y la clase link pueden todas tener la función "display". Esto significa que no necesitamos

preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es

verlo en la pantalla.

Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos

comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por

ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está haciendo

referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre

dos cadenas de caracteres (concatenación).

 Se puede modificar localmente el comportamiento de los métodos heredados

 De esta manera, objetos de diferentes tipos pueden responder de forma diferente a la

misma llamada.

 Este es el concepto clave del polimorfismo


Ejemplo: Se mueve igual un pez, un pájaro o una rana?

En cambio, todos son animales y pos tanto podrían heredar el método mover de dicha clase,

gracias al polimorfismo, cada objeto concreto realizaría la operación mover como corresponda.

Polimorfismo quiere decir "un objeto y muchas formas". Esta propiedad permite que un

objeto presente diferentes comportamientos en función del contexto en que se encuentre. Por

ejemplo un método puede presentar diferentes implementaciones en función de los argumentos

que recibe, recibir diferentes números de parámetros para realizar una misma operación, y

realizar diferentes acciones dependiendo del nivel de abstracción en que sea llamado.

Los objetos de distintas clases pertenecientes a una misma jerarquía o que implementan una

misma interface pueden tratarse de una forma general e individualizada, al mismo tiempo.

Una referencia a un objeto de una determinada clase es capaz de servir de referencia o de

nombre a objetos de cualquiera de sus clases derivadas.

El poder utilizar nombres de una super-clase o de una interface permite tratar de un modo

unificado objetos distintos, aunque pertenecientes a distintas sub-clases o bien a clases que

implementan dicha interface


VENTAJAS Y DESVENTAJAS DEL POLIMORFISMO

El polimorfismo permite a los programadores separar las cosas que cambian de las que no

cambian, y de esta manera hacer más fácil la ampliación, el mantenimiento y la reutilización de

los programas.

El polimorfismo puede hacerse con referencias de super-clases abstract, super-clases normales

e interfaces.

Por su mayor flexibilidad y por su independencia de la jerarquía de clases estándar, las

interfaces permiten ampliar muchísimo las posibilidades del polimorfismo.

El polimorfismo está basado en utilizar referencias de un tipo más “amplio” que los objetos a

los que apuntan. Las ventajas del polimorfismo son evidentes, pero hay una importante

limitación: el tipo de la referencia (clase abstracta, clase base o interface) limita los métodos que

se pueden utilizar y las variables miembro a las que se pueden acceder

HERENCIA MÚLTIPLE

Herencia múltiple hace referencia a la característica de los lenguajes de programación

orientada a objetos en la que una clase puede heredar comportamientos y características de más

de una superclase. Esto contrasta con la herencia simple, donde una clase sólo puede heredar de

una superclase.

Lenguajes que soportan herencia múltiple en su mayor parte son: C++, Centura SQL

Windows, CLOS, Eiffel, Object REXX, Perl y Python.


La herencia múltiple permite a una clase tomar funcionalidades de otras clases, como permitir

a una clase llamada MusicoEstudiante heredar de una clase llamada Persona, una clase llamada

Músico, y una clase llamada Trabajador. Esto puede ser abreviado como MusicoEstudiante :

Persona, Músico, Trabajador.

La herencia simple es la más típica, la que se puede encontrar en cualquier lenguaje moderno

como Java o C#.

La herencia simple es una relación entre una clase padre (clase base) y una clase hija (clase

derivada) llamada "es un tipo de", que muchas veces se abrevia como isA.

La herencia es simple cuando la clase derivada que estamos considerando sólo tiene una clase

base.

Herencia Simple

La herencia simple se apoya en el uso de clases base para compartir sus atributos y

comportamientos con otras clases derivadas como los siguientes ejemplos el objeto Supervisor y

el objeto Obrero.
La herencia simple consiste en cuando una clase, hereda a una clase hijo, y a solo una le

hereda sus atributos, es igual al concepto general de herencia, con la limitante de solo poder

heredar de una clase padre a una clase hijo, y solo a una clase hijo

Herencia de Interfaz

Sólo se hereda la interfaz, no hay implementación a nivel de clase base (interfaces en Java,

clases abstractas en C++)

Entre las interfaces existe una jerarquía (independiente de la de las clases) que permite

herencia simple y múltiple. Cuando una interface deriva de otra, incluye todas sus constantes y

declaraciones de métodos.
Una interface puede derivar de varias interfaces. Para la herencia de interfaces se utiliza así

mismo la palabra extends, seguida por el nombre de las interfaces de las que deriva, separadas

por comas.

Una interface puede ocultar una constante definida en una super-interface definiendo otra

constante con el mismo nombre. De la misma forma puede ocultar, re-declarándolo de nuevo, la

declaración de un método heredado de una super-interface.

Las interfaces no deberían ser modificadas más que en caso de extrema necesidad. Si se

modifican, por ejemplo añadiendo alguna nueva declaración de un método, las clases que hayan

implementado dicha interface dejarán de funcionar, a menos que implementen el nuevo método.

Herencia de implementación

 Habilidad para que una clase herede parte o toda su implementación de otra lase, debe

ser utilizada con cuidado.

Uso seguro de la herencia de implementación

 En la herencia existe una tensión entre expansión (adición de métodos más

específicos) y contracción (especialización o restricción de la clase padre)

 Esta tensión está en la base de su poder, y también de los problemas asociados con su

uso.
 En general, la redefinición de métodos sólo debería usarse para hacer las propiedades

más específicas

 Constreñir restricciones

 Extender funcionalidad

Especialización

 La clase derivada es una especialización de la clase base: añade comportamiento pero

no modifica nada

 Satisface las especificaciones de la clase base

 Se cumple el principio de sustitución (subtipo)

Especificación

 La clase derivada es una especificación de una clase base abstracta o interfaz.

 Implementa métodos no definidos en la clase base (métodos abstractos o diferidos).

 No añade ni elimina nada.

 La clase derivada es una realización (o implementación) de la clase base.


Restricción (limitación)

No todo lo de la clase base sirve a la derivada, hay que redefinir ciertos métodos para eliminar

comportamiento presente en la clase base, no se cumple el principio de sustitución (un pingüino

no puede volar)

Generalización

• Se extiende el comportamiento de la clase base para obtener un tipo de objeto más general.

• Usual cuando no se puede modificar la clase base. Mejor invertir la jerarquía.


 Varianza (herencia de conveniencia)

La implementación se parece pero semánticamente los conceptos no están relacionados

jerárquicamente (test “es-un”).

INCORRECTA!!!!

Solución: si es posible, factorizar código común. (p.ej. Ratón y Tableta Grafica)

 También llamada Herencia de Implementación Pura

 Una clase hereda pate de su funcionalidad de otra, modificando el interfaz heredado

 La clase derivada no es una especialización de la clase base (puede que incluso no

haya relación “es-un”)

 No se cumple el principio de sustitución (ni se pretende)

 P. ej., una Pila puede construirse a partir de un Array

[ CITATION Cri11 \l 3082 ]


POLIMORFISMO Y REUTILIZACIÓN

En programación orientada a objetos se denomina polimorfismo a la capacidad que tienen los

objetos de una clase de responder al mismo mensaje o evento en función de los parámetros

utilizados durante su invocación. Un objeto polimórfico es una entidad que puede contener

valores de diferentes tipos durante la ejecución del programa.

En algunos lenguajes, el término polimorfismo es también conocido como ‘Sobrecarga de

parámetros’ ya que las características de los objetos permiten aceptar distintos parámetros  para

un mismo método (diferentes implementaciones) generalmente con comportamientos distintos e

independientes para cada una de ellas.

Ejemplo:este método devuelve la suma de 2 parámetros

Function suma(int numero1,int numero2) ‘ este método devuelve la suma de los 3 parámetros

Function suma(int numero1,int numero2, int numero3) ‘ este método devuelve la concatenación

de cadena1 y cadena2 Function suma(String cadena1, String cadena2)

Sobrecarga

la sobrecarga se refiere a la posibilidad de tener dos o más funciones con el mismo nombre

pero funcionalidad diferente. Es decir, dos o más funciones con el mismo nombre realizan

acciones diferentes. El compilador usará una u otra dependiendo de los parámetros usados. A

esto se llama también sobrecarga de funciones.

También existe la sobrecarga de operadores que al igual que con la sobrecarga de funciones se

le da más de una implementación a un operador.


El mismo método dentro de una clase permite hacer cosas distintas en función de los

parámetros.

Java no permite al programador implementar sus propios operadores sobrecargados, pero sí

utilizar los predefinidos como el +. C++, por el contrario si permite hacerlo.

Sobrecarga de métodos

Algunos métodos en una clase pueden tener el mismo nombre. Estos métodos deben contar

con diferentes argumentos. El compilador decide qué método invocar comparando los

argumentos. Se generara un error si los métodos tienen definidos los mismos parámetros.

Ejemplo:

Sobrecarga de Operadores.

Es el proceso de asignar dos ó más operaciones al mismo operador.

En otras palabras, permite asignar una o más funciones adicionales a un operador estándar,

con el fin de que ésta sea llamada según el contexto en el cual se utilice el operador.

Un operador sobrecargado no puede tener parámetros predeterminados.


Para sobrecargar un operador, y aplicarlo en operaciones entre clases, se usa la función

especial operador.

Una función operador es una función cuyo nombre consta de la palabra reservada operator

seguida de un operador unitario o binario que se sobrecargará.

La sintaxis para sobrecargar un operador es la siguiente:

public static <tipo de dato retornado> operator <operador a sobrecargar> (lista de

parámetros)

{ //instrucciones que forman el cuerpo del operador

Donde:

 tipo de dato: indica el tipo de dato que produce el operador sobrecargado, por lo general
es la referencia del objeto y es lo que se retornará.
 operator: es una palabra reservada utilizada para realizar la sobrecarga.
 Operador a sobrecargar: operador que estamos sobrecargando.
 Lista de parámetros: es la lista de objetos (en referencia) o variables que se procesarán en
la sobrecarga.
Polimorfismo en jerarquías de herencia

Polimorfismo en jerarquías de herencia

Sobrecarga en jerarquías de herencia

 Métodos con el mismo nombre, la misma signatura de tipo y enlace estático:


 Shadowing (refinamiento/reemplazo): las signaturas de tipo son las misma en clases base
y derivadas, pero el método a invocar se decide en tiempo de compilación.

 En C++ implica que el método no se declaró como virtual en clase padre.


 Métodos con el mismo nombre y distinta signatura de tipo y enlace estático:
 Redefinición: clase derivada define un método con el mismo nombre que en la base pero
con distinta signatura de tipos.

 Modelo merge: SOBRECARGA


 Modelo jerárquico: NO HAY SOBRECARGA

Dos formas de resolver la redefinición en LOO:

 Modelo merge (Java):


Los diferentes significados que se encuentran en todos los ámbitos actualmente activos

se unen para formar una sola colección de métodos.

 Modelo jerárquico (C++):


Cuando se encuentra un ámbito en el que el nombre está definido, la

coincidencia más cercana en ese ámbito será la seleccionada para resolver la llamada.

class Padre{

public: void ejemplo(int a){cout<<“Padre”;};


};

class Hija: public Padre{

public: void ejemplo (int a, int b){cout<<“Hija”;};

};

int main(){

Hija h;

h.ejemplo(3); // OK en Java

//pero ERROR DE COMPILACIÓN EN C++

return (0);

POLIMORFISMO EN JERARQUÍAS DE HERENCIA

Sobre escritura (Overriding, polimorfismo de inclusión)

Decimos que un método en una clase derivada sobrescribe un método

En la clase base si los dos métodos tienen el mismo nombre, la misma signatura de tipos y

enlace dinámico.

 El método en la clase base tiene enlace dinámico (método virtual o abstracto).


 Los métodos sobrescritos pueden suponer un reemplazo del comportamiento o un
refinamiento.
 La resolución del método a invocar se produce en tiempo de ejecución (enlace dinámico)
en función del tipo dinámico del receptor del mensaje.
[ CITATION Cri09 \l 3082 ]

Variables Polimórficas

Una variable polimórfica es aquélla que puede referenciar más de un tipo de objeto

 Puede mantener valores de distintos tipos en distintos momentos de ejecución del


programa.
 En un lenguaje con sistema de tipos dinámico todas las variables son potencialmente
polimórficas
 En un lenguaje con sistema de tipos estático la variable polimórfica es la materialización
del principio de sustitución.
 En Java: las referencias a objetos.
 En C++: punteros o referencias a clases polimórficas
 En Java, por defecto todas las clases son polimórficas.
 En C++, clase con al menos un método virtual.

Podemos indicar que no se pueden crear clases derivadas con final:

 final class ClaseNoDerivable { … }


 El efecto es que las referencias de tipo ClaseNoDerivable ya no son polimórficas: sólo
pueden referenciar objetos de tipo ClaseNoDerivable.

Variables polimórficas simples

 Figura2D img; // Puntero a clase base polimórfica que en realidad apuntará a objetos de
clases derivadas (Circulos, Cuadrados,...)
 Variables receptoras: this y super
 En un método, hacen referencia al receptor del mensaje.
 En cada clase representan un objeto de un tipo distinto.
 (en otros lenguajes recibe otros nombres, como ‘self’)
Downcasting (polimorfismo inverso):

 Conversión de una referencia a clase base a referencia a clase derivada.


 Implica ‘deshacer’ el ppio. de sustitución.
 Tipos
 Estático (en tiempo de compilación)
 Dinámico (en tiempo de ejecución)
C++ soporta ambos tipos en Java es siempre dinámico.

Downcasting dinámico

 Se comprueba en tiempo de ejecución que la conversión es posible


 En Java, sólo permitido dentro de jerarquías de herencia
 Si no es posible se lanza ClassCastException class Base {
public void f() {}

class Derivada extends Base {

public void f() {}

public void g() {}

// Downcasting no seguro

Base[] x = { new Base(), new Derivada() };

Derivada y = (Derivada)x[1]; // Downcasting OK


y = (Derivada)x[0]; // ClassCastException thrown

y.g();

Downcasting seguro y RTTI

 RTTI: Run Time Type Information


 Mecanismo que proporciona información sobre tipos en tiempo de ejecución
 Permite averiguar y utilizar información acerca de los tipos de los objetos mientras el
programa se está ejecutando.
 En particular, podemos identificar subtipos a partir de referencias al tipo base:
downcasting seguro

RTTI: La clase Class

 Es una metaclase cuyas instancias representan clases


 Cada clase tiene asociado un objeto Class

class MiClase {}

MiClase c = new MiClase();

Class clase = MiClase.class; // literal de clase

clase = c.getClass(); // idem

Literal de clase: es el objeto Class que representa a MiClase

[ CITATION PJP11 \l 3082 ]


https://rua.ua.es/dspace/bitstream/10045/12673/1/5-Polimorfismo.pdf
link para sobrecargas , polimorfismo en jerarquías de herencia

https://www.youtube.com/watch?v=Z0yLerU0g-Q

diagrama de herencia

DIAGRAMA DE CLASE - HERENCIA


DIAGRAMA ER
SUPERCLASE - PERSONA
public class Modelo_persona {

private int idpersona;

private String nombre;

private String apaterno;

private String amaterno;

private String tipo_documento;

private String num_documento;

private String direccion;

private String telefono;

private String email;

public Modelo_persona() {

public Modelo_persona(int idpersona, String nombre, String apaterno, String amaterno,

String tipo_documento, String num_documento, String direccion, String telefono, String email) {

this.idpersona = idpersona;

this.nombre = nombre;

this.apaterno = apaterno;
this.amaterno = amaterno;

this.tipo_documento = tipo_documento;

this.num_documento = num_documento;

this.direccion = direccion;

this.telefono = telefono;

this.email = email;

public int getIdpersona() {

return idpersona;

public void setIdpersona(int idpersona) {

this.idpersona = idpersona;

public String getNombre() {

return nombre;

public void setNombre(String nombre) {

this.nombre = nombre;
}

public String getApaterno() {

return apaterno;

public void setApaterno(String apaterno) {

this.apaterno = apaterno;

public String getAmaterno() {

return amaterno;

public void setAmaterno(String amaterno) {

this.amaterno = amaterno;

public String getTipo_documento() {

return tipo_documento;

public void setTipo_documento(String tipo_documento) {

this.tipo_documento = tipo_documento;
}

public String getNum_documento() {

return num_documento;

public void setNum_documento(String num_documento) {

this.num_documento = num_documento;

public String getDireccion() {

return direccion;

public void setDireccion(String direccion) {

this.direccion = direccion;

public String getTelefono() {

return telefono;

public void setTelefono(String telefono) {

this.telefono = telefono;
}

public String getEmail() {

return email;

public void setEmail(String email) {

this.email = email;

SUBCLASE - VIGILANTE

public class Modelo_vigilante extends Modelo_persona{

private String codigo_vigilante;

public Modelo_vigilante() {

public Modelo_vigilante(String codigo_vigilante) {

this.codigo_vigilante = codigo_vigilante;

public String getCodigo_vigilante() {


return codigo_vigilante;

public void setCodigo_vigilante(String codigo_vigilante) {

this.codigo_vigilante = codigo_vigilante;

SUBCLASE – USUARIO

public class Modelo_usuario extends Modelo_persona{

String acceso;

String login;

String password;

String estado;

//Creamos el constructor vacio

public Modelo_usuario() {

//Creamos el constructor
public Modelo_usuario(String acceso, String login, String password, String estado) {

this.acceso = acceso;

this.login = login;

this.password = password;

this.estado = estado;

//Definimos los get y set

public String getAcceso() {

return acceso;

public void setAcceso(String acceso) {

this.acceso = acceso;

public String getLogin() {


return login;

public void setLogin(String login) {

this.login = login;

public String getPassword() {

return password;

public void setPassword(String password) {

this.password = password;

public String getEstado() {

return estado;

public void setEstado(String estado) {

this.estado = estado;

}
PATRÓN DE DISEÑO MVS (MODELO VISTA CONTROLADOR)

Para este proyecto se utilizó el patrón de diseño MVC lo cual consta de 3 capas

Modelo Vista Controlador (MVC) es un estilo de arquitectura de software que separa los

datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes

distintos.

Se trata de un modelo muy maduro y que ha demostrado su validez a lo largo de los años en

todo tipo de aplicaciones, y sobre multitud de lenguajes y plataformas de desarrollo

El Modelo que contiene una representación de los datos que maneja el sistema, su lógica de

negocio, y sus mecanismos de persistencia.


La Vista, o interfaz de usuario, que compone la información que se envía al cliente y los

mecanismos interacción con éste.

El Controlador, que actúa como intermediario entre el Modelo y la Vista, gestionando el flujo

de información entre ellos y las transformaciones para adaptar los datos a las necesidades de

cada uno.

EL MODELO ES EL RESPONSABLE DE:

Acceder a la capa de almacenamiento de datos. Lo ideal es que el modelo sea independiente

del sistema de almacenamiento.

Define las reglas de negocio (la funcionalidad del sistema). Un ejemplo de regla puede ser:

"Si la mercancía pedida no está en el almacén, consultar el tiempo de entrega estándar del

proveedor".

Lleva un registro de las vistas y controladores del sistema.

Si estamos ante un modelo activo, notificará a las vistas los cambios que en los datos pueda

producir un agente externo (por ejemplo, un fichero por lotes que actualiza los datos, un

temporizador que desencadena una inserción, etc.).

EL CONTROLADOR ES RESPONSABLE DE:

Recibe los eventos de entrada (un clic, un cambio en un campo de texto, etc.).
Contiene reglas de gestión de eventos, del tipo "SI Evento Z, entonces Acción W". Estas

acciones pueden suponer peticiones al modelo o a las vistas. Una de estas peticiones a las vistas

puede ser una llamada al método "Actualizar ()". Una petición al modelo puede ser

"Obtener_tiempo_de_entrega ( nueva_orden_de_venta )".

LAS VISTAS SON RESPONSABLES DE:

Recibir datos del modelo y los muestra al usuario.

Tienen un registro de su controlador asociado (normalmente porque además lo instancia).

Pueden dar el servicio de "Actualización ()", para que sea invocado por el controlador o por el

modelo (cuando es un modelo activo que informa de los cambios en los datos producidos por

otros agentes).
El flujo que sigue el control generalmente es el siguiente:

Este patrón es uno de los más usados, en la actualidad se puede encontrar tanto en pequeños

como en grandes sistemas, en el mundo laboral es indispensable llevarlo a la práctica. Si apenas

te estás iniciando en el mundo de la programación, te recomiendo que adoptes este modelo lo

más pronto posible, para que en un futuro con sistemas más complejos no tengas ningún

inconveniente.

[ CITATION Mir \l 3082 ]

También podría gustarte