Sunteți pe pagina 1din 28

DOCENTE: M.S.

I PATRICIA HERNANDEZ RODRIGUEZ

MATERIA: programacin orientada a objetos

TEMAS Herencia y polimorfismo.

Fecha de entrega: 05 de junio del 2015

INTEGRANTES DE EQUIPO:
"

NSTOR IVN RUIZ ZALETA

GRADO: 2

GRUPO: 201

UNIDAD: 5
CARRERA: ING. INFORMATICA

Herencia y polimorfismo.
5.1 Concepto de herencia y polimorfismo.
5.2 Definicin de una clase base.
5.3 Definicin de una clase derivada.
5.4 Clases abstractas.
5.5 Definicin de herencia mltiple.
5.6 Implementacin de herencia mltiple.
5.7 Reutilizacin de la definicin de paquetes /libreras.
(

1)

5.8 Clases genricas (Plantillas).

2)

5. HERENCIA Y POLIMORFISMO
Contenido
5.1 Concepto de herencia y polimorfismo..................................................................1
5.6 Implementacin de herencia mltiple...................................................................13

Simulacin de herencia mltiple................................................................................ 16


5.7 Reutilizacin de la definicin de paquetes/libreras...............................................21

Herencia y polimorfismo.
5.1 Concepto de herencia y polimorfismo.
5.2 Definicin de una clase base.
5.3 Definicin de una clase derivada.
5.4 Clases abstractas.
5.5 Definicin de herencia mltiple.
5.6 Implementacin de herencia mltiple.
5.7 Reutilizacin de la definicin de paquetes /libreras.
5.8 Clases genricas (Plantillas).

5.1 Concepto de herencia y polimorfismo.


HERENCIA.- Es una caracterstica fundamental de la POO ya que es la que permite un
gran aumento en la reutilizacin de cdigo. La posibilidad de crear nuevas clases basadas
en otras preexistentes permite crear bibliotecas genricas, a las cuales les podemos
hacer algunos ajustes.
Para crear una clase basada en una preexistente se utiliza la siguiente sintaxis:
clase

subclase

extends

superclase

3)

En este caso todos los animales tienen el mtodo de registrar y el mecanismo de


herencia permite desarrollar una sola vez los mtodos que son comunes a todas las
subclases.

Animal
Mamfero

Terrestre

Ovparo

Acuticos

Felinos

Gatos

4)

Vivparo

Persona
Estudiante

Medio superior

Regulares

Irregulares

Empleado

Superior

Regulares

Obrero

Turno

Irregulares
(

Gerente

5)

Fsica

Acstica

Sonido

ptica

Luz

Propiedades
(

6)

Materia condensada

Slidos

Lquidos

Herencia

POO

Herencia

Simple

Abstraccin

Polimorfismo

Encapsulamiento

Compuesta

Polimorfismo
Llamar a un mtodo igual que otros pero con diferentes parmetros.
Realizar un programa que lea la cantidad en gramos del peso de 2 productos a y b, y en u
mtodo calcule el promedio del peso de los q productos.
//clase de clculo de promedio de peso.
class peso {
private double a;
private double b;
private double promedio;
public peso ( )
{
a=0;
(

7)

b=0;
promedio=0;
}
public void asignaciones ( double a1, double b1)
{
a=a1;
b=b1;
}
public void calcular( )
{
promedio=(a+b)/2;
System.out.prontln(El promedio es+ promedio);
}

5.2 Definicin de una clase base.


Una base en Java es aquella que ha sido ya depurada y aprobada en su funcionabilidad y
la hereda a otras clases el acceso a sus mtodos y propiedades.
La clase base inicializa los miembros dato o propiedades creando un constructor que
despus podr ser modificado por una clase derivada.
Los programadores crean clases base:
1. Cuando se dan cuenta que diversos tipos tienen algo en comn.
2. Cuando se precisa ampliar la funcionalidad de un programa sin tener que
modificar el cdigo existente.
Ejemplos:
Partido de futbol:
Clase base: posicin, nombre, nmero.
Ajedrez:
Clase base: nombre, posicin, valor.

8)

Ejemplo:
class ventana
{
private int x;
private int y;
private double ancho;
private double altura;
private boolean estado;
public ventana ( )
{
x=3;
y=5;
ancho=13;
altura=10;
}
public mostrar (int x1, int y1)
{
x=x1;
y=y1;
System.out.println(Posicion x+x1);
System.out.println(Posicion y+y1);
}
}

5.3 Definicin de una clase derivada


Una case derivada consiste en la implementacin de la herencia para obtener, aumentar o
modificar el comportamiento y los datos de otra clase.
Ejemplo:
public class ventana_titulo extends ventana
{
private String titulo;
ventana_titulo
{
titulo=Mi ventana;
x=10;
(

9)

y=15;
ancho=40;
altura=20;
}
public void mostrar (String titulo, int x1, int y1,double a, double b)
{
System.out.println(titulo+ titulo);
System.out.println(x+ x1);
System.out.println(y+ y1);
System.out.println(ancho+ a);
System.out.println(altura+ b);
}}

5.4 Definicin de una clase abstracta


Una clase abstracta es un mtodo o clase declarado en una parte del cdigo para la cual
se proporciona la implementacin. La clase abstracta tiene al menos un mtodo abstracto.
Hay ocasiones cuando se desarrolla una jerarqua de clases en algn comportamiento est
presente en todas ellas pero se materializa de forma distinta para cada una.

Figura
Cuadriltero

CuadradoRectngulo

Triangulo

Issceles
(
)

Cuadrilatero

10

Circulo

Escaleno

class figura
{
private doubl area, permetro;
private String color;
figura ( )
{
area=0;
permetro=0;
color=White;
}
public void dibujar ( )
{
System.out.println(Dibujar la figura);
}
public class circulo extends figura
{
private doubl radio;
circulo ( )
{

Mtodo
abstracto

radio=0;
area=0;
permetro=0;
color=red;
}
public void dibujar ( )
{
System.out.println(Dibuja el circulo);
System.out.println(Radio);
radio=Double.parseDouble(lectura.readLine());
}
(
)

11

}
Realiza el diagrama que corresponda a la clase materia y representa la herencia que
quieras.
Realiza el cdigo de la clase base y de una de la clase derivada.

Materia
Bsicas

Matemticas

Calculo Algebra

Especialidad

Contabilidad

Financiera

class materia
{
private String nombre;
private int unidad;
private doubl calificacin, promedio;
}
materia ( )
{
nombre= ;
unidad=0;
(
)

12

Programacin

Fundamentos

POO

calificacin=0;
promedio=0;
}
public void promedio( )
{
System.out.println(calcular promedio);
}
public class bsicas extends materia
{
private int cant_unid;
bsicas ( )
{
cant_unid=0;
nombre= ;
unidad=0;
calificacin=0;
promedio=0;
}
public void promedio ( )
{
System.out.println(Calcular promedio);
System.out.println(Cantidad de unidades);
cant_unid=Integer.parseInt(lectura.readLine());
promedio=calificacin/cant_unid;}}
5.5 Definicin de herencia mltiple

A
C

C
(
)

D
A

13

PRODUCTOR

DIRECTOR

MAESTRO

AUX. SER. SOC

CANTANTE

AUTOR

PRODUCTOR/DIRECTOR

Actor AUX. SS/MAESTRO


Artista
Persona
CANTA/AUTOR

Distribuidor

(
)

14

Cantante

Agricultor

Comerciante/productor

Comerciante

Productor

5.6 Implementacin de herencia mltiple.

Analicemos un caso de implementacin en Java, basado en el esquema propuesto en la


Figura 4, donde suponemos la existencia de un mtodo denominado algo(), que es
redefinido para cada clase con distintos comportamientos.
(
)

15

Esquema de herencia mltiple con un mtodo redefinido en ambas ramas


class A {
public void algo() {
System.out.println("A");
}
}
class B extends A {
public void algo() {
super.algo();
System.out.println("B");
}
public void hace() {
System.out.println("Hace");
}
(
)

16

}
class C extends A {
public void algo() {
super.algo();
System.out.println("C");
}
public void otro() {
System.out.println("Otro");
}
}
class D extends C, B {
public void algo() {
super.hace();
super.otro();
System.out.println("D");
}
}

En el modelo aparecen tres conceptos fuertemente vinculados a las relaciones de


herencia: reusabilidad, redefinicin de mtodos y polimorfismo (Booch, 1994). El primero
de ellos debido a la reutilizacin del mtodo algo() de A, desde B y C. El segundo aparece
al redefinir la implementacin de algo() a travs de toda la jerarqua de clases, en B, C y
(
)

17

D. El tercero aparecer, al activar el mtodo antes mencionado para algn objeto de la


jerarqua, en cuyo caso se debe lanzar la ejecucin del mtodo que corresponda al objeto
referenciado en ese momento, de acuerdo al comportamiento que se espera por la
aplicacin del concepto de polimorfismo (Cardelli y Wegner, 1985).

La idea de polimorfismo se basa en ocultar bajo una interface comn, diferentes


implementaciones de mtodos. As si durante la ejecucin del programa en distintos
instantes de tiempo, por ejemplo con una variable del tipo A, se refieren objetos de las
clases A, B, C, D, para enviarles el mensaje algo(); en cada caso se activar la
implementacin del mtodo algo(), correspondiente a la clase a la que pertenece el objeto
referenciado por la variable en ese momento. Esto se debe a que la implementacin del
concepto de polimorfismo, se fundamenta en establecer vnculos dinmicos entre la
llamada a un mtodo y su respectiva implementacin. As la resolucin sobre cul
implementacin utilizar, se demora hasta el momento de la ejecucin, cuando se conoce la
clase a la que pertenece el objeto referenciado durante el envo de un mensaje.

Retomando el planteo realizado en el cdigo correspondiente a la Figura 4; el problema es


que Java no provee medios para implementar herencia mltiple, por esto el cdigo
provoca un error durante el proceso de compilacin, en el enunciado donde se indica que
D hereda de C y B; como consecuencia de esto las activaciones super.otro() y
super.hace() no son posibles.

La alternativa a lo anterior es simular el esquema de herencia mltiple propuesto. Esta


implementacin, tiene que realizarse respetando las caractersticas de reusabilidad,
redefinicin de mtodos y polimorfismo, que presenta el modelo originalmente propuesto.
Para llevar adelante esto, se aprovecha una caracterstica de Java, que permite
heredar en forma simultnea de una clase y una interface. Estrictamente, no se trata
de herencia mltiple, sino de heredar de una clase e implementar una o ms interfaces,
en las cuales por definicin todos los atributos son constantes y todos los mtodos son
abstractos (Cornell y Horstmann, 1996).
(
)

18

Simulacin de herencia mltiple


Mediante el uso de interfaces, en algunos casos, se pueden simular relaciones de
herencia mltiple en Java. En la Figura 5, se muestra cmo quedara el nuevo esquema de
relaciones entre clases.

Figura 5: Esquema de relaciones que implementan herencia mltiple en Java

En el diseo del modelo se han incorporado nuevos elementos. Aparece una interface iB,
que es implementada por las clases B y D. As, la relacin de herencia entre las clase D y
B del modelo original, se ha reemplazado por la implementacin de la interface comn iB,
por parte de las clases B y D, en tanto que D mantiene la relacin de herencia con C,
simulndose de esta forma la herencia mltiple de las clases B y C. Adems, se ha
incorporado una relacin de agregacin bidireccional entre las clases B y D. La necesidad
de esto ltimo resultar evidente ms adelante, por lo que en la primera versin que se
muestra, slo aparece implementada como una relacin unidireccional.
class A {
public void algo() {
System.out.println("A");
}
}
(
)

19

interface iB {
public void algo();
public void hace();
}
class B extends A implements iB {
public void algo() {
super.algo();
System.out.println("B");
}
public void hace() {
System.out.println("Hace");
}
}
class C extends A {
public void algo() {
super.algo();
System.out.println("C");
}
public void otro() {
System.out.println("Otro");
}
}
(
)

20

class D extends C implements iB {


private iB objBase = new B();
public void algo() {
objBase.hace();
super.otro();
System.out.println("D");
}
public void hace() {
objBase.hace();
}
}
El comportamiento polimrfico se debe preservar. Para garantizar esto en la interface iB
se han declarado todos los mtodos de acceso pblico que tiene B. Esto es necesario para
que el compilador genere cdigo para enlazar dinmicamente la implementacin de dichos
mtodos en las respectivas clases, con una llamada en el momento de la ejecucin. De no
hacerlo, enunciados como los siguientes provocan error:

iB obj;
if (alguna condicin) obj = new B();
else obj = new D();
obj.algo();

Si el mtodo algo() no se declara en la interface, como una variable del tipo iB puede
referenciar objetos de las clases B o D, la activacin del mtodo algo() sera invlida, ya
(
)

21

que el compilador no conocera el smbolo algo. En cambio, al declararlo en la interface,


an cuando no se conoce la clase de objeto referenciada por la variable obj, el cdigo se
puede compilar. El enlace de la llamada al mtodo con su implementacin, queda
demorado hasta el momento de la ejecucin.

Por la relacin de herencia entre C y D, cualquier modificacin en los mtodos de C, se


propaga a D. La implementacin debe producir el mismo efecto respecto de la relacin de
herencia entre B y D. Por otra parte, al declarar en la interface iB el mtodo hace(), se
obliga a tener que implementarlo en la clase D.

El concepto de herencia implica que un objeto de una clase derivada, es una forma ms
especializada de un objeto de la clase base de la cual deriva; esto hace que crear un
objeto de una subclase, requiera la creacin de un objeto (subobjeto) perteneciente a la
superclase (Budd, 2002). En Java esa es la funcin del mtodo super(), cuando se activa
desde el constructor de una clase derivada. Por lo tanto desde el punto de vista de cmo
es construido un objeto de una clase derivada, se puede decir que est compuesto por un
objeto (subobjeto) de la clase de la cual deriva. Es interesante observar que esto es as,
an cuando la clase de la cual se hereda sea abstracta. Por lo tanto la restriccin de no
poder crear objetos de una clase abstracta, no es aplicable para la construccin del
subojeto que forma parte de un objeto de una clase derivada.

Esto ltimo, produce una restriccin en el modelo presentado, ya que no es posible


simular herencia mltiple a partir de clases abstractas, debido a que no sera posible
crear el subobjeto necesario para simular el mecanismo de herencia.

En la clase D, el enunciado super.otro() del mtodo algo(), lo que hace es activar el


mtodo otro() correspondiente al objBase de la clase C, de la cual hereda. En la nueva
implementacin se debe simular un efecto similar, para la otra rama de herencia. Esto se
logra declarando el atributo privado objBase del tipo B, al cual se le asigna una
(
)

22

referencia a un objeto B, que se utilizar para sustituir la activacin super.hace() por


objBase.hace().

En el caso que D y B tuvieran constructores parametrizados para inicializar los objetos


que se creen, la asignacin a objBase de la referencia al objeto B, debera realizarse en
el constructor de D para simular el mismo efecto.

La declaracin de hace() en la interface iB, obliga a implementar el mtodo en D. En el


modelo original, como D no tiene definido el mtodo hace(), un objeto del tipo D
directamente heredara la implementacin desde B. La implementacin del mtodo hace()
en D, simula ese comportamiento. Esta es una tcnica de diseo de patrones
estructurales, conocida como Adaptadores o Wrappers (envolturas) (Gamma et al, 1995).

Estos patrones sirven para modificar el comportamiento de otra clase, operando como
una cobertura sobre la clase encapsulada, que es la que en realidad realiza el trabajo.

Los mismos pueden extender el comportamiento, modificar la interface o restringir el


acceso a una clase. En general su funcin es hacer de intermediarios entre dos interfaces
incompatibles, traduciendo las llamadas entre ellas.

Finalmente como se puede observar, cualquier modificacin que se realice en los mtodos
de la clase B, se va a propagar a la clase derivada D. La redefinicin de mtodos y el
comportamiento polimrfico, se garantizan a travs de la definicin de la interface iB, y
del uso de referencias a esta ltima, en lugar de hacerlo con B.

(
)

23

5.7 Reutilizacin de la definicin de paquetes/libreras.


El Java API (Application Program Interfase) es un conjunto de libreras que permiten el
desarrollo de aplicaciones en Java, brinda funciones de uso comn para el programador
como por ejemplo:

Creacin y manejo de elementos de GUI


Manejo de archivos
Funciones de red
Comunicacin entre programas

Existen dentro de su librera clases grficas (awt y swing), las cuales permiten crear
objetos grficos comunes altamente configurables y con una arquitectura independiente
de la plataforma.

Hay gran cantidad de herramientas para generar interfaces grficas como:

JBuilder
NetBeans
Fote4J
Jdeveloper
Eclipse

Se puede acceder a bases de datos fcilmente con JDBC, independientemente de la


plataforma utilizada.
Existen clases JDBC para las Bases de Datos ms comunes, entre ellas:

Oracle
PostgreSQL
MySQL

Herramientas del JDK


(
)

24

javac: El compilador Java, convierte cdigo fuente (.java) en bytecodes (.class)


java: El interprete de Java este programa es el que ejecuta los bytecodes
appletviewer: Un interprete Java que ejecuta applets desde un archivo HTML, tal
como lo hara un navegador web
javadoc: Genera documentacin de cdigo fuente en formato HTML
javap: El desensamblador Java, puede obtener el cdigo fuente a partir de lso
bytecodes
jdb: El depurador (debugger), permite supervisar la ejecucin de los programas
Java
jar: Permite almacenar un programa en Java que comprende muchos .class en un
solo archivo .jar (en realidad, es un .zip)

Compilacin y ejecucin.

Por ahora, digamos que cada clase debe estar definida en un archivo que debe llamarse
igual que la clase, con extensin .java
Es decir, la clase FiguraGeometrica debe declararse en un archivo llamado
FiguraGeometrica.java

/****************** HolaMundo.java******************/

class HolaMundo
{

public static void main (String args[])


{

System.out.println("Hola Mundo !");


}
}
(
)

25

/* HolaMundoApplet.java */
<HTML>
<HEAD>
<TITLE>Hello world</TITLE>
</HEAD>
<BODY>
<APPLET CODE="HolaMundoApplet.class
WIDTH=250 HEIGHT=100>
</APPLET>
</BODY>
</HTML>

/********************* FiguraGeometrica.java *********************/


public class FiguraGeometrica {
protected int numeroLados;
protected String nombreFigura;
public FiguraGeometrica(int nLados) {
numeroLados = nLados;
}
public int getNumeroLados() {
return numeroLados;
}
public String getNombreFigura() {
return nombreFigura;
}
}
(
)

26

Cuando esta clase se compile, se crear un archivo llamado FiguraGeometrica.class

Si el nombre del archivo .java no coincidiera con el nombre de la clase, el compilador de


Java no mostrara un mensaje de error (no en todos los casos, ms adelante veremos):
OtroNombre.java:2: class FiguraGeometrica is public, should be declared in a file named
FiguraGeometrica.java

Ahora veamos un par de ejemplos, una con salida por consola y otro mostrando un cuadro
de dilogo:

import javax.swing.*;
public class FiguraGeometricaFrame
{
public static void main(String[] args)
{
FiguraGeometrica figura = new FiguraGeometrica(6);
JOptionPane.showMessageDialog(null, "El numero de lados+
de la figura geomtrica es: "+
figura.getNumeroLados());
System.exit(0);
}
}
(
)

27

(
)

28

S-ar putea să vă placă și