Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porDomingo Romero Rico Modificado hace 9 años
1
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia y Polimorfismo Dr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2016
2
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 2
3
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 PARADIGMAS DE PROGRAMACIÓN 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 3
4
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 LA PROGRAMACIÓN ORIENTADA A OBJETOS Desarrollo de requerimientos La metodología OO propone identificar durante el desarrollo de requerimientos los objetos relevantes para elaborar un modelo del problema. 4
5
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 El diseño puede incluir varios diagramas de clases. Si hay clases compartidas los diagramas tienen que ser consistentes. LA PROGRAMACIÓN ORIENTADA A OBJETOS Diseño 5 Paciente Médico SignosVitales Internado Residente Jefe de Servicio Internación PresionArterial Control
6
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 LA PROGRAMACIÓN ORIENTADA A OBJETOS Diseño 6 Empleado Asistencial Técnico Administrativo Médico Residente Jefe de Servicio Enfermero Introducción a la Programación Orientada a Objetos IPOO - 2016
7
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 LA PROGRAMACIÓN ORIENTADA A OBJETOS Implementación Con frecuencia un programador implementa solo uno de los diagramas de clase o incluso parte de un diagrama de clases. APLICACIÓN class Paciente class Empleado class Internación class Internado class Asistencial class Medico class PresionArterial class SignosVitales class Control class Residente class JefeServicio 7
8
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 LA PROGRAMACIÓN ORIENTADA A OBJETOS Verificación Servicios Clases Integración entre clases Introducción a la Programación Orientada a Objetos IPOO - 2016 8
9
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 LA PROGRAMACIÓN ORIENTADA A OBJETOS Modelo computacional Internado Médico Internación SignosVitales 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. Control Introducción a la Programación Orientada a Objetos IPOO - 2016 9
10
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 Introducción a la Programación Orientada a Objetos IPOO - 2016 10
11
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CALIDAD DE SOFTWARE La calidad de un producto de software puede definirse como su capacidad para satisfacer los requisitos establecidos durante el desarrollo de requerimientos. La calidad puede medirse de acuerdo a distintos factores. Algunos de estos factores son percibidos por el usuario o cliente. Otros factores son transparentes para el usuario o cliente, aunque por supuesto lo afectan indirectamente. Introducción a la Programación Orientada a Objetos IPOO - 2016 11
12
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CALIDAD DE SOFTWARE Un producto de software correcto actúa de acuerdo a los requerimientos especificados. Un producto de software es eficiente si tiene una baja demanda de recursos de hardware, en particular tiempo de CPU, espacio de memoria y ancho de banda. Un producto de software es portable si puede ejecutarse sobre diferentes plataformas de hardware y de software. Introducción a la Programación Orientada a Objetos IPOO - 2016 12 Correctitud Eficiencia Portabilidad
13
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CALIDAD DE SOFTWARE Un producto de software es simple si es fácil de usar, su interfaz es amigable y no requiere demasiado entrenamiento ni capacitación por parte del usuario. Un producto de software es robusto si reacciona adecuadamente aun en circunstancias no especificadas en los requerimientos. La legibilidad está fuertemente ligada a modularización y la estructura del código. La legibilidad impacta en la reusabilidad y la extensibilidad. 13 Simplicidad Robustez Legibilidad
14
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 PRODUCTIVIDAD DE SOFTWARE Un producto de software es extensible si es fácil adaptarlo a cambios en la especificación de requerimientos. El primer requerimiento para la extensibilidad es la legibilidad. Un módulo de software es reusable si puede utilizarse para la construcción de diferentes aplicaciones. 14 Extensibilidad Reusabilidad La herencia y el polimorfismo favorecen la productividad. Introducción a la Programación Orientada a Objetos IPOO - 2016
15
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 una clase de otra. Introducción a la Programación Orientada a Objetos IPOO - 2016 15
16
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 16
17
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 17
18
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 18
19
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 HERENCIA Introducción a la Programación Orientada a Objetos IPOO - 2016 19 Empleado iniciarTurno(t:Turno) finTurno (t:Turno) Asistencial administrarFarmaco(p:Paciente,f:Farmaco) controlarPaciente(p:Paciente):Control masAntiguo(a:Asistencial):boolean Médico indicarInternacion(p:Paciente):Internacion prescribirFarmaco(p:Paciente):Farmaco controlarPaciente(p:Paciente):Control
20
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 HERENCIA 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 20
21
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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){} } 21
22
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 HERENCIA EN JAVA 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 22 Paciente p = new Paciente(…); Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Farmaco f = v2.prescribirFarmaco(p);
23
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 HERENCIA EN JAVA Las instancias de la clase Medico son también instancias de la clase Asistencial y de la clase Empleado. Introducción a la Programación Orientada a Objetos IPOO - 2016 23 Paciente p = new Paciente(…); Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Farmaco f = v2.prescribirFarmaco(p); La clase derivada Medico hereda los métodos definidos en la clase base Asistencial. v1.administrarFarmaco(p,f); v2.administrarFarmaco(p,f);
24
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 24
25
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 REDEFINICIÓN EN JAVA En Java un 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 25
26
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 REDEFINICIÓN EN JAVA Introducción a la Programación Orientada a Objetos IPOO - 2016 26 class Asistencial extends Empleado{ … public Control controlarPaciente(Paciente p){} } class Medico extends Asistencial{ … public Control controlarPaciente(Paciente p){} }
27
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 POLIMORFISMO El concepto de polimorfismo es central en la programación orientada a objetos. Polimorfismo significa muchas formas y en ciencias de la computación en particular se refiere a En el contexto de la programación orientada a objetos el polimorfismo está relacionado con variables, asignaciones y métodos. Introducción a la Programación Orientada a Objetos IPOO - 2016 27 “la capacidad de asociar diferentes definiciones a un mismo nombre, de modo que el contexto determine cuál corresponde usar”.
28
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 POLIMORFISMO EN JAVA Introducción a la Programación Orientada a Objetos IPOO - 2016 28 Una variable polimórfica puede quedar asociada a objetos de diferentes clases. Una asignación polimórfica liga un objeto de una clase a una variable declarada de otra clase. Un método polimórfico incluye una o más variables polimórficas como parámetro.
29
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 ASIGNACIÓN POLIMÓRFICA Una asignación polimórfica liga un objeto de una clase a una variable declarada de otra clase. Son válidas las siguientes asignaciones polimórficas: Introducción a la Programación Orientada a Objetos IPOO - 2016 29 Empleado v0; Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); v0 = v1; v0 = v2; v1 = v2; v0 = new Asistencial(…); v0 = new Medico(…); v1 = new Medico(…);
30
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 TIPO ESTÁTICO Y DINÁMICO Dado que una variable puede estar asociada a objetos de diferentes tipos, distinguiremos entre: El tipo estático de una variable, es el tipo que aparece en la declaración. El tipo dinámico de una variable se determina en ejecución y corresponde a la clase a la que corresponde el objeto referenciado. Introducción a la Programación Orientada a Objetos IPOO - 2016 30 El tipo estático de una variable determina: el conjunto de tipos dinámicos a los que puede quedar asociada y los mensajes que puede recibir.
31
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 TIPO ESTÁTICO Y DINÁMICO 31 Tipo EstáticoTipos Dinámicos Empleado Asistencial Medico AsistencialAsistencial Medico Medico Empleado Asistencial Médico
32
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 TIPO ESTÁTICO Y DINÁMICO 32 Empleado v0 = new Asistencial(…); Asistencial v1 = new Medico(…); Medico v2 = new Medico(…); Empleado v3 = new Medico(…); VariableTipo Estático Tipo Dinámico v0EmpleadoAsistencial v1AsistencialMedico v2Medico v3EmpleadoMedico Introducción a la Programación Orientada a Objetos IPOO - 2016
33
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 MÉTODO POLIMÓRFICO El pasaje de parámetros puede involucrar una asignación polimórfica: El método definido en la clase Asistencial como: Puede usarse con un argumento de clase Medico : Introducción a la Programación Orientada a Objetos IPOO - 2016 33 Asistencial v1 = new Asistencial(); Medico v2 = new Medico(); public boolean masAntiguo(Asistencial e){…} v1.masAntiguo(v2);
34
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Polimorfismo, redefinición de métodos y ligadura dinámica de código son conceptos fuertemente ligados. La posibilidad de que una variable pueda referenciar a objetos de diferentes clases y de que existan varias definiciones para una misma signatura, brinda flexibilidad al lenguaje siempre que además exista ligadura dinámica de código. Introducción a la Programación Orientada a Objetos IPOO - 2016 34
35
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 HERENCIA EN JAVA Introducción a la Programación Orientada a Objetos IPOO - 2016 35 Paciente p = new Paciente(…); Control c; Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Asistencial v3 = new Medico(…); El tipo dinámico determina la ligadura entre el mensaje y el método. c = v1.controlarPaciente(p); c = v2.controlarPaciente(p); c = v3.controlarPaciente(p); Asistencial Medico
36
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CHEQUEO DE TIPOS EN JAVA El polimorfismo es un mecanismo que favorece la reusabilidad pero debe restringirse para brindar robustez En Java el polimorfismo y la ligadura dinámica quedan restringidos por el chequeo de tipos. Los chequeos de tipos en compilación 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 Introducción a la Programación Orientada a Objetos IPOO - 2016 36
37
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CHEQUEO DE TIPOS EN JAVA Introducción a la Programación Orientada a Objetos IPOO - 2016 37 Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Asistencial v3 = new Medico(…); El tipo estático restringe las asignaciones polimórficas. v2 = v1; v2 = v3; v2 = new Asistencial(…); ERROR
38
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CHEQUEO DE TIPOS EN JAVA Introducción a la Programación Orientada a Objetos IPOO - 2016 38 Paciente p = new Paciente(…); Farmaco f; Asistencial v1 = new Asistencial(…); Medico v2 = new Medico(…); Asistencial v3 = new Medico(…); El tipo estático determina los mensajes que el objeto puede recibir. f = v1.prescribirFarmaco(p); f = v2.prescribirFarmaco(p); f = v3.prescribirFarmaco(p); ERROR
39
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CHEQUEO DE TIPOS EN JAVA El pasaje de parámetros puede involucrar una asignación polimórfica: El método definido en la clase Asistencial como: No es válido: Introducción a la Programación Orientada a Objetos IPOO - 2016 39 Asistencial v1 = new Asistencial(); Empleado v2 = new Medico(); public boolean masAntiguo(Asistencial e){…} v1.masAntiguo (v2);
40
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 40
41
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 41
42
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 42 Contenedor obtenerVolumen():real obtenerDensidad():real obtenerImpacto():real Contaminante obtenerToxicidad():real obtenerImpacto():real Terreno colocar(c:Contenedor,f,c:entero) retirar(f,c:entero):Contenedor impactoTerreno():real hayContenedor(f,c:entero):boolean
43
Introducción a la Programación Orientada a Objetos IPOO - 2016 43 Contenedor > volumen: real densidad: real > Contenedor(v: real, d: real) > obtenerVolumen(): real obtenerDensidad(): real obtenerImpacto(): real Contaminante > toxicidad:real > Contaminante(v, d, t: real) > obtenerToxicidad(): real obtenerImpacto(): real Terreno > T [][] Contenedor > Terreno(n: entero) > colocar(c: Contenedor, f, c: entero) retirar(f, c: entero): Contenedor > hayContenedor(f, c: entero): boolean impactoTerreno(): real
44
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 44 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;} public float obtenerImpacto(){ return volumen*densidad/2;}}
45
Introducción a la Programación Orientada a Objetos IPOO - 2016 45 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;} 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.
46
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 46 class Contenedor { public String toString(){ return volumen+” “+densidad; } class Contaminante extends Contenedor { public String toString(){ return super.toString()+” “+toxicidad; }
47
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 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. Introducción a la Programación Orientada a Objetos IPOO - 2016 47 class Terreno{ //atributos de instancia private Contenedor [][]T ; //constructor public Terreno (int n){ T = new Contenedor[n][n]; }
48
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS. 48 //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){ //Requiere la posición válida 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.
49
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 49 //consultas public boolean hayContenedor(int f,int c){ return T[f][c] != null; }
50
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 50 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.
51
Introducción a la Programación Orientada a Objetos IPOO - 2016 51 Terreno > T [][] Contenedor > Terreno(n:entero) > colocar (c:Contenedor,f,c:entero) retirar(f,c:entero):Contenedor > hayContenedor(f,c:entero):boolean impactoTerreno():real mayorToxicidad():real filasMellizas(otro:Terreno):boolean Computa la mayor toxicidad entre los contenedores contaminantes. Si no se registra toxicidad retorna 0. 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
52
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 52 La segunda fila hace que se verifique la propiedad filasMellizas.
53
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 53 La tercera fila hace que se verifique la propiedad filasMellizas
54
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 54 No se verifica la propiedad
55
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Introducción a la Programación Orientada a Objetos IPOO - 2016 55 //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.
56
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 56 //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.
57
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS Computa true si T[i][j] mantiene una referencia a un objeto de clase Contaminante. La asignación es válida porque el casting relaja el control del compilador. El mensaje es válido porque el tipo estático de c es Contaminante. Introducción a la Programación Orientada a Objetos IPOO - 2016 57 if (T[i][j] instanceof Contaminante) c = (Contaminante) T[i][j]; mayor = c.obtenerToxicidad();
58
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 58 //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.
59
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 59 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
60
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 60 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.
61
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: GESTIÓN RESIDUOS 61 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.
62
62 //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.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.