You are on page 1of 34

Universidad Privada San Pedro Taller De Programacin I

Ing. Carlos Alberto Zelada Chvez 1


HERENCIA
TEMA 2

CAPACIDADES
Conocer la propiedad de la orientacin a objetos:
Herencia.
Especificar jerarqua de clases.
Determinar las diferencias entre Herencia Simple y
Herencia Mltiple
Desarrollar aplicaciones en Java de problemas con
orientacin a objetos: Uso de Herencia.

Herencia. Definicin
La Herencia es la relacin que existe entre dos clases, en la
que una clase derivada se crea a partir de otra ya existente,
denominada clase base
Es un Mecanismo exclusivo y fundamental de la
Programacin Orientada a Objetos. Es el principal mecanismo
que ayuda a fomentar y facilitar la reutilizacin del software



Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 2

Herencia. Definicin
La relacin de herencia se establece entre una nueva clase
(referida aqu con el nombre Nueva) y una clase ya existente
(referida aqu con el nombre Existente).
Exi st en t e
N ue va


Herencia. Definicin
La relacin de herencia se establece entre una clase Nueva y una clase
Existente.
Sobre la clase que hereda de la existente:
Nueva hereda todas las caractersticas de Existente.
Nueva puede definir caractersticas adicionales.
Nueva puede redefinir caractersticas heredadas de Existente.
El proceso de herencia no afecta de ninguna forma a la superclase
Existente.
Para que una nueva clase sea subclase de otra existente basta con
aadir extends existente a continuacin del nombre de la nueva:


Herencia. Definicin
public class Nueva extends Existente
{
.....
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 3
Tipos de Herencia.
HERENCIA SIMPLE
es un tipo de herencia en la que una clase hereda el
estado (estructura) y el comportamiento de una sola clase
base. Es decir hay herencia simple cuando una clase
hereda de una sola clase base.
Publicacion
Revista Libro



Tipos de Herencia.
HERENCIA MULTIPLE
Es un tipo de herencia en la que una clase hereda el estado
(estructura) y el comportamiento de ms de una clase base.
Java no ha desarrollado la herencia mltiple, slo permite la
herencia de una sola clase base. En casos especiales es posible
simular herencia mltiple con las interfaces.


Ejemplo Herencia Mltiple
P e rs o n a
Es tu d i a n te P r o fe s o r
E s tu d i a n te D o cto ra d o
P ro fe s o r Ayu d a n te


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 4
Herencia. Implementacin Java
Public class Empleado{
protected String codigo;
protected String apell, nomb, cargo;
protected double sueldo;
public Empleado(String ncod, String nape, String nnom, String ncar,
double nsuel)
{ codigo=ncod; apell=nape;
nomb=nnom; cargo=ncar;
sueldo=nsuel;
}


Herencia. Implementacin Java.
public void aumentasueldo(double porcentaje)
{
sueldo+=sueldo*porcentaje*100;
}
public String toString()
{
return apell+nomb;
}
}


Herencia. Implementacin Java.
public class Ejecutivo extends Empleado
{
double presupuesto;
public Ejecutivo(String ncod, String nap, String nno, String ncar, double
nsuel, double npres)
{
super(ncod, nap, nno, ncar, nsuel, npres);
this.presupuesto=npres;
}
public void asignapres(double p)
{ presupuesto=p;
}
}



Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 5

Herencia. Implementacin Java
........
Ejecutivo jef=new Ejecutivo(111,Juan, Perez, jefe
logstica, 2000, 30000);
jef.aumentasueldo();
........
.......


Categora protected:
El especificador de acceso protected es equivalente al
especificador private con el agregado de que los
atributos protegidos de una clase base son accesibles
para los miembros de cualquier clase derivada de esa
clase.


Control de acceso a los miembros de las clases

Un miembro declarado en una clase como


Puede ser accesado desde:
privado predeterminado protegido pblico

Su misma clase.................................

si

si

si

si
Cualquier clase o subclase del mismo
paquete ............................................

no

si

si

si

Cualquier otra clase de otro paquete

no

no

no

si

Cualquier subclase de otro paquete

no

no

si

si



Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 6

Herencia y Constructores
Los constructores de la clase base se invocan antes del
constructor de la clase derivada.
Si una clase base, es a su vez una clase derivada, sin
constructores se invocan tambin en secuencia: constructor
base, constructor derivada.
Los constructores no se heredan aunque los constructores por
defecto se generan si se requiere.


Jerarqua de Clases


La clase Object
Object es la raiz de la jerarqua de herencia (de implementacin)
en Java
Object define un conjunto de mtodos tiles, que pueden ser
redefinidos en cada clase


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 7

Mtodos de la clase clase Object
public boolean equals(Object o): Permite definir el
criterio de igualdad utilizado para los objetos de una
determinada clase (el operador == nicamente chequea la
igualdad de referencias).
public String toString(): Permite decidir la representacin
externa de un objeto. Por defecto es el valor de su
referencia, etiquetada con el nombre de la clase.
protected Object clone() throws
CloneNotSupportedException : devuelve una copia del
objeto si la clase implementa la interfaz Cloneable.


Mtodos de la clase clase Object
public final Class getClass(): clase que representa el tipo
del objeto.
protected void finalize() throws Thorowable: (relacionado
con liberar memoria)


Ejemplo. Mtodos clase Object
class Punto implements Cloneable
{ private int x,y;
public Punto(int a, int b)
{
x=a;
y=b;
}
public Punto()
{
x=0;
y=0;
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 8
Ejemplo. Mtodos clase Object
public Object clone()
{ Object obj=null;
try {
obj=super.clone();
}
catch(CloneNotSupportedException ex) {
System.out.println("no se puede duplicar.."); }
return obj;
}
public void trasladar (int dx, int dy)
{ x=x+dx;
y=y+dy;
}


Ejemplo. Mtodos clase Object
public String toString()
{
String texto="origen: ("+x+", "+y+")";
return texto;
}
protected void finalize() throws Throwable
{
System.out.println("Finalizando objetos...");
}
}


Ejemplo. Mtodos clase Object
public class TestP
{
public static void main(String[]args)throws IOException
{
int wa, wb;
String temp;
BufferedReader br=new BufferedReader(new
InputStreamReader(System.in));
PrintStream sal=System.out;
sal.println("Ingrese valor x:");
temp=br.readLine();
wa=Integer.parseInt(temp);



Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 9

Ejemplo. Mtodos clase Object
sal.println("Ingrese valor y: ");
temp=br.readLine();
wb=Integer.parseInt(temp);
Punto p1=new Punto(wa,wb);
temp=p1.toString();
sal.println(temp);
p1.trasladar(5,5);
temp=p1.toString();
sal.println(temp);


Ejemplo. Mtodos clase Object
sal.println("segundo objeto2");
Punto p2= (Punto) p1.clone();
temp=p2.toString();
sal.println(temp);
if (p1.equals(p2))
{
sal.println("Objetos iguales..");
}
else
{
sal.println("Objetos Diferentes.....");
}


Ejemplo. Mtodos clase Object
p1=null;
p2=null;
// Ejecutar el recolector de basura
Runtime runtime = Runtime.getRuntime();
runtime.gc();
runtime.runFinalization();
}
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 10

Java - Herencia
APLICACIN DESARROLLADA


Enunciado aplicacin Herencia
Elabore una aplicacin java que implemente
herencia de figuras geomtricas (cuadrado,
tringulo y crculo). Implementar mtodos y
botones para calcular el rea y dibujar el objeto
correspondiente.


Pasos
1. Disee la interfaz visual.


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 11

Pasos


Pasos


2. Escribir atributos y mtodos de la clase Figura
public class Figura
{ protected String nombre;
protected double area;
public Figura(String xno) { nombre=xno; }
public String getnonbre() { return "Soy un "+nombre; }
public double getarea() { return area; }
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 12

3. Escribir atributos y mtodos de la clase Poligono
public class Poligono extends Figura
{ protected double largo,ancho;
public Poligono(String xn, double a, double b)
{
super(xn);
largo=a;
ancho=b;
}
public double getlar() { return largo; }
public double getan() { return ancho; }
}


4. Escribir atributos y mtodos de la clase Circulo
public class Circulo extends Figura
{
private double radio;
public Circulo(double ra)
{ super("circulo");
radio=ra; }
public void areacir()
{ area=3.1415*radio*radio; }
public void dibujacir(Graphics g)
{ int xl, xa; int tx=(int)radio; int ty=(int)radio;
g.drawOval(300,200,tx,tx);
}
}


5. Escribir atributos y mtodos de la clase Cuadrado
public class Cuadrado extends Poligono {
public Cuadrado(double m)
{
super("cuadrado",m,m);
}
public void areacuad() { area=largo*ancho; }
public void dibujacuad(Graphics g)
{
int xl, xa; xl=(int)largo;
g.drawLine(300,200,300+xl,200);
g.drawLine(300+xl,200,300+xl,200+xl);
g.drawLine(300+xl,200+xl,300,200+xl);
g.drawLine(300,200+xl,300,200); }
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 13

6. Escribir atributos y mtodos de la clase Triangulo
public class Triangulo extends Poligono
{
public Triangulo(double p, double q)
{ super("triangulo",p,q); }
public void areatrian()
{ area=0.5*largo*ancho; }
public void dibujatrian(Graphics g)
{
int xl, xa; xl=(int)largo; xa=(int)ancho;
g.drawLine(300,200,300+xl,200);
g.drawLine(300+xl,200,300+xl,200+xl);
g.drawLine(300+xl,200+xl,300,200); }
}


7. Definicin de Objetos
En la clase Frame1 definir los siguientes objetos:
Cuadrado c1;
Triangulo t1;
Circulo cir;


8. Codificar botones
void jButton1_actionPerformed(ActionEvent e)
{
double xa;
Graphics g=getGraphics();
xa=Double.valueOf(txtlado.getText()).doubleValue();
c1=new Cuadrado(xa);
salida.append(""+c1.getnonbre());
c1.areacuad();
salida.append("\nArea Cuadrado: "+c1.getarea());
c1.dibujacuad(g);
}


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 14

8. Codificar botones
void jButton2_actionPerformed(ActionEvent e)
{
txtlado.setText("");
salida.setText("");
}
void jButton3_actionPerformed(ActionEvent e)
{
double xa,xb;
Graphics g=getGraphics();
xa=Double.valueOf(txtbase.getText()).doubleValue();
xb=Double.valueOf(txtaltura.getText()).doubleValue();
t1=new Triangulo(xa,xb);
salida1.append(""+t1.getnonbre());
t1.areatrian();
salida1.append("\nArea Triangulo: "+t1.getarea());
t1.dibujatrian(g);
}


8. Codificar botones
void jButton4_actionPerformed(ActionEvent e) {
txtbase.setText("");
txtaltura.setText("");
salida1.setText("");
}
void jButton5_actionPerformed(ActionEvent e)
{
double xra;
Graphics g=getGraphics();
xra=Double.valueOf(txtradio.getText()).doubleValue();
cir=new Circulo(xra);
salida2.append(""+cir.getnonbre());
cir.areacir();
salida2.append("\nArea Circulo: "+cir.getarea());
cir.dibujacir(g);
}


Ejecucin


Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 15

Ejecucin


Ejecucin



HERENCIA-COMPOSICION
TEMA 3

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 16


Relaciones entre clases
Un conjunto de objetos aislados tiene escasa
capacidad para resolver un problema. En una
aplicacin til los objetos colaboran e intercambian
informacin, mantienen distintos tipos de relaciones
entre ellos
A nivel de diseo, podemos distinguir entre 5 tiposde
relaciones bsicas entre clases de objetos:
dependencia, asociacin, agregacin, composicin y
herencia*



Dependencia
La dependencia es la relacin menos importante.
Simplemente refleja que entre dos clases de objetos
existe una posible colaboracin temporal con algn
propsito
Una dependencia puede indicar la utilizacin de un
objeto de una clase como argumento de una
operacin de otra o en su implementacin
Como vimos anteriormente, la clase Cuenta requiere
las clases FileOutputStream y ObjectOutputStream
de la librera de clases de Java para la
implementacin de la operacin salvar

Asociacin
En cambio, la asociacin es la relacin ms importante y
ms comn. Refleja una relacin entre dos clases
independientes que se mantiene durante la vida de los
objetos de dichas clases o al menos durante un tiempo
prolongado
En UML suele indicarse el nombre de la relacin, el
sentido de dicha relacin y las cardinalidades en los dos
extremos
Vamos a sustituir el atributo titular por una asociacin con
una nueva clase Cliente completa

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 17

Asociacin
Una asociacin se implementa en Java introduciendo
referencias a objetos de la clase destino de la relacin
como atributos de la clase origen
Si la relacin tiene una cardinalidad superior a uno
entonces ser necesario utilizar un array o una estructura
de datos dinmica del paquete java.util como Vector o
LinkedList
Normalmente la conexin entre los objetos se realiza
recibiendo la referencia de uno de ellos en el constructor
u otra operacin similar del otro


Ejemplo Asociacin
public class Cliente {
String nombre, apellidos;
String direccion, localidad;
String fNacimiento;
Cliente (String aNombre, String aApellidos, String aDireccion,
String aLocalidad, String aFNacimiento) {
nombre = aNombre;
apellidos = aApellidos;
direccion = aDireccion;
localidad = aLocalidad;
fNacimiento = aFNacimiento;
}
String nombreCompleto () { return nombre + + apellidos; }
String direccionCompleta () { return direccion + , + localidad; }
}



Ejemplo de Asociacin
public class Cuenta {
long numero;
Cliente titular;
private float saldo;
float interesAnual;
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float
aInteresAnual) {
numero = aNumero;
titular = aTitular;
saldo = 0;
interesAnual = aInteresAnual;
}
Cliente leerTitular () { return titular; }
// Resto de operaciones de la clase Cuenta a partir de aqu

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 18

Agregacin
La agregacin es un tipo especial de asociacin donde
se aade el matiz semntico de que la clase de donde
parte la relacin representa el todo y las clases
relacionadas las partes.
Realmente Java y la mayora de lenguajes orientados a
objetos no disponen de una implementacin especial
para este tipo de relaciones. Bsicamente se tratan
como las asociaciones ordinarias


Composicin
La composicin es un tipo de agregacin que aade el
matiz de que la clase todo controla la existencia de las
clases parte. Es decir, normalmente la clase todo
crear al principio las clases parte y al final se
encargar de su destruccin
Supongamos que aadimos un registro de movimientos
a la clase Cuenta, de forma que quede constancia tras
cada ingreso o reintegro



Composicin
Las composiciones tienen una implementacin similar a
las asociaciones, con la diferencia de que el objeto
principal realizar en algn momento la construccin de
los objetos compuestos
import java.util.Date
class Movimiento {
Date fecha; char tipo;
float importe; float saldo;
public Movimiento (Date aFecha, char aTipo, float aImporte, float
aSaldo) {
fecha = aFecha; tipo = aTipo;
importe = aImporte; saldo = aSaldo;
}
}

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 19


Composicin
public class Cuenta {
long numero;
Cliente titular;
private float saldo;
float interesAnual;
LinkedList movimientos; // Lista de movimientos
// Constructor general
public Cuenta (long aNumero, Cliente aTitular, float aInteresAnual)
{
numero = aNumero; titular = aTitular; saldo = 0; interesAnual = aInteresAnual;
movimientos = new LinkedList ();
}
.


Composicin
// Continua clase Cuenta
// Nueva implementacin de ingreso y reintegro
public void ingreso (float cantidad) {
movimientos.add (new Movimiento (new Date (), 'I', cantidad, saldo +=
cantidad));
}
public void reintegro (float cantidad) {
movimientos.add (new Movimiento (new Date (), 'R', cantidad, saldo -=
cantidad));
}
public void ingresoInteresMes () { ingreso (interesAnual * saldo / 1200); }
// Resto de operaciones de la clase Cuenta a partir de aqu
..
}


CLASES ABSTRACTAS
HERENCIA MULTIPLE
INTERFACES
TEMA 4

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 20


Clases Abstractas
Clases abstractas:
Clases de las que no tiene sentido crear Objetos, pero que
agrupan caractersticas de clases que derivan de ellas.
Ejemplo:
Clase LavadoraMX, no tiene sentido que existan
objetos (lavadoras) de esta clase:
existen lavadoras MX1, MX2 y MX3deLuxe.
La finalidad de LavadoraMX es definir los aspectos
comunes a todos los modelos de lavadoras que se
fabrican.
Ejemplo:
Por la carretera no circulan Vehculos en abstracto,
circulan Coches, Camiones, Bicicletas, etc...


Clases Abstractas (Java)
En Java se puede indicar explcitamente que una
clase es abstracta y no se pueden crear objetos de
ella:
abstract class LavadoraMX {
//...
}
abstract class Vehiculo {
//...
}


Mtodos Abstractos
Las clases abstractas pueden (y suelen) incluir mtodos
sin implementacin, son los llamados mtodos
abstractos.
Mtodos abstractos:
Mtodos que no tienen implementacin y que obligan a ser
implementados en las clases derivadas.
Si una clase posee un mtodo abstracto es clase
abstracta:
Si una clase deriva de una clase abstracta y no implementa alguno
de los mtodos abstractos de la clase base, entonces hereda el
mtodo abstracto y se convierte en abstracta:
Para poder crear objetos hay que implementar todos los mtodos
abstractos heredados.

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 21


Clases Abstractas: Ejemplo
Figura
_nombre
<<abstract>> area()
<<abstract>> dibujar()
menorQue()
toString()
Circulo
_radio
area()
dibujar()
Rectangulo
_base
_altura
area()
dibujar()
Cuadrado


Clase Figura
abstract class Figura {
private String _nombre;
abstract public double area ();
abstract public void dibujar ();
public Figura (String nombreFigura) {
_nombre = nombreFigura;
}
public boolean menorQue (Figura f) {
return ( this.area() < f.area() );
}
public String toString () {
return ( _nombre + " , " + area() );
}
}
No es posible crear
Objetos de esta clase
No es posible crear
Objetos de esta clase
Mtodo sin implementacin
Mtodo sin implementacin
Figura
_nombre
<<abstract>> area()
<<abstract>> dibujar()
menorQue()
toString()


Clase Circulo
class Circulo extends Figura
{
private double _radio;
private static final double PI = 3.1415926535879;
public Circulo (double r) {
super ("Circulo");
_radio = r;
}
public Circulo () {
this (10.0);
}
public double area () {
return ( PI * _radio * _radio );
}
public void dibujar () {
System.out.println ("Soy un Circulo de radio: " + _radio);
}
}
Los mtodos abstractos han sido
implementados:
Es posible crear objetos Circulo
Los mtodos abstractos han sido
implementados:
Es posible crear objetos Circulo
Construye la parte heredada de Figura,
NO un objeto especfico
Construye la parte heredada de Figura,
NO un objeto especfico
Circulo
_radio
area()
dibujar()

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 22


Clase Rectngulo
class Rectangulo extends Figura
{
private double _base;
private double _altura;
public Rectangulo (double ancho, double alto) {
super ("Rectangulo");
_base = ancho;
_altura = alto;
}
public Rectangulo () {
this (10.0, 10.0);
}
public double area () {
return ( _base * _altura );
}
public void dibujar () {
System.out.println ("Soy un Rectangulo de: " + _base +
"*" + _altura);
}
}
Los mtodos abstractos han sido
implementados:
Es posible crear objetos Rectangulo
Los mtodos abstractos han sido
implementados:
Es posible crear objetos Rectangulo
Construye la parte heredada de Figura,
NO un objeto especfico
Construye la parte heredada de Figura,
NO un objeto especfico
Rectangulo
_base
_altura
area()
dibujar()


Clase Cuadrado
class Cuadrado extends Rectangulo
{
public Cuadrado (double lado) {
super (lado, lado);
}
public Cuadrado () {
super (10.0, 10.0);
}
}
Deriva de Rectangulo que no tiene
mtodos abstractos:
Es posible crear objetos Cuadrado
Deriva de Rectangulo que no tiene
mtodos abstractos:
Es posible crear objetos Cuadrado
Cuadrado


Ejemplo de utilizacin de la jerarqua de Figuras
class testfiguras {
public static void main (String[] args) {
Figura[] fig = new Figura[3];
int menor;
fig[0] = new Circulo();
fig[1] = new Cuadrado(55);
fig[2] = new Rectangulo(20,30);
for (int i=0; i<fig.length; i++) {
System.out.println (fig[i]);
System.out.println ("Area: " + fig[i].area());
System.out.println ("Dibujar:");
fig[i].dibujar();
}
if ( fig[0].menorQue (fig[1]) ) menor = 0;
else menor = 1;
if ( fig[2].menorQue (fig[menor]) ) menor = 2;
System.out.println ("La figura menor es:");
System.out.println (fig[menor]);
}
}
Array de 3 Figuras (no crea objetos)
Array de 3 Figuras (no crea objetos)
Se crean 3 Figuras concretas y se
almacenan en el array
Se crean 3 Figuras concretas y se
almacenan en el array
fig[i] aplica los mtodos de su clase :
Circulo, Cuadrado, Rectangulo

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 23


Mtodos finales
En ocasiones interesa indicar que un determinado
mtodo no se puede redefinir Mtodo final
final public boolean menorQue (Figura f) {
return ( this.area() < f.area() );
}
Las clases derivadas NO pueden redefinir menorQue
Ojo: redefinir implica mantener la signatura del mtodo.
Los mtodos finales tienen ligadura esttica
(compilacin).


Clases finales
Se puede prohibir que una clase sea extendida
declarndola como final.
final class Cuadrado extends Rectangulo
{
public Cuadrado (double lado) {
super (lado, lado);
}
public Cuadrado () {
super (10.0, 10.0);
}
}
No es posible definir una nueva clase que derive de Cuadrado


Concepto: Una clase puede derivarse de varias clases
base.
Un EstudianteQueTrabaja es un Estudiante y
es un Empleado
Herencia mltiple
Persona
Estudiante
Empleado
EstudianteQueTrabaja
Herencia Simple
Herencia Simple
Herencia Mltiple
Herencia Mltiple
2, 3, 4, ...
2, 3, 4, ...

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 24


Herencia mltiple: Conflictos (1)
Persona
nombre
Estudiante
Empleado
EstudianteQueTrabaja
Hereda nombre
Hereda nombre
Hereda 2 nombres?


Herencia mltiple: Conflictos (2)
Persona
nombre
toString()
Estudiante
toString()
Empleado
<<final>> toString()
EstudianteQueTrabaja
Redefine toString() para
incluir informacin sobre
los estudios
toString() identico al
de Persona pero
declarado como final
Hereda toString() cul?
Estudiante? Empleado?


Herencia mltiple
No siempre es problemtica, pero se procura evitar,
en la medida de los posible.
Hay lenguajes O.O. que directamente no la soportan:
Java, Smalltalk.
Otros lenguajes O.O. s que la admiten:
C++.

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 25


Ejemplo Herencia Mltiple


Interfaces
Una interface en Java es una coleccin de definiciones
de mtodos (sin implementacin) y de valores
constantes
Una interface es anlogo a una clase abstracta con
todos sus mtodos abstractos y variables finales y
estticas con valor inicial.
Una clase A puede heredar de una sola clase
(extends<<>>herencia simple) y puede heredar de
varias interfaces (implements <<>>herencia mltiple).
Ambigedades no permitidas en herencia de variables
(en general Java no resuelve por s mismo las
ambigedades en ningn caso)
Todas las interfaces descienden de Object
No se permiten ciclos en el grafo de clases e interfaces


Interfaces en Java
Cmo definir una interfaz?
[public] interface nombre_interfaz extends superinterfaces
{
cuerpo interfaz
}
- Si el modificador de acceso public no est presente,
la interfaz es slo accesible en el paquete al cual
pertenece
- El cuerpo de la interfaz puede incluir declaracin de
constantes y de mtodos (sin definicin).

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 26


Interfaces de JAVA
- Una interfaz puede derivarse de varias interfaces. En
este caso hereda todas las constantes y mtodos de sus
superinterfaces, excepto aquellos que ella redefina.
}


import java.util.*;
// Interfaz IFecha: mtodos y constantes para obtener el da,
//mes y ao
public interface IFecha
{
public final static int DIA_DEL_MES = Calendar.DAY_OF_MONTH;
public final static int MES_DEL_AO = Calendar.MONTH;
public final static int AO = Calendar.YEAR;
public abstract int da();
public abstract int mes();
public abstract int ao();
}
Ejemplo Interface Java


public class CCuentaAhorro extends CCuenta implements
IFecha
{
....
public void comisiones()
{ // Se aplican mensualm.por el mantenimiento de la cuenta
if (da() == 1) reintegro(cuotaMantenimiento);
}
public double intereses()
{
if (da() != 1) return 0.0;
// Acumular los intereses por mes slo los das 1 de cada mes
double intProducidos = 0.0;
intProducidos= estado() * obtenerTipoDeInters()/12;
ingreso(intProducidos);
// Devolver el inters mensual por si fuera necesario
return interesesProducidos;
}

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 27


// Implementacin de los mtodos de la interfaz //IFecha
public int dia()
{
GregorianCalendar fechaActual = new GregorianCalendar();
return fechaActual.get(DIA_DEL_MES);
}
public int mes() { return 0;} // no se necesita
public int ao() { return 0;} // no se necesita
}
Ejemplo Interface Java


Cada clase que implemente una interfaz, debe
definir todos los mtodos de sta ltima.
Notar que el acceso a las constantes
definidas en la interfaz es directo.
Si una clase implementa una interfaz, todas
sus subclases heredan los mtodos y constantes
de aquella.
Ejemplo Interface Java


Clase Object Clase Object
Clase CCuenta Clase CCuenta
Clase CcuentaCorriente Clase CcuentaCorriente
Clase CcuentaCorrienteConIn Clase CcuentaCorrienteConIn
Interfaz IFecha Interfaz IFecha
Clase CCuentaAhorro Clase CCuentaAhorro
Jerarqua de Clases

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 28


Clase abstracta vs interfaz
Es equivalente una interfaz a una clase
abstracta?
Ejemplo: la interfaz IFecha se podra definir
como una clase abstracta?
No, pues CCuentaAhorro y CCuentaCorriente ya
tienen una superclase.
Mas an, la idea es que la interaccin con
GregorianCalendar no requiere establecer una
relacin de clases. Slo se utiliza la interfaz para
implementar uno o dos mtodos especficos.
Una interfaz es slo un protocolo que implementa
una clase cuando necesita usarlo.



Para qu se usa una interfaz?
1 Para captar similitudes entre clases no
relacionadas, sin forzar una relacin artificial.
2 Para declarar mtodos que una o mas clases
deben implementar en determinadas situaciones.
3 Publicar la interfaz de programacin de una
clase, sin descubrir como esta implementada.

POLIMORFISMO
TEMA 5

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 29


Concepto de Polimorfismo
El Polimorfismo permite que diferentes objetos
respondan de modo diferente al mismo mensaje. El
Polimorfismo adquiere su mxima potencia cuando
se utiliza en unin de la Herencia.
El sentido del polimorfismo es realizar una
generalizacin, olvidar los detalles concretos de uno
o varios objetos de distintas clases y buscar un punto
comn a todos ellos en un ancestro




Generalidades de Polimorfismo
public class AppGestorTareas
{
public static void main (String[] args) {
TPReloj tpr = new TPReloj ();
TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);
TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);
TareaPeriodica tp;
tp = tpr;
tp.desactivar ();
tp = tpa;
tp.desactivar ();
tp = tpe;
tp.desactivar ();
}
}

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 30


Generalidades de Polimorfismo
La mayora de las veces, las conexiones polimorfas
se realizan de manera implcita en el paso de
argumentos a una operacin. De esta manera es
posible escribir operaciones polimorfas que reciban
objetos de mltiples clases.


Generalidades de Polimorfismo
public class AppGestorTareas {
private static void esperarEjecutar (TareaPeriodica tp)
{
while (!tp.necesitaEjecucion ());
tp.ejecutarTarea ();
}
public static void main (String[] args) {
TPReloj tpr = new TPReloj ();
TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);
TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);
esperarEjecutar (tpr);
esperarEjecutar (tpa);
esperarEjecutar (tpe);
}
}


Generalidades de Polimorfismo
Otra aplicacin muy til es la construccin de
estructuras de datos que puedan mantener objetos
de distintas clases
Vamos a implementar una nueva clase GestorTareas
que va a contener una lista de tareas a realizar. La
llamada a chequearEjecutar realizar la
comprobacin y ejecucin de las tareas que lo
requieran

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 31


Generalidades de Polimorfismo
Pero siempre debe quedar claro que tras la
conexin polimorfa nicamente podemos acceder a
las operaciones pertenecientes a la clase asociada
a la referencia.
El resto de operaciones del objeto no son
accesibles a travs de esta referencia


Generalidades de Polimorfismo
public class AppGestorTareas {
public static void main (String[] args) {
TPReloj tpr = new TPReloj ();
TareaPeriodica tp;
tp = tpr;
tp.desactivar (); // Ok
tp.leerHora () // Error !!
tpr.leerHora (); // Ok
}
}


Generalidades de Polimorfismo
En Java, una referencia a Object puede ser conectada
a cualquier objeto, puesto que como sabemos es
un ancestro de todas las clases
public class AppGestorTareas
{
public static void main (String[] args) {
TPReloj tpr = new TPReloj ();
Object o;
o = tpr;
System.out.println (o.getClass ().getName ());
}
}

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 32


Generalidades de Polimorfismo
Adems, las interfaces implementadas por una
clase tambin pueden ser utilizadas para realizar
conexiones polimorfas. Es decir, las interfaces que
implementa una clase se comportan igual que las
superclases en lo que respecta al uso del
polimorfismo


Ligadura Esttica
Entendemos por resolucin de una llamada el
proceso por el cual se sustituye una llamada a una
funcin por un salto a la direccin que contiene el
cdigo de esta funcin
Normalmente, la resolucin de llamadas se realiza
en en tiempo de compilacin, porque resulta ms
sencillo y sobre todo ms eficiente. Cuando la
aplicacin se est ejecutando, las llamadas ya
estn preparadas.
Este enfoque se denomina ligadura esttica


Ligadura Dinmica
El problema aparece en OOP cuando realizamos una
conexin polimorfa y llamamos a una operacin
redefinida

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 33


Ligadura Dinmica
El compilador no tiene informacin para resolver la
llamada. Por defecto utilizara el tipo de la referencia, y por
tanto generara una llamada a la implementacin de f () en
la clase A
Pero la referencia r puede apuntar a objetos de las
clases A, B o C, con distintas versiones de f ()
La solucin consiste en esperar a resolver la llamada al
tiempo de ejecucin, cuando se conoce realmente los
objetos conectados a r, y cul es la versin de f ()
apropiada. Este enfoque de resolucin de llamadas se
denomina ligadura dinmica y es mucho ms lenta y
compleja que la esttica


Ligadura Dinmica
Por tanto, la ligadura dinmica, por defecto en Java,
garantiza siempre la llamada a la versin correcta de
cada funcin, con independencia del uso de
conexiones polimorfas o no
Las llamadas a la funcin ejecutarTarea se resuelven
correctamente, a pesar de realizarse a travs de una
referencia a TareaPeriodica


Ligadura Dinmica
..
public class AppGestorTareas {
public static void main (String[] args) {
TPReloj tpr = new TPReloj ();
TPAviso tpa = new TPAviso (Ha pasado un minuto, 60);
TPEjecucion tpe = new TPEjecucion (/bin/sync, 120);
TareaPeriodica tp;
tp = tpr;
tp.ejecutarTarea (); // Versin de TPReloj
tp = tpa;
tp.ejecutarTarea (); // Versin de TPAviso
tp = tpe;
tp.ejecutarTarea (); // Versin de TPEjecucion
}
}

Universidad Privada San Pedro Taller De Programacin I


Ing. Carlos Alberto Zelada Chvez 34


Ligadura Dinmica frente a
Ligadura Esttica
Ligadura dinmica o postergada (tarda) se produce cuando un
mtodo polimrfico se define para clases diferentes de una
familia pero el cdigo real del mtodo no se conecta o enlaza
hasta el tiempo de ejecucin.
La ligadura dinmica se implementa normalmente en Java
mediante mtodos abstractos que se deben de redefinir en las
clases derivadas. Con ligadura dinmica, la seleccin del
cdigo a ejecutar cuando se llama al mtodo se retrasa hasta
el tiempo de ejecucin.
Los mtodos abstractos son polimrficos y por consiguiente
tienen diferentes implementaciones para clases diferentes de
la familia


Ligadura Dinmica frente a
Ligadura Esttica
La Ligadura esttica se produce cuando se define un mtodo
polimrfico para diferentes clases de una familia y el cdigo
real del mtodo se conecta o enlaza en tiempo de compilacin.
Los mtodos sobrecargados se enlazan estticamente.
La ligadura esttica se produce cuando el cdigo del mtodo
se enlaza en tiempo de compilacin. Esto significa que cuando
se llama a un mtodo, el compilador determina en tiempo de
compilacin cual es la versin del mtodo a llamar.
Con los mtodos sobrecargados, el compilador puede
determinar cual es el mtodo a llamar basado en el nmero y
tipo de datos de los parmetros del mtodo


Ventajas del Polimorfismo
El polimorfismo hace un sistema mas flexible, sin perder ninguna
de las ventajas de la compilacin esttica de tipos que tienen
lugar en tiempo de compilacin. Este es el caso de Java.
Aunque existe menos libertad, el Polimorfismo en Java es una
herramienta muy potente y que puede ser utilizada en muchas
situaciones diferentes. Las aplicaciones ms frecuentes del
polimorfismo son:
_ Especializacin de clases derivadas
_ Estructuras de datos heterogneas
_ Gestin de una jerarqua de clases.