Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porFrancisco Agüero Cáceres 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 CASO DE ESTUDIO: EXPENDEDORA CAFÉ Una fábrica produce tres tipos diferentes de máquinas expendedoras de café, M111, R101 y R101Plus. Las máquinas del tipo M111 preparan café y café con leche. Tienen depósitos para los siguientes ingredientes secos: café y leche. Las máquinas de tipo R101 preparan café, y café carioca. Tienen depósitos para café, crema y cacao. El modelo R101Plus agrega el café bahiano, que es un café carioca con canela y prepara un café más fuerte. Tiene depósito para canela. Los tres modelos tienen un depósito de agua. 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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ Los depósitos tienen las siguientes capacidades máximas: Agua1500 mililitros Café1500 gramos Leche 600 gramos Cacao300 gramos Crema 600 gramos Canela300 gramos Además de la capacidad máxima de cada ingrediente, cada máquina mantiene registro de la cantidad disponible. 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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ Cuando se habilita una máquina las cantidades disponibles comienzan con el valor máximo de cada ingrediente. La cantidad disponible aumenta cuando se carga el depósito con un ingrediente específico y disminuye cada vez que se prepara un café. Cuando se recarga se completa el depósito hasta su máxima capacidad. Introducción a la Programación Orientada a Objetos IPOO - 2016 4
5
*ExpendedoraCafe M111 R101R101Plus M111 R101R101Plus
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ La clase más general incluye los atributos compartidos por todas las instancias: 6 *ExpendedoraCafe > maxCafe : entero maxAgua:entero > cantCafé : entero cantAgua:entero ExpendedoraCafe no modela a ninguna máquina, es un recurso artificial creado para reusar.
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: EXPENDEDORA DE CAFÉ La clase más general incluye los atributos compartidos por todas las instancias: 7 *ExpendedoraCafe > ExpendedoraCafe() > cafe() recargarCafe() recargarAgua() > vasosCafe():entero Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ En el diseño la clase ExpendedoraCafe permite factorizar los atributos y comportamiento que comparten todas las máquinas de la fábrica. La clase ExpendedoraCafe es entonces abstracta, en la aplicación no hay entidades de esa clase y en ejecución no habrá objetos de software de esa clase. Toda clase abstracta tiene que especializarse en al menos una clase concreta, esto es una clase que modele a entidades del problema. 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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 9 M111 > maxLeche:entero > cantLeche:entero > M111() > cafeConLeche() recargarLeche() > vasosCafeConLeche():entero Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café, 20 de leche y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito
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: EXPENDEDORA DE CAFÉ 10 R101 > maxCrema:entero maxCacao:entero > cantCrema:entero cantCacao:entero > R101() > carioca() recargarCrema() recargarCacao() > vasosCarioca():entero Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 30 grs. de café, 30 de crema, 10 de cacao y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito
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: EXPENDEDORA DE CAFÉ 11 R101Plus > maxCanela:entero > cantCanela:entero > R101Plus() > bahiano() café() recargarCanela() > vasosCafe():entero vasosBahiano():entero Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible para un café Carioca y 10 gramos de canela Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito Require disponible 50 grs. de café y 200 ml de agua.
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: EXPENDEDORA DE CAFÉ 12 abstract class ExpendedoraCafe { //atributos de clase //gramos protected static final int maxCafe = 1500; //mililitros protected static final int maxAgua = 1500; //atributos de instancia protected int cantCafe; protected int cantAgua; Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ 13 //Constructor de ExpendedoraCafe public ExpendedoraCafe() { //Cada depósito se carga completo cantCafe = maxCafe; cantAgua = maxAgua; } Como la clase es abstracta el constructor solo será accedido desde las clases derivadas. Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ 14 //Comandos de ExpendedoraCafe public void cafe() { /*Requiere disponibles 40 gramos de café y 200 ml de agua*/ cantCafe = cantCafe – 40; cantAgua = cantAgua – 200; } public void recargarCafe() { //Carga el depósito completo cantCafe = maxCafe; } public void recargarAgua() { //Carga el depósito completo cantAgua = maxAgua;}
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: EXPENDEDORA DE CAFÉ 15 //Consultas de ExpendedoraCafe public int vasosCafe() { /*Computa cuántos vasos de café pueden prepararse con las cantidades disponibles*/ int c = (int) cantCafe / 40; int a = (int) cantAgua / 200; if (c < a) return c; else return a; } En este caso de estudio la clase es abstracta aun cuando NINGUNO DE LOS MÉTODOS ES ABSTRACTO. Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ La clase M111 está vinculada a la clase abstracta ExpendedoraCafe por una relación de herencia. Todo objeto de clase M111 es también una instancia de la clase ExpendedoraCafe. 16 class M111 extends ExpendedoraCafe { //atributos de clase //gramos protected static final int maxLeche = 600; //atributos de instancia protected int cantLeche; Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ Una clase derivada hereda de la clase base todos sus atributos y métodos, pero no los constructores. Cada constructor de la clase derivada puede usar invocar a un constructor de la clase base usando palabra clave super. Si se invoca un constructor de la clase base siempre tiene que ser en la primera línea del bloque de código. 17 //Constructor de M111 public M111() { //Cada depósito se carga completo super(); cantLeche = maxLeche; } Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ El estado interno de cada objeto de clase M111 incluye los atributos definidos en esa clase más los atributos heredados de ExpendedoraCafe. Un objeto de clase M111 puede recibir cualquiera de los mensajes que corresponden a su comportamiento, pero además hereda el comportamiento de sus clases ancestro. 18 cantCafe cantAgua cantLeche :M111
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 19 //Comandos de M111 public void cafeConLeche() { /*Requiere disponibles 40 gramos de café, 200 ml de agua y 20 grs de leche*/ cafe(); cantLeche = cantLeche -20; } public void recargarLeche() { //Carga el depósito completo cantLeche = maxLeche; } Introducción a la Programación Orientada a Objetos IPOO - 2016
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 20 //Consultas de M111 public int vasosCafeConLeche() { /*Computa cuántos vasos de café con leche pueden prepararse con las cantidades disponibles*/ int c = vasosCafe(); int l = (int) cantLeche / 20; if (c < l) return c; else return l; } Introducción a la Programación Orientada a Objetos IPOO - 2016
21
21 class R101 extends ExpendedoraCafe { //atributos de clase //gramos protected static final int maxCrema = 600; protected static final int maxCacao = 300; //atributos de instancia protected int cantCrema; protected int cantCacao; //Constructor de R101 public R101() { //Cada depósito se carga completo super(); cantCacao = maxCacao; cantCrema = maxCrema; }
22
22 //Comandos de R101 public void carioca() { /*Requiere disponibles 30 gramos de café, 200 ml de agua, 30 de crema y 10 grs de cacao*/ cantCafe = cantCafe -30; cantAgua = cantAgua -200; cantCrema = cantCrema -30; cantCacao = cantCacao -10; } public void recargarCrema() { //Carga el depósito completo cantCrema = maxCrema; } public void recargarCacao() { //Carga el depósito completo cantCacao = maxCacao; }
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ En el problema, Las máquinas R101 y M111 ofrecen café. En la solución, las clases R101 y M111 heredan los atributos de instancia y los servicios de la clase abstracta ExpendedoraCafe, de modo que un objeto de cualquiera de esas clases puede recibir el mensaje cafe(). 23 R101 m1 = new R101 (); M111 m2 = new M111(); m1.cafe(); m2.cafe(); Introducción a la Programación Orientada a Objetos IPOO - 2016
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ En el problema, solo las máquinas del modelo M111 ofrecen café con leche. En la solución, solo los objetos de clase M111 pueden recibir el mensaje cafeConLeche. 24 R101 m1 = new R101 (); M111 m2 = new M111(); m1.cafeConLeche(); m2.cafeConLeche(); Introducción a la Programación Orientada a Objetos IPOO - 2016 ERROR de compilación
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ El método cafe() de la clase ExpendedoraCafe queda derogado para los objetos de clase R101Plus. 25 R101 m1 = new R101(); R101Plus m2 = new R101Plus(); m1.cafe(); m2.cafe(); Introducción a la Programación Orientada a Objetos IPOO - 2016 Se liga al método definido en ExpendedoraCafe
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ La ligadura entre el mensaje y el método se establece en ejecución de acuerdo al tipo dinámico de la variable. 26 R101 m1 = new R101(); R101 m3 = new R101Plus(); m1.cafe(); m3.cafe(); Introducción a la Programación Orientada a Objetos IPOO - 2016 Se liga al método definido en ExpendedoraCafe Se liga al método definido en R101Plus
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 27 R101 m1 = new R101(); R101Plus m2 = new R101Plus(); m1.carioca(); m2.carioca(); m1.bahiano(); m2.bahiano(); Introducción a la Programación Orientada a Objetos IPOO - 2016 ERROR de compilación
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 28 R101 m1 = new R101(); R101 m3 = new R101Plus(); m1.bahiano(); m3.bahiano(); Introducción a la Programación Orientada a Objetos IPOO - 2016 ERROR de compilación El chequeo de tipos se realiza en compilación de acuerdo al tipo estático de la variable.
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 29 ExpendedoraCafe e; e = new ExpendedoraCafe(); Introducción a la Programación Orientada a Objetos IPOO - 2016 ERROR de compilación La clase ExpendedoraCafe es abstracta, no pueden crearse objetos.
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 30 ExpendedoraCafe e1,e2,e3; e1 = new M111(); e2 = new R101(); e3 = new R101Plus(); Introducción a la Programación Orientada a Objetos IPOO - 2016 Las variables e1, e2 y e3 son polimórficas, como la clase ExpendedoraCafe es abstracta, solo pueden quedar ligadas a objetos de las clases derivadas.
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 31 ExpendedoraCafe e1,e2,e3; e1 = new M111(); e2 = new R101(); e3 = new R101Plus(); e1.cafe(); e2.cafe(); e3.cafe(); Introducción a la Programación Orientada a Objetos IPOO - 2016 Se liga al método definido en ExpendedoraCafe Se liga al método definido en R101Plus La clase del objeto determina la ligadura entre el mensaje y el método.
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 32 ExpendedoraCafe e1,e2,e3; e1 = new M111(); e2 = new R101(); e3 = new R101Plus(); e1.cafeConLeche(); e2.carioca(); e3.bahiano(); Introducción a la Programación Orientada a Objetos IPOO - 2016 ERRORES de compilación El tipo de la variable determina los mensajes que puede recibir el objeto.
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ Como parte de sus actividades de responsabilidad social la fábrica instala y mantiene en funcionamiento las máquinas expendedoras de café de algunos hospitales. Cada máquina se asigna a un sector del hospital y el encargado realiza un relevamiento que le permite instalar nuevas máquinas, desinstalar y efectuar consultas. Introducción a la Programación Orientada a Objetos IPOO - 2016 33
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 CASO DE ESTUDIO: EXPENDEDORA CAFÉ Introducción a la Programación Orientada a Objetos IPOO - 2016 34 *ExpendedoraCafe M111 R101 R101Plus ExpHospital
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 CASO DE ESTUDIO: EXPENDEDORA CAFÉ Introducción a la Programación Orientada a Objetos IPOO - 2016 35 ExpHospital T [] ExpendedoraCafe > ExpHospital (max : entero) > instalar(r: ExpendedoraCafe, s: entero) desinstalar(s: entero)
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 CASO DE ESTUDIO: EXPENDEDORA CAFÉ Introducción a la Programación Orientada a Objetos IPOO - 2016 36 ExpHospital T [] ExpendedoraCafe > cantSectores(): entero cantSectoresOcupados(): entero todosOcupados(): boolean estaExpendedoraCafe(r: ExpendedoraCafe): boolean existeSector(s: entero): boolean cantDisponible(vasos: entero): entero
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 CASO DE ESTUDIO: EXPENDEDORA CAFÉ cantSectoresOcupados(): entero La especificación: Retorna la cantidad de sectores del hospital que tienen instalada a una máquina Es equivalente a: Retorna la cantidad de componentes del arreglo que mantienen referencias ligadas. Introducción a la Programación Orientada a Objetos IPOO - 2016 37 ExpHospital T [] ExpendedoraCafe
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 38 class ExpHospital { private ExpendedoraCafe[] T; //Constructor public ExpHospital(int max) { /*Crea un arreglo con max elementos, cada elemento representa un sector de la fábrica*/ T= new ExpendedoraCafe [max]; }... } Introducción a la Programación Orientada a Objetos IPOO - 2016
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 CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ 39 public void instalar(ExpendedoraCafe r, int s) { /*Asigna el la máquina r al sector s. Requiere 0<=s<cantSectores() */ T[s] = r; } Introducción a la Programación Orientada a Objetos IPOO - 2016 public void desinstalar(int s) { /*Elimina la asignación de la máquina r del sector s. Requiere 0<=s<cantSectores()*/ T[s] = null; }
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: EXPENDEDORA DE CAFÉ 40 public int cantSectores(){ return T.length; } public int cantSectoresOcupados (){ /*Computa la cantidad de sectores que tienen una máquina instalada*/ int i = 0; int cant = 0; while (i < cantSectores()){ if (T[i]!=null) cant++; i++; } return cant; } Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ 41 public boolean todosOcupados (){ /*Retorna true si hay al menos un sector que no tiene una máquina instalada*/ int i = 0; boolean hayNulo= false; while (i<cantSectores() && !hayNulo ){ hayNulo = T[i]==null; i++; } return !hayNulo; } El arreglo T es una estructura de datos polimórficas, todos los elementos son instancias de alguna clase derivada de ExpendedoraCafe.
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: EXPENDEDORA DE CAFÉ 42 public boolean estaExp(ExpendedoraCafe r){ /* Decide si algún sector tiene asignado una máquina con la misma identidad que r */ int i = 0; boolean esta = false; while (i < cantSectores() && !esta ){ esta = T[i] == r ; i++; } return esta; } Introducción a la Programación Orientada a Objetos IPOO - 2016
43
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: EXPENDEDORA DE CAFÉ 43 public boolean existeSector (int s){ return s>= 0 & s< cantSectores(); } public ExpendedoraCafe expSector (int s){ /*Retorna la máquina instalada en el sector s, requiere 0<=s<cantSectores()*/ return T[s]; } Introducción a la Programación Orientada a Objetos IPOO - 2016
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: EXPENDEDORA DE CAFÉ 44 public int cantDisponible(int n){ /*Cuenta los sectores con máquinas con ingredientes para preparar al menos n vasos de café*/ int cont =0; for (int i=0;i<cantSectores();i++) if (T[i] != null) if(T[i].vasosCafe() > n) cont++; return cont; } El mensaje vasosCafe() se liga al método definido en la clase del objeto referenciado por T[i]
45
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: EXPENDEDORA DE CAFÉ 45 class gestionHospital{ … ExpHospital eh = new ExpHospiral(10); M111 m1 = new M111(); R101Plus m2 = new R101Plus(); eh.instalar(m1,4); eh.instalar(m2,1); } Introducción a la Programación Orientada a Objetos IPOO - 2016
46
46 :R101Plus m1 m2 10 T :M111 eh :ExpHospital
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: EXPENDEDORA CAFÉ 47 ExpHospital T [] ExpendedoraCafe > cantSectores(): entero cantSectoresOcupados(): entero todosOcupados(): boolean estaExpendedoraCafe(r: ExpendedoraCafe): boolean existeSector(s: entero): boolean cantDisponible(vasos: entero): entero cantEquivalentes(e: ExpendedoraCafe) Computa la cantidad de máquinas instaladas en el hospital, equivalentes a e.
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: EXPENDEDORA DE CAFÉ 48 public int cantEquivalente(ExpendedoraCafe c){ /*Cuenta los sectores tienen asignadas máquinas equivalentes a c. Requiere c ligada*/ int cont =0; for (int i=0;i<cantSectores();i++) if (T[i] != null) if(T[i].equals(c)) cont++; return cont; } Introducción a la Programación Orientada a Objetos IPOO - 2016
49
49 *ExpendedoraCafe > maxCafe : entero maxAgua:entero > cantCafé : entero cantAgua:entero > ExpendedoraCafe() > cafe() recargarCafe() recargarAgua() > vasosCafe():entero obtenerCafe():entero obtenerAgua():entero equals(e:ExpendedoraCafe) Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito Dos máquinas son equivalentes si tienen la misma cantidad de café y la misma cantidad de agua.
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: EXPENDEDORA DE CAFÉ 50 abstract class ExpendedoraCafe{ public boolean equals (ExpendedoraCafe e){ return cantCafe == e.obtenerCafe()&& cantAgua == e.obtenerAgua(); } Introducción a la Programación Orientada a Objetos IPOO - 2016
51
51 M111 > maxLeche:entero > cantLeche:entero > M111() > cafeConLeche() recargarLeche() > vasosCafeConLeche():entero obtenerLeche() equals(e:M111):boolean Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café, 20 de leche y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito Dos máquinas son equivalente si tienen las mismas cantidades en depósito, para cada ingrediente
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: EXPENDEDORA DE CAFÉ 52 abstract class ExpendedoraCafe{ //Requiere e ligado public boolean equals (ExpendedoraCafe e){ return cantCafe == e.obtenerCafe()&& cantAgua == e.obtenerAgua(); } class M111 extends ExpendedoraCafe{ //Requiere e ligado public boolean equals (M111 e){ return super.equals(e) && cantLeche == e.obtenerLeche(); } El método está sobrecargado, el tipo estático de la variable determina el método que se liga.
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: EXPENDEDORA DE CAFÉ 53 public int cantEquivalente(ExpendedoraCafe c){ /*Cuenta los sectores tienen asignadas máquinas equivalentes a c. Requiere c ligada*/ int cont =0; for (int i=0;i<cantSectores();i++) if (T[i] != null) if(T[i].equals(c)) cont++; return cont; } El mensaje equals siempre se liga al método definido en ExpendedoraCafe.
54
M111 > maxLeche:entero > cantLeche:entero > M111() > cafeConLeche() recargarLeche() > vasosCafeConLeche():entero obtenerLeche() equals(e:ExpendedoraCafe):boolean Se carga el depósito completo Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café, 20 de leche y 200 ml de agua. Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito
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: EXPENDEDORA DE CAFÉ 55 public int cantEquivalente(ExpendedoraCafe c){ /*Cuenta los sectores tienen asignadas máquinas equivalentes a c. Requiere c ligada*/ int cont =0; for (int i=0;i<cantSectores();i++) if (T[i] != null) if(T[i].equals(c) > n) cont++; return cont; } La ligadura depende de la clase del objeto ligado a T[i]. Es necesario considerar el caso de que la clase de T[i] y la clase de c sean diferentes.
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: EXPENDEDORA DE CAFÉ 56 class M111 extends ExpendedoraCafe{ public boolean equals (ExpendedoraCafe e){ //Requiere e ligado boolean es = false; if (this.getClass() == e.getClass()){ M111 m = (M111) e; es = super.equals(m) && cantLeche.equals(m.obtenerLeche()); } return es; } El método está redefinido, el tipo dinámico de la variable determina el método que se liga.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.