Académique Documents
Professionnel Documents
Culture Documents
TEMA 3
ndice
1.- Introduccin 2.- Poligono y Rectangulo - Herencia y Ocultamiento de Informacin - Redefinicin de caractersticas: refinamiento vs. reemplazo - Herencia y creacin 3.- Polimorfismo 4.- Herencia y Sistema de tipos 5.- Genericidad
- Estructuras de datos polimrficas - Genericidad restringida
1.-Introduccin
Las clases no son suficientes para conseguir los objetivos de: (A) REUTILIZACIN Necesidad de mecanismos para generar cdigo genrico:
Capturar aspectos comunes en grupos de estructuras similares Independencia de la representacin Variacin en estructuras de datos y algoritmos
Introduccin
Entre algunas clases pueden existir relaciones conceptuales: Extensin, Especializacin, Combinacin
EJEMPLO: Libros y Revistas tienen propiedades comunes Una pila puede definirse a partir de una cola o viceversa Un rectngulo es una especializacin de polgono Una ventana de texto es un rectngulo dnde se manipula texto
Herencia
soporte para registrar y utilizar estas relaciones posibilita la definicin de una clase a partir de otra
Tema3: Herencia 4
No es tan solo un mecanismo para compartir cdigo. Consistente con el sistema de tipos del lenguaje
Tema3: Herencia 5
Introduccin
Puede existir una clase raz en la jerarqua de la cual heredan las dems directa o indirectamente. Incluye todas las caractersticas comunes a todas las clases En Java esta clase es la clase Object
equals clone toString
Tema3: Herencia
Introduccin
Si B hereda de A entonces B incorpora la estructura (atributos) y comportamiento (mtodos) de la clase A, pero puede incluir adaptaciones:
-B puede aadir nuevos atributos -B puede aadir nuevos mtodos -B puede REDEFINIR mtodos Refinar: Extender el uso original Reemplazar: Mejorar la implementacin -B puede implementar un mtodo abstracto en A
Tema3: Herencia
Tipos de herencia
A B D B A E C C Herencia simple
Una clase puede heredar de una nica clase. Ejemplo: Java, C#
Herencia mltiple
Una clase puede heredar de varias clases. Clases forman un grafo dirigido acclico Ejemplos: Eiffel, C++
Tema3: Herencia 9
Significado de la herencia
Clases Modulo Tipo
relacin Herencia Mecanismo de extensin Reutilizar caractersticas es-un? Mecanismo de especializacin Clasificacin de tipos
Sean: Prop(X) : Propiedades (atributos y mtodos) de la clase X dom(C) : Conjunto de instancias de una clase C
{ Prop(A) }
{ Prop(B) }
Cualquier objeto de B puede ser considerado objeto de A Siempre que se espera un objeto de A podemos recibir un objeto de B, puesto que aceptara todos sus mensajes dom (B) dom (A) =>B es un subtipo de A
Tema3: Herencia 11
Herencia de Implementacin vs. Herencia de Tipos No siempre se corresponden las clases con tipos Dos consideraciones:
Cmo relacionamos los tipos?
HERENCIA DE TIPOS o DE COMPORTAMIENTO Da lugar a jerarquas basadas en aspectos comunes
2) Herencia de implementacin: todas las propiedades del padre pueden no aplicarse al hijo
ARRAY
PILA
Tema3: Herencia
CIRCULO
14
Polgonos y Rectngulos
Un rectngulo tiene muchas de las caractersticas de un polgono (rotar, trasladar, vrtices,..) Pero tiene caractersticas especiales (diagonal) y propiedades especiales (4 lados, ngulos rectos) Algunas caractersticas de polgono pueden implementarse ms eficientemente (permetro)
class Rectangulo extends Poligono{ ...Caractersticas especficas }
Tema3: Herencia 16
public class Poligono { //Un polgono se implementa como una lista de //puntos sucesivos private List<Punto> vertices; private int numVertices; public Poligono() { vertices = new LinkedList(); } public int getNumVertices(){ return numVertices; } public void rotar (Punto centro, double angulo){} public void trasladar (double a, double b){} public void visualizar(){} public double perimetro(){} }
Tema3: Herencia 17
/** * Desplaza a horizontalmente y b verticalmente */ public void trasladar (double a, double b){ for (Punto pto : vertices) pto.trasladar(a,b); } /** * Rota el ngulo alrededor del centro */ public void rotar (Punto centro, double angulo){ for (Punto pto : vertices) pto.rotar(centro, angulo); }
Tema3: Herencia
18
/** * Suma las longitudes de los lados */ public double perimetro(){ double total = 0; Punto anterior; Punto actual = vertices.get(0); for (int index = 1; index < numVertices; index++){ anterior = actual; actual = vertices.get(index); total = total + actual.distancia(anterior); } total=total+actual.distancia(vertices.get(0)); return total; }
Tema3: Herencia
19
Clase Rectngulo
public class Rectangulo extends Poligono{ private double lado1, lado2; //Nuevos atributos private double diagonal; public Rectangulo(double lado1, double lado2){ super(); this.lado1 = lado1; this.lado2 = lado2; } @Override //Redefine permetro public double perimetro(){ return (2*(lado1 + lado2 )); } }
Todas las caractersticas de Poligono estn disponibles automticamente para la clase Rectangulo, no es necesario que se repitan.
Tema3: Herencia 20
Acceso protegido
Una subclase no puede acceder a los campos privados de la superclase Para permitir que un mtodo de la subclase pueda acceder a un campo de la superclase, ste tiene que declararse como protected protected: miembros visibles a las subclases y al resto de clases del paquete Resumen de modificadores de acceso:
private visible slo en la clase public visible a todas las clases protected visible a las subclases y en el paquete Sin modificador visible en el paquete
21
Herencia en Java
Toda clase hereda directa o indirectamente de la clase Object Una subclase hereda de su superclase mtodos y variables tanto de clase como de instancia. Una subclase puede aadir nuevos mtodos y variables. Una subclase puede redefinir mtodos heredados.
Tema3: Herencia 22
Redefinicin
La redefinicin reconcilia la reutilizacin con la extensibilidad: Es raro reutilizar un componente software sin necesidad de cambios Los atributos no se pueden redefinir, slo se OCULTAN
el campo de la superclase todava existe pero no se puede acceder
Un mtodo de la subclase con la misma signatura y valor de retorno que un mtodo de la superclase lo est REDEFINIENDO.
Si se cambia el tipo de los parmetros se est sobrecargando el mtodo original
Tema3: Herencia 23
Redefinicin de mtodos
Una clase hija puede redefinir un mtodo de la clase padre por dos motivos: Reemplazo:
Mejorar implementacin. Ej: redefinir permetro en la clase Rectangulo. Otra diferente (aunque con la misma semntica). Ej: el mtodo dibujar en la jerarqua de Figura.
Refinamiento:
Mtodo del padre + acciones especficas.
Tema3: Herencia 24
Refinamiento: super
Si un mtodo redefinido refina el comportamiento del mtodo original puede necesitar hacer referencia a este comportamiento super se utiliza para invocar a un mtodo de la clase padre:
super.met(); Se rompe la ligadura dinmica No slo se utiliza en los mtodos redefinidos
Tema3: Herencia
25
Ejemplo super
public class CuentaAhorro extends Cuenta{ @Override //Refina el comportamiento heredado public void ingresar(double cantidad){ //Hace lo mismo que el mtodo de la clase padre super.ingresar(cantidad); //Adems hace cosas propias de la CuentaAhorro beneficio = cantidad * PORCENTAJE_BENEFICIO; } }
Tema3: Herencia
26
b) Jerarqua de Empleado
Empleado >> public Empleado getColega() Jefe >> public Jefe getColega()
Tema3: Herencia 30
3.- Polimorfismo
El trmino polimorfismo significa que hay un nombre (variable, funcin o clase) y muchos significados diferentes (distintas definiciones). Formas de polimorfismo [Budd02]:
Polimorfismo de asignacin (variables polimorfas) Polimorfismo puro (funcin polimorfa) Polimorfismo ad hoc (sobrecarga) Polimorfismo de inclusin (redefinicin) Polimorfismo paramtrico (genericidad)
Tema3: Herencia 32
Tipo dinmico:
Tipo correspondiente a la clase del objeto conectado a la entidad en tiempo de ejecucin
A B C E F
A oa; B ob; C oc; te(oa) = A ctd(oa) = {A,B,C,D,E,F} te(ob) = B ctd(ob) = {B, D, E} te(oc) = C ctd(oc) = {C,F}
Tema3: Herencia 34
(despus) r
Poligono p;
Rectangulo r;
a) asignacin:
p = r; -- p es una entidad polimorfa (polimorfismo de asignacin) -- f es una rutina polimorfa (polimorfismo puro)
b) paso de parmetros:
void f (Poligono p){ ... }
Funciones polimrficas:
Una nica funcin que puede recibir una variedad de argumentos (comportamiento uniforme). La ejecucin correcta se determina dinmicamente en tiempo de ejecucin.
Tema3: Herencia
36
A oa; B ob; C oc; D od; Son legales las siguientes asignaciones? oa = ob; oc = ob; oa = od Es legal el mensaje od.metodo1?
Tema3: Herencia 37
Poltica pesimista: al tratar de garantizar que ninguna operacin fallar, el compilador puede rechazar cdigo que tenga sentido en tiempo de ejecucin Ejemplo: (Pascal) n:INTEGER; r: REAL n:=r n:= 0.0 Podra funcionar n:= -3.67 No funcionara n:= 3.67 - 3.67 Funcionara Beneficios esperados: Fiabilidad, legibilidad y eficiencia
Tema3: Herencia 38
Reglas bsicas
La herencia es consistente con el sistema de tipos
Regla de llamada a una caracterstica
En una llamada a una caracterstica x.f donde el tipo de x se basa en una clase C, la caracterstica f debe estar definida en uno de los antecesores de C.
Luego, sean las declaraciones
Poligono p ; Rectangulo r;
Mensajes legales:
p.perimetro(); p.getVertices() ; p.trasladar(..); p.rotar (..); r.getDiagonal();r.getLado1(); r.getLado2(); r.getVertices(); r.trasladar(..); Tema3: Herencia r.rotar (..); r.perimetro();
Reglas bsicas
La herencia regula que conexiones polimorfas son permitidas
Definicin: compatibilidad o conformidad de tipos
Un tipo U es compatible o conforme con un tipo T slo si la clase base de U es un descendiente de la clase base de T, adems, para los tipos derivados genricamente, todo parmetro real de U debe (recursivamente) ser compatible con el correspondiente parmetro formal en T. Por ejemplo, Rectangulo es compatible con Poligono
Tema3: Herencia 40
Reglas bsicas
Regla de compatibilidad de tipos
Una conexin con origen y y destino x (esto es, una asignacin x=y, o invocacin r(..,y,..) a una rutina r(.., T x,..) es vlido solamente si el tipo de y es compatible con el tipo de x.
Regla de validez de un mensaje
Un mensaje ox.rut (y), supuesta la declaracin X ox; ser legal si i) X incluye una propiedad con nombre final rut, ii) los argumentos son compatibles con los parmetros y coinciden en nmero, y iii) rut est disponible para la clase que incluye el mensaje.
Tema3: Herencia 41
Ejemplo
Poligono p; Rectangulo r; Triangulo t;... double x;
Figura
Figura Abierta
Figura Cerrada
Segmento
Poligono
Elipse
Triangulo Rectangulo
Circulo
SERA INCORRECTO
x = p.getDiagonal(); r = p;
Cuadrado
Tema3: Herencia
42
A) Poligono p; Rectangulo r = new Rectangulo(); Triangulo t = new Triangulo (); ... pantalla.visualizarIconos(); pantalla.esperarClickRaton(); double x = pantalla.posicionRaton(); iconoElegido = pantalla.getIconoEn(x); if (iconoElegido == iconoRectangulo) p = r else if (iconoElegido == iconoTriangulo) p = t else if //tantos if como tipos de figuras ... //Aplicar operaciones de Poligono p.visualizar(); p.rotar(...); B) void unMetodo(Poligono p){ p.met() //siendo met un mtodo de Poligono }
5.- Genericidad
Hasta la versin 1.4 no se incluye la genericidad como elemento del lenguaje. Se consigue gracias a que toda clase es compatible con la clase Object.
Las colecciones son contenedores de objetos
Perdemos la ventaja de la comprobacin esttica de tipos, las comprobaciones las hace el programador
Tema3: Herencia 46
Genericidad y polimorfismo
Estructuras de datos polimorfas:
Pueden contener instancias de una jerarqua de clases Ejemplo:
Poligono p; Rectangulo r; Circulo c; Triangulo t;
Sin embargo, como consecuencia del manejo de estructuras de datos polimorfas puede ser inevitable tener que preguntar por el tipo dinmico de los objetos.
Tema3: Herencia 48
Ejemplo:
public float maxDiagonal (LinkedList<Figura> listaFig) { Figura f; double actual,result=-1; for (Figura figura : listaFig){ if (figura instanceof Rectangulo){ actual = (Rectangulo)figura.getDiagonal(); if (actual>result) result = actual; } } return result; }
Tema3: Herencia
49
Genericidad Restringida
La genericidad no restringida equivale a:
<T extends Object>
Java
public class Vector{ private Number[] contenido;
Tema3: Herencia
53
Todas las consultas sobre el tipo dinmico siempre devuelven el tipo puro:
(lp instanceof Lista<Poligono>) equivale a (lp instanceof Lista) lp1 = (List<Poligono>)l; //slo comprueba si l es una List
Tema3: Herencia 55
Tipos comodn
Dado el cdigo de la clase Paint:
public static void imprimir (List<Poligono> poligonos){ for (Poligono p : poligonos) System.out.println(p); }
redefine f {f} B
qu versin de f se ejecuta?
redefine f
D {f}
Regla de la ligadura dinmica
Ligadura dinmica
La versin de una rutina en una clase es la introducida por la clase (redefinicin u original) o la heredada. Ejemplo 1:
Poligono p = new Poligono(); Rectangulo r = new Rectangulo(); x x p x = = = = p.perimetro() r.perimetro() r; p.perimetro()
Tema3: Herencia
redefine f {f} B A oa; B ob = new B(); D od = new D(); oa = ob; oa.f(); oa = od oa.f();
C redefine f D {f}
Tema3: Herencia
60
Ligadura Dinmica
Ejemplo 2: void visualizar (Figura [] figuras){ for (Figura figura : figuras) figura.dibujar(); } Qu sucede si aparece un nuevo tipo de figura? Qu relacin existe entre ligadura dinmica y comprobacin esttica de tipos?
Sea el mensaje x.f (), la comprobacin esttica de tipos garantiza que al menos existir una versin aplicable para f, y la ligadura dinmica garantiza que se ejecutar la versin ms apropiada
Tema3: Herencia 61
Uno
Dos
Tres
Cuatro
62
1 1 2 2 2 4 2 4 2 2
63
A {met1, met2}
... B C }
{met2}
{met2}
64
{met2}
{met2}
Cdigo genrico:
Un nico cdigo con diferentes interpretaciones en tiempo de ejecucin. Un mismo cdigo con diferentes implementaciones: variacin en la implementacin
Tema3: Herencia 65
No hay que preocuparse de eficiencia y reutilizacin Cierto tanto para herencia simple como mltiple
Tema3: Herencia 67
* Figura Abierta
+ Segmento
+ Poligono
+ Circulo
Clases abstractas
public abstract class Figura {...} Una subclase de una clase diferida puede seguir siendo diferida public abstract class FIGURA_ABIERTA extends Figura { ... } public abstract class FIGURA_CERRADA extends Figura { ... }
Tema3: Herencia 69
Clases abstractas
Toda clase que contenga algn mtodo abstracto (heredado o no) es abstracta. Una clase puede ser abstracta y no contener ningn mtodo abstracto. Especifica una funcionalidad que es comn a un conjunto de subclases aunque no es completa. Puede ser total o parcialmente abstracta. No es posible crear instancias de una clase abstracta, pero si declarar entidades de estas clases.
Aunque la clase puede incluir la definicin del constructor.
Las clases abstractas slo tienen sentido en un lenguaje con comprobacin esttica de tipos.
Tema3: Herencia 70
Reciben el nombre de CLASES COMPORTAMIENTO aquellas clases que incluyen un comportamiento comn a varias subclases (familia de implementaciones de TADs)
Tema3: Herencia
72
Tema3: Herencia
Array
ListaEnlazada
FicheroSec
Tema3: Herencia
75
Tema3: Herencia
76
C1 condicion
C2 condicion
C3 condicion
No apropiado
77
Tema3: Herencia
Coleccion buscar
interface
ICondicion test
C1
Tema3: Herencia
C2
C3
78
criterio
Comparator
int compare(Object o1, Object o2)
OrdenAlfabetico
OrdenSaldo
Iteradores internos
Interesa capturar patrones o esquemas de recorrido de estructuras de datos: reutilizar en vez de escribir de nuevo. Un sistema que haga uso de un mecanismo general para iterar debe ser capaz de aplicarlo para cualquier accion y test de su eleccin. El mtodo de iteracin debe estar parametrizado por la accin y la condicin. En Java no es posible pasar una rutina como argumento.
Tema3: Herencia 83
SI
Iteradores internos
Coleccion<T>
coleccion
IteradorLineal<T>
Mtodo plantilla
Tema3: Herencia
85
Iteradores internos
Coleccion<T>
coleccion
IteradorLineal<T>
Mtodo plantilla
Tema3: Herencia
86
Iteradores internos
abstract class IteradorLineal <T> { private List<T> coleccion; public IteradorLineal(List<T> c){ coleccion = c; } public abstract void accion (T item); public abstract boolean test (T item); /* Ejecuta una accin sobre todos los elementos de la coleccin */ public void forEach(){ for (T item : coleccion) action (item); } // Ejecuta la accin sobre los items que cumplen test public void doIf(){ for (T item : coleccion) if test(item) accion(item); } }
Tema3: Herencia 87
Iteradores internos
Coleccin<T>
coleccion
IteradorLineal<T>
Iteradores internos
class IteradorMorosos extends IteradorLineal<Cuenta> { }
Suponiendo que LinkedList<Cuenta> cuentas; contiene todas las cuentas del bando, si queremos imprimir por pantalla los titulares de las cuentas que estn en nmeros rojos haramos:
public void imprimeMorosos(){ IteradorMorosos iterador = new IteradorMorosos (cuentas); iter.doIf();
}
Tema3: Herencia 89
Ejemplos de Iteradores
public IteradorSuma(List lista){ super(lista); } public void accion (Integer v){ suma = suma + v; } public boolean test(Integer v){ return true;} } public class Aplicacion{ private List<Integer> listaInt; public int sumarTodo() { IteradorSuma iterador; iterador = new IteradorSuma(listaInt); iterador.forEach(); return iterador.getSuma(); }
Tema3: Herencia 90
coleccion
LinkedList<Parrafo>
Texto
Editor justificar
91
public class Editor { private Texto texto; public void justificar(){ JustificarTexto jt; jt = new JustificarTexto(texto); jt.doIf(); } }
Tema3: Herencia 93
Iterador interno:
el iterador es quien controla la iteracin. Es el iterador el que aplica una operacin a cada elemento de la coleccin. Ejemplo: clase IteratorLineal
Tema3: Herencia 94
Ejemplo:
public void imprimir(){ Iterator it = coleccion.iterator(); while (it.hasNext()) IO.imprimir(it.next()); } Iterador externo public void imprimir(){ Iterador interno IteratorImprimir it = new IteratorImprimir(coleccion); it.forEach(); }
Tema3: Herencia 95
C met accion
C met
interface
IA
accion
C1 accion
C2 accion
C3 accion
A1 accion
A2 accion
A3 accion
a) Mtodo plantilla
Tema3: Herencia
b) Composicin
96
C met accion
C
met(IA ca)
interface
IA
accion
C1 accion
C2 accion
C3 accion
A1 accion
A2 accion
A3 accion
a) Mtodo plantilla
Tema3: Herencia
b) Composicin
97
C met accion
C
IA ca
interface
IA
met()
accion
C1 accion
C2 accion
C3 accion
A1 accion
A2 accion
A3 accion
a) Mtodo plantilla
Tema3: Herencia
b) Composicin
98
Hay que utilizar la herencia para modelar la relacin es_un No se debe utilizar la herencia salvo que todos los mtodos heredados tengan sentido No hay que modificar la semntica de un mtodo en la redefinicin Hay que utilizar el polimorfismo y no la informacin relativa al tipo
Tema3: Herencia 99