Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porÁngel Ruiz Venegas 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 Caso de estudio: M.E. en un Hospital 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 2015
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL En un hospital cada una de los pasillos tiene un número asignado entre 1 y la cantidad total. Cada pasillo tiene previsto un espacio para colocar una máquina expendedora, aunque no todos los pasillos tienen una. La clase MEHospital modela la tabla de máquinas expendedoras asignadas a los pasillos y brinda servicios para computar la cantidad total de café que contienen las máquinas y la cantidad total de leche entre los modelos M111. Introducción a la Programación Orientada a Objetos IPOO - 2015 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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL 3 MaquinaExpendedora R101M111 R101Plus Introducción a la Programación Orientada a Objetos IPOO - 2015 MEHospital
4
4 > MaquinaExpendedora[] T > MEHospital(max: entero) > instalar(unaME: MaquinaExpendedora, p: entero) retirar(p:entero) > cantPasillos(): entero cantPasillosOcupados(): entero hayPasillosLibres(): boolean todosOcupados(): boolean existeME(unaME: MaquinaExpendedora): boolean totalCafe(): entero totalLeche(): entero Decide si hay una máquina equivalente a unaME
5
5 public boolean existeME (MaquinaExpendedora unaMe){ /* Decide si hay una ME equivalente a unaMe, que asume ligada*/ int i = 0; boolean esta = false; while (i < cantPasillos() && !esta){ if (T[i] != null) esta = T[i].equals(unaMe); i++; } return esta; } El mensaje equals debe ligarse con el método que corresponda a la clase del objeto asociado T[i], es decir, equals debe estar redefinido en cada clase que herede a MaquinaExpendedora.
6
6 * MaquinaExpendedora > maxCafe: entero maxTe: entero maxCacao: entero > NroSerie: entero cantCafe: entero cantCacao: entero cantTe: entero > MaquinaExpendedora(ns: entero) > cafe() te() cargarCafe(grs: entero): entero… > equals(unaMe: MaquinaExpendedora): boolean Decide si hay una máquina equivalente a unaME. Asume unaMe ligada
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL 7 abstract class MaquinaExpendedora{ public boolean equals(MaquinaExpendedora unaMe){ /* Decide si la máquina es equivalente a unaMe. Asume unaMe ligada */ return nroSerie() == unaMe.obtenerNroSerie()&& cantCafe() == unaMe.obtenerCantCafe() && cantCacao() == unaMe.obtenerCantCacao()&& cantTe() == unaMe.cantCantTe(); } } Introducción a la Programación Orientada a Objetos IPOO - 2015
8
8 M111 > maxLeche: entero … > cantLeche: entero … > M111(ns: entero) > te() teConLeche subMarino()… cargarLeche(grs: entero): entero… > equals(unaMe: MaquinaExpendedora): boolean obtenerCantLeche(): entero… obtenerMaxLeche(): entero … vasosTeConLeche(): entero Decide si la máquina es equivalente a unaMe. Asume unaMe ligada
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Si el método equals tiene la misma signatura que el método provisto por MaquinaExpendedora, queda redefinido. absract class MaquinaExpendedora{ public boolean equals(MaquinaExpendedora unaMe){ … } } class M111 extends MaquinaExpendedora{ public boolean equals(MaquinaExpendedora unaMe){ … } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Consideramos dos máquinas del modelo M111 equivalentes si los atributos generales y los específicos son iguales. El compilador rechaza el mensaje unaMe.obtenerCantLeche() porque unaMe es de clase MaquinaExpendedora. class M111{ public boolean equals(MaquinaExpendedora unaMe){ /* Decide si la máquina es equivalente a unaMe. Asume unaMe ligada */ return super.equals(unaMe) && cantLeche() == unaMe.obtenerCantLeche(); } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL El compilador acepta el mensaje e.obtenerCantLeche() porque e es de clase M111. Sin embargo, esta implementación no es adecuada para nuestro problema. class M111{ public boolean equals(M111 unaMe){ /* Decide si la máquina es equivalente a unaMe. Asume unaMe ligada */ return super.equals(unaMe) && cantLeche() == unaMe.obtenerCantLeche(); } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Si el método equals tiene distinta signatura que el método provisto por MaquinaExpendedora, queda sobrecargado. absract class MaquinaExpendedora{ public boolean equals(MaquinaExpendedora unaMe){ … } } class M111 extends MaquinaExpendedora{ public boolean equals(M111 unaMe){ … } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Si el método equals está sobrecargado es el tipo estático del parámetro el que determina la ligadura. Siempre se ejecutará el método definido en MaquinaExpendedora. public boolean existeME (MaquinaExpendedora unaMe){ /* Decide si hay una ME equivalente a unaMe, que asume ligada*/ int i = 0; boolean esta=false; while (i < cantPasillos() && !esta){ if (T[i] != null) esta = T[i].equals(unaMe); i++; } return esta; }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Necesitamos que: – equals esté definido en MaquinaExpendedora y redefinido en cada clase derivada, es decir, que tenga la misma signatura. –En la implementación de equals en la clase M111 tenemos que acceder a cantLeche. Introducción a la Programación Orientada a Objetos IPOO - 2015 14
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Este método se ejecuta si un objeto de clase M111 recibe el mensaje equals. Para decidir si ese objeto es igual al parámetro es necesario considerar que el parámetro sea también de clase M111. class M111{ public boolean equals(MaquinaExpendedora unaMe){ // Asume unaMe ligada boolean ig = false; if (getClass() == unaMe.getClass()){ M111 r = (M111) unaMe; ig = super.equals(unaMe) && cantLeche() == r.obtenerCantLeche(); } return ig; } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL Analizar en qué caso no es correcta esta versión class M111{ public boolean equals(MaquinaExpendedora unaMe){ /* Decide si la máquina es equivalente a unaMe. Asume unaMe ligada */ boolean ig = false; if (unaMe instanceof M111){ M111 r = (M111) unaMe; ig = super.equals(unaMe) && cantLeche() == r.obtenerCantLeche(); } return ig; } }
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL 17 :M111 t NroSerie cantCafé cantTe cantCacao cantLeche :R101 NroSerie cantCafé cantTe cantCacao cantCrema :R101Plus NroSerie cantCafé cantTe cantCacao cantCrema cantCanela
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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL En este caso el diseñador considera que dos máquinas son equivalentes si tienen el mismo número de serie. El atributo nroSerie es la clave. El método igualNroSerie solo se define en la clase MaquinaExpendedora. public boolean existeME (MaquinaExpendedora unElem){ /* Decide si hay un elemento equivalente a unElem, que asume ligada*/ int i = 0; boolean esta=false; while (i < cantPasillos() && !esta){ if (T[i] != null) esta = T[i].igualNroSerie(unaMe); i++; } return esta; }
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.