La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sonia Rueda Herencia y Polimorfismo

Presentaciones similares


Presentación del tema: "Sonia Rueda Herencia y Polimorfismo"— Transcripción de la presentación:

1 Sonia Rueda Herencia y Polimorfismo
Introducción a la Programación Orientada a Objetos Sonia Rueda Herencia y Polimorfismo IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2017

2 Paradigmas de Programación
El desarrollo de un sistema de software es un proceso de abstracción a partir del cual se construye un modelo de la solución de un problema. En los problemas de mediana y gran escala la construcción del modelo requiere creatividad, pero también de un paradigma que guíe, oriente y sistematice cada etapa del proceso. Un paradigma brinda un principio, una metodología y un conjunto de herramientas que favorecen la aplicación del la metodología.

3 Programación Orientada a Objetos
El principio fundamental de la programación orientada a objetos es desarrollar software en base a las entidades de un modelo. Una metodología orientada a objetos brinda pautas para cada etapa del proceso de desarrollo de software. La estrategia sigue siendo dividir el problema en subproblemas para reducir la complejidad. La metodología nos indica cómo dividir. Las principales herramientas son el lenguaje de modelado y el lenguaje de programación.

4 Programación Orientada a Objetos
Desarrollo de requerimientos

5 Programación Orientada a Objetos
Diseño Internado Internación Paciente Médico Control Residente Jefe de Servicio SignosVitales El diseño puede incluir varios diagramas de clases. Si hay clases compartidas los diagramas tienen que ser consistentes. PresionArterial

6 Programación Orientada a Objetos
Diseño Empleado Asistencial Administrativo Técnico Médico Enfermero Residente Jefe de Servicio

7 Programación Orientada a Objetos
Implementación APLICACIÓN class Empleado class Asistencial class Paciente class Medico class Internado class Residente class JefeServicio class SignosVitales class Internación class PresionArterial class Control Con frecuencia un programador implementa solo uno de los diagramas de clase o incluso parte de un diagrama de clases.

8 Programación Orientada a Objetos
Verificación Servicios Clases Integración entre clases

9 Programación Orientada a Objetos
Modelo computacional Internación Internado Médico SignosVitales Control El modelo computacional de la programación orientada a objetos es un mundo poblado de objetos comunicándose a través de mensajes. Cada objeto que recibe un mensaje ejecuta un servicio determinado por su clase.

10 Programación Orientada a Objetos
El objetivo de la programación orientada a objetos es favorecer la calidad y la productividad. La POO mejora la calidad y la productividad a través de los conceptos de: abstracción de datos y encapsulamiento herencia y polimorfismo

11 Herencia La herencia es un mecanismo que permite organizar una colección de clases a través de una relación de generalización-especialización. Consideremos dos o más clases que comparten algunos atributos y servicios y difieren en otros. Es posible definir una clase base, con los atributos y servicios compartidos y luego extender esa clase base en dos o más clases derivadas. La definición de las clases derivadas incluye solo los atributos y comportamiento específicos, que distinguen a los objetos de la clase derivada de las instancias de la clase general.

12 Herencia La herencia simple exige que el proceso de clasificación se realice de manera tal que cada clase derivada corresponda a una única clase base. Gráficamente la estructura de clases forma un árbol que describe la jerarquía de herencia. En cada rama del árbol las clases superiores son los ancestros de las clases inferiores, que son sus descendientes. La herencia múltiple permite que una clase derivada pueda heredar de dos o más clases generales. Es una alternativa poderosa pero más compleja.

13 Herencia Cuando la herencia es simple el árbol puede construirse desde la raíz hacia las hojas o en sentido inverso. Es decir, el proceso de clasificación puede hacerse partiendo de una clase muy general y descomponiéndola en otras más específicas identificando las diferencias entre los objetos. El proceso continúa hasta alcanzar subclases homogéneas, hablamos de especialización.

14 Herencia Alternativamente es posible partir del dominio de todas las instancias y agruparlas en clases según sus similitudes, hablamos entonces de generalización. Estas clases serán a su vez agrupadas en otras de mayor nivel hasta alcanzar una única clase muy general.

15 Herencia Consideramos solo parte de una rama del árbol. Empleado
iniciarTurno (t:Turno) finTurno (t:Turno) Asistencial administrarFarmaco(p:Paciente,f:Farmaco) controlarPaciente(p:Paciente):Control masAntiguo(a:Asistencial):boolean Todo Asistencial puede iniciar el turno o darle fin. Solo los Asistencials que ocupan cargos asistenciales pueden administrar fármacos y controlar a los pacientes. Solo los médicos pueden prescribir fármacos y el control que hacen a los pacientes es diferente al que hace cualquier paciente. Médico indicarInternacion(p:Paciente):Internacion prescribirFarmaco(p:Paciente):Farmaco controlarPaciente(p:Paciente):Control Consideramos solo parte de una rama del árbol.

16 Herencia en Java La herencia en Java es simple aunque puede simularse herencia múltiple. La clase derivada extiende a la clase base a través de la palabra extends. La clase derivada hereda atributos y métodos, pero no los constructores. Los constructores de una clase base pueden ser accedidos desde los constructores de sus descendientes directos, usando la palabra super. Los métodos de la clase derivada pueden derogar a los métodos de sus clases ancestros.

17 Herencia en Java class Empleado{ … public void iniciarTurno(Turno t){}
public void finTurno(Turno t){} } class Asistencial extends Empleado{ public void administrarFarmaco(Paciente p,Farmaco f){} public Control controlarPaciente(Paciente p){} public boolean masAntiguo(Asistencial a){} } class Medico extends Asistencial{ public Farmaco prescribirFarmaco(Paciente p){} public Internacion indicarInternacion (Paciente p){} public Control controlarPaciente(Paciente p){} }

18 Herencia en Java Paciente p = new Paciente(…); Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Farmaco f = v2.prescribirFarmaco(p); Las instancias de la clase Medico pueden recibir el mensaje prescribirFarmaco con un objeto de clase Paciente como parámetro. Las instancias de la clase Asistencial no tienen la capacidad de atender el mensaje prescribirFarmaco.

19 Herencia en Java Paciente p = new Paciente(…); Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Farmaco f = v2.prescribirFarmaco(p); v1.administrarFarmaco(p,f); v2.administrarFarmaco(p,f); La clase derivada Medico hereda los métodos definidos en la clase base Asistencial. Las instancias de la clase Medico son también instancias de la clase Asistencial y de la clase Empleado.

20 Modificadores en Java El modificador final tiene significados levemente distintos según se aplique a una variable, a un método o a una clase. Para una clase, final significa que la clase no puede extenderse. Es, por tanto el punto final de la rama de clases derivadas. Para un método, final significa que no puede redefinirse en una clase derivada. Para una variable, final significa también que no puede ser redefinido en una clase derivada, pero además su valor no puede ser modificado.

21 Redefinición en Java En Java mismo nombre puede utilizarse para definir un método en la clase base y otro en la clase derivada. Si en la clase derivada se define un método con el mismo nombre, número y tipo de parámetros que un método definido en la clase base, el método de la clase base queda derogado. Decimos que la definición de la clase derivada redefine al método de la clase base. Los métodos derogados pueden accederse con la palabra super.

22 Redefinición en Java class Asistencial extends Empleado{ …
public Control controlarPaciente(Paciente p){} } class Medico extends Asistencial{

23 Polimorfismo Polimorfismo se refiere a la propiedad que permite que las entidades de una misma clase puedan tomar diferentes formas y su forma determine el modo en que se comportan. Por ejemplo las entidades de la clase Vertebrado pueden ser aves y mamíferos, entre otras. Todas pueden trasladarse pero lo hacen de manera diferente.

24 Polimorfismo En la programación orientada a objetos el polimorfismo permite que el comportamiento de un objeto en respuesta a un mensaje dependa de la clase a la que pertenece. De modo que si una entidad de la clase Vertebrado recibe el mensaje “trasladarse” va a poder hacerlo, pero la manera de trasladarse va a depender de su clase. En Java el polimorfismo está relacionado con variables, asignaciones y métodos.

25 Variable polimórfica Una variable polimórfica es aquella que puede estar ligada a objetos de diferentes clases. El tipo de la declaración, llamado tipo estático, determina el conjunto de tipos que de los objetos que pueden ligarse, esto es el conjunto de tipos dinámicos. El tipo estático se conoce en compilación, el tipo dinámico se liga en ejecución.

26 Asignación polimórfica
Una asignación polimórfica liga un objeto de una clase a una variable polimórfica. Empleado v0; Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Son válidas las siguientes asignaciones polimórficas: v0 = v1; v0 = v2; v1 = v2; v0 = new Asistencial(…); v0 = new Medico(…); v1 = new Medico(…);

27 Tipo Estático y Dinámico
Empleado Asistencial Médico Tipo Estático Tipos Dinámicos Empleado Asistencial Medico Asistencial Medico

28 Tipo Estático y Dinámico
Empleado v0 = new Asistencial(…); Asistencial v1 = new Asistencial(…); Asistencial v2 = new Medico(…); Medico v3 = new Medico(…); Empleado v4 = new Medico(…); Variable Tipo Estático Tipo Dinámico v0 Empleado Asistencial v1 v2 Medico v3 V4

29 Ligadura dinámica de código
La ligadura dinámica de código es la vinculación en ejecución de un mensaje con un método. La ligadura dinámica de código es un recurso valioso cuando uno o más métodos de una clase están redefinidos en una o más clases derivadas. c = v1.controlarPaciente(p); Asistencial c = v2.controlarPaciente(p); Medico La ligadura entre el mensaje y el método se determina en ejecución según la clase del objeto.

30 Chequeo de Tipos en Java
En Java el polimorfismo y la ligadura dinámica quedan restringidos por el chequeo de tipos. El compilador realiza algunos controles estáticos que previenen errores de tipo en ejecución. El chequeo de tipos establece restricciones sobre: las asignaciones polimórficas los mensajes que un objeto puede recibir

31 Chequeo de tipos en Java
Asistencial v1 = new Asistencial(…); Asistencial v2 = new Medico(…); Medico v = new Medico(…); v3 = v1; Error v3 = v2; Error v3 = new Asistencial(…); Error El tipo estático restringe las asignaciones polimórficas.

32 Chequeo de tipos en Java
Asistencial v1 = new Asistencial(…); Asistencial v2 = new Medico(…); Medico v = new Medico(…); Paciente p = new Paciente(…); Farmaco f; f = v1.prescribirFarmaco(p); Error f = v2.prescribirFarmaco(p); Error f = v3.prescribirFarmaco(p); El tipo estático determina los mensajes que el objeto puede recibir.

33 Chequeo de tipos en Java
Asistencial v1 = new Asistencial(…); Asistencial v2 = new Medico(…); Medico v = new Medico(…); Empleado v4 = new Asistencial(…); Si la clase Asistencial define: public boolean masAntiguo(Asistencial e) { … } v1.masAntiguo (v2); v1.masAntiguo (v3); v1.masAntiguo (v4); Error El tipo estático del parámetro formal restringe el tipo estático del parámetro real.

34 Caso de Estudio: Gestión Residuos
En un sistema de control de residuos un terrero se representa a través de una matriz de nxn Cada elemento de la matriz pueden mantener un contenedor. Cada contenedor tiene una densidad y un volumen y provoca un impacto sobre el medio ambiente que es igual a la mitad de su tamaño multiplicado por la densidad. Un contenedor contaminante tiene un nivel de toxicidad que incide en el impacto ambiental, el impacto es el de cualquier contenedor multiplicado por la toxicidad.

35 Caso de Estudio: Gestión Residuos

36 Caso de Estudio: Gestión Residuos
Contenedor Terreno <<atributos de instancia>> volumen:real densidad:real <<constructor>> Contenedor(v:real,d:real) <<consultas>> obtenerVolumen():real obtenerDensidad():real obtenerImpacto():real <<atributos de instancia>> T [][] Contenedor <<constructor>> Terreno(n:entero) <<comandos>> colocar (c:Contenedor,f,c:entero) retirar(f.c:entero):Contenedor <<consultas>> hayContenedor(f,c:entero):boolean impactoTerreno():real Contaminante <<atributos de instancia>> toxicidad:real <<constructor>> Contaminante(v,d,t:reall) <<consultas>> obtenerToxicidad():real obtenerImpacto():real

37 Caso de Estudio: Gestión Residuos
class Contenedor { //atributos de instancia protected float volumen; protected float densidad; //constructor public Contenedor(float v,float d){ volumen = v; densidad = d; } //consultas public float obtenerVolumen(){ return volumen;} public float obtenerDensidad(){ return densidad;}

38 Caso de Estudio: Gestión Residuos
public float obtenerImpacto(){ return volumen*densidad/2;} }

39 Caso de Estudio: Gestión Residuos
class Contaminante extends Contenedor { //atributos de instancia protected float toxicidad; //constructor public Contaminante (float v, float d,float t){ super(v,d); toxicidad = t; } //consultas public float obtenerToxicidad(){ return toxicidad;}

40 Caso de Estudio: Gestión Residuos
public float obtenerImpacto(){ float i = super.obtenerImpacto(); return i*toxicidad; } } La consulta obtenerImpacto en la clase Contaminante redefine y usa a la consulta definida en la clase Contenedor.

41 Caso de Estudio: Gestión Residuos
class Contenedor { public String toString(){ return volumen+” “+densidad; } class Contaminante extends Contenedor { public String toString(){ return super.toString()+” “+toxicidad; }

42 Caso de Estudio: Gestión Residuos
class Terreno{ //atributos de instancia private Contenedor [][]T ; //constructor public Terreno (int n){ T = new Contenedor[n][n]; } El arreglo T es una estructura de datos polimórfica, los elementos pueden ser referencias a objetos de la clase Contenedor o de la clase Contaminante, que especializa a Contenedor.

43 Caso de Estudio: Gestión Residuos
//comandos public void colocar(Contenedor con,int f, int c){ //Requiere la posición válida T[f][c] = con; } public Contenedor retirar(int f, int c){ Contenedor con; con = T[f][c]; T[f][c] = null; return con; El comando colocar es un método polimórfico, recibe como parámetro a una variable polimórfica.

44 Caso de Estudio: Gestión Residuos
//consultas public boolean hayContenedor(int f,int c){ return T[f][c] != null; }

45 Caso de Estudio: Gestión Residuos
Contenedor Terreno <<atributos de instancia>> volumen:real densidad:real <<constructor>> Contenedor(v:real,d:real) <<consultas>> obtenerVolumen():real obtenerDensidad():real obtenerImpacto():real <<atributos de instancia>> T [][] Contenedor <<constructor>> Terreno(n:entero) <<comandos>> colocar (c:Contenedor,f,c:entero) retirar(f.c:entero):Contenedor <<consultas>> hayContenedor(f,c:entero):boolean impactoTerreno():real Contaminante <<atributos de instancia>> toxicidad:real <<constructor>> Contaminante(v,d,t:reall) <<consultas>> obtenerToxicidad():real obtenerImpacto():real

46 Caso de Estudio: Gestión Residuos
public float impactoTerreno(){ float impacto=0; for (int i = 0; i< T.length;i++) for (int j = 0; j< T.length;j++) if (T[i][j] != null) impacto += T[i][j].obtenerImpacto() ; return impacto; } La ligadura entre el mensaje y el método obtenerImpacto es dinámica, se resuelve en ejecución y depende de la clase del objeto.

47 Caso de Estudio: Gestión Residuos
Terreno <<atributos de instancia>> T [][] Contenedor <<constructor>> Terreno(n:entero) <<comandos>> colocar (c:Contenedor,f,c:entero) retirar(f,c:entero):Contenedor <<consultas>> hayContenedor(f,c:entero):boolean impactoTerreno():real mayorToxicidad():real Computa la mayor toxicidad entre los contenedores contaminantes. Si no se registra toxicidad retorna 0.

48 Caso de Estudio: Gestión Residuos
//consultas public float mayorToxicidad(){ float mayor=0; for (int i = 0; i< T.length;i++) for (int j = 0; j< T.length;j++) if (T[i][j] != null && T[i][j].obtenerToxicidad() > mayor) mayor = T[i][j].obtenerToxicidad(); return mayor; } El compilador reporta un error porque no puede asegurar que T[i][j] pueda recibir el mensaje obtenerToxicidad.

49 Caso de Estudio: Gestión Residuos
//consultas public float mayorToxicidad(){ float mayor=0; Contaminante c; for (int i = 0; i< T.length;i++) for (int j = 0; j< T.length;j++) if (T[i][j] != null) if (T[i][j] instanceof Contaminante){ c = (Contaminante) T[i][j]; if (c.obtenerToxicidad() > mayor) mayor = c.obtenerToxicidad(); } return mayor; La solución es correcta pero no respeta las recomendaciones de la programación orientada a objetos.

50 Caso de Estudio: Gestión Residuos
if (T[i][j] instanceof Contaminante) Computa true si T[i][j] mantiene una referencia a un objeto de clase Contaminante. c = (Contaminante) T[i][j]; La asignación es válida porque el casting relaja el control del compilador. mayor = c.obtenerToxicidad(); El mensaje es válido porque el tipo estático de c es Contaminante.

51 Caso de Estudio: Gestión Residuos
//consultas public float mayorToxicidad(){ float mayor=0; Contaminante c; for (int i = 0; i< T.length;i++) for (int j = 0; j< T.length;j++) if (T[i][j] != null){ c = (Contaminante) T[i][j]; if (c.obtenerToxicidad() > mayor) mayor = c.obtenerToxicidad(); } return mayor; El compilador no reporta error pero la ejecución terminará anormalmente, si la tabla contiene referencias a contenedores que no son contaminantes.

52 Caso de Estudio: Gestión Residuos
Terreno <<atributos de instancia>> T [][] Contenedor <<constructor>> Terreno(n:entero) <<comandos>> colocar (c:Contenedor,f,c:entero) retirar(f,c:entero):Contenedor <<consultas>> hayContenedor(f,c:entero):boolean impactoTerreno():real mayorToxicidad():real filasMellizas(otro:Terreno):boolean Computa true sí y solo sí el terreno que recibe el mensaje y el terreno otro tienen alguna fila con contenedores dispuestos en las mismas posiciones o ningún contenedor

53 Caso de Estudio: Gestión Residuos
La segunda fila hace que se verifique la propiedad filasMellizas

54 Caso de Estudio: Gestión Residuos
La tercera fila hace que se verifique la propiedad filasMellizas

55 Caso de Estudio: Gestión Residuos
No se verifica la propiedad

56 Caso de Estudio: Gestión Residuos
Algoritmo filasMellizas para cada fila y mientras no se encuentren dos filas mellizas para cada columna y mientras no encuentre dos celda tales que una es nula y la otra no avanzar en la columna

57 Caso de Estudio: Gestión Residuos
Algoritmo filasMellizas para cada fila y mientras no se encuentren dos filas mellizas para cada columna y mientras no encuentre dos celda tales que una es nula y la otra no avanzar en la columna Comienza asumiendo que no hay filas mellizas y para cuando encuentra dos filas melliza.

58 Caso de Estudio: Gestión Residuos
Algoritmo filasMellizas para cada fila y mientras no se encuentren dos filas mellizas para cada columna y mientras no encuentre dos celda tales que una es nula y la otra no avanzar en la columna Comienza asumiendo que las filas son mellizas y para cuando decide que no lo son.

59 Caso de Estudio: Gestión Residuos
//consultas public boolean filasMellizas(Terreno otro){ boolean mellizas=false; for (int i = 0; i< T.length && !mellizas;i++){ mellizas=true; for (int j = 0; j< T.length && mellizas;j++) mellizas = (T[i][j] == null && !otro.hayContenedor(i,j))|| (T[i][j] != null && otro.hayContenedor(i,j));} return mellizas; } Observemos que T es un arreglo de dos dimensiones, la variable otro mantiene una referencia a un objeto de clase Terreno.


Descargar ppt "Sonia Rueda Herencia y Polimorfismo"

Presentaciones similares


Anuncios Google