IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería

Slides:



Advertisements
Presentaciones similares
Reusabilidad La productividad está basada en reusabilidad y extensibilidad El reusabilidad permite desarrollar nuevas aplicaciones a partir de componentes.
Advertisements

El proceso de desarrollo de software
Encapsulamiento y Abstracción
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Abstracción.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Abstracción.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
Introducción a la Programación Orientada a Objetos Sonia Rueda Herencia y Polimorfismo Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Programación Orientada a Objetos
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Programación orientada a objetos
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
Sonia Rueda Herencia y Polimorfismo
Sonia Rueda Herencia y Polimorfismo
IPOO 2 cuatrimestre 2016 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Sonia Rueda Herencia y Polimorfismo
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Clases y Objetos en Java
Transcripción de la presentación:

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

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.

Calidad de Software Correctitud Un producto de software correcto actúa de acuerdo a los requerimientos especificados. Eficiencia 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. Portabilidad Un producto de software es portable si puede ejecutarse sobre diferentes plataforma de hardware y de software.

Calidad de Software Simplicidad 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. Robustez Un producto de software es robusto se reacciona adecuadamente aun en circunstancias no especificadas en los requerimientos. Legibilidad La legibilidad está fuertemente ligada a modularización y la estructura del código. La legibilidad impacta en la reusabilidad y la extensibilidad.

Productividad de Software Extensibilidad 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. Reusabilidad Un módulo de software es reusable si puede utilizarse para la construcción de diferentes aplicaciones. Cuando hablamos de que es fácil de adaptar significa que pueden agregarse nuevos módulos con modificaciones mínimas sobre los anteriores. La verificación está también acotada. Observemos que cuando hablamos de reusabilidad no estamos hablando de la aplicación, sino de los módulos que conforman un sistema. Por ejemplo un módulo que brinde servicios para dibujar figuras geométricas puede ser usados en diferentes aplicaciones. El paradigma de programación orientada a objetos favorece la calidad y la productividad.

Paradigmas de Programación Un paradigma de programación es una colección de patrones conceptuales que orientan el proceso de desarrollo de software y determinan la estructura del sistema. Un paradigma puede ser caracterizado mediante un principio básico, fácil de formular. Para llevar a la práctica este principio, es necesario establecer una metodología y herramientas. Un paradigma guía y controla la forma en que un problema va a ser planteado y resuelto, provee una "filosofía de desarrollo“ para cada etapa del proceso. IPOO 2 cuatrimestre 2017

Programación Orientada a Objetos El principio de la programación orientada a objetos es construir software a partir de las entidades relevantes del problema. Durante la etapa de diseño se identifican a las entidades físicas y conceptuales relevantes del problema y se organizan en una estructura de clases de acuerdo a sus atributos y comportamiento. En la implementación un sistema orientado a objetos está constituido por una colección de clases relacionadas entre sí. En ejecución cada entidad del problema queda ligada a un objeto de software que lo modela. Los objetos se comunican a través de mensajes. Cada objeto tiene un estado interno y responde a una mensaje de acuerdo al comportamiento que determina su clase. IPOO 2 cuatrimestre 2017

Lenguajes Orientados a Objetos Un lenguaje orientado a objetos soporta los siguientes conceptos: Abstracción de datos Herencia Polimorfismo Vinculación dinámica Algunos lenguajes de programación restringen el nivel de polimorfismo a través de chequeo de tipos. IPOO 2 cuatrimestre 2017

Java Abstracción de datos clases y modificadores de acceso Herencia jerárquica simple para modelar la relación isa Polimorfismo de variables, asignaciones y métodos, restringido por el chequeo de tipos Vinculación dinámica entre variables y objetos, entre mensajes y métodos. IPOO 2 cuatrimestre 2017

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. IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café Los depósitos tienen las siguientes capacidades máximas: Agua 1500 mililitros Café 1500 gramos Leche 600 gramos Cacao 300 gramos Crema 600 gramos Canela 300 gramos Además de la capacidad máxima de cada ingrediente, cada máquina mantiene registro de la cantidad disponible.   IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora 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 una infusión. Cuando se recarga se completa el depósito hasta su máxima capacidad. IPOO 2 cuatrimestre 2017

M111 R101 R101Plus *ExpendedoraCafe M111 R101Plus R101

Caso de Estudio: Expendedora Café La clase más general incluye los atributos compartidos por todas las instancias: *ExpendedoraCafe <<atributos de clase>> maxCafe : entero maxAgua:entero <<atributos de instancia>> cantCafé : entero cantAgua:entero IPOO 2 cuatrimestre 2017 ExpendedoraCafe no modela a ninguna máquina, es un recurso artificial creado para reusar.

Caso de Estudio: Expendedora Café La clase más general incluye los servicios compartidos por todas las instancias: *ExpendedoraCafe <<Constructor>> ExpendedoraCafe() <<Comandos>> cafe() recargarCafe() recargarAgua() <<consultas>> vasosCafe():entero Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café y 200 ml de agua. IPOO 2 cuatrimestre 2017 Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Caso de Estudio: Expendedora 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.

Caso de Estudio: Expendedora Café M111 <<atributos de clase>> maxLeche:entero <<atributos de instancia>> cantLeche:entero <<Constructor>> M111() <<Comandos>> cafeConLeche() recargarLeche() <<consultas>> vasosCafeConLeche():entero Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café, 20 de leche y 200 ml de agua. IPOO 2 cuatrimestre 2017 Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Caso de Estudio: Expendedora Café <<atributos de clase>> maxCrema:entero maxCacao:entero <<atributos de instancia>> cantCrema:entero cantCacao:entero <<Constructor>> R101() <<Comandos>> carioca() recargarCrema() recargarCacao() <<consultas>> vasosCarioca():entero 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. IPOO 2 cuatrimestre 2017 Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito Las clases especializadas incluyen atributos y servicios específicos.

Caso de Estudio: Expendedora Café R101Plus <<atributos de clase>> maxCanela:entero <<atributos de instancia>> cantCanela:entero <<Constructor>> R101Plus() <<Comandos>> bahiano() café() recargarCanela() <<consultas>> vasosCafe():entero vasosBahiano():entero Las cantidades disponibles se inicializan con los máximos Require disponible para un café Carioca y 10 gramos de canela IPOO 2 cuatrimestre 2017 Require disponible 50 grs. de café y 200 ml de agua. Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Caso de Estudio: Expendedora Café 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; //Constructor de ExpendedoraCafe public ExpendedoraCafe() { //Cada depósito se carga completo cantCafe = maxCafe; cantAgua = maxAgua; } IPOO 2 cuatrimestre 2017 Como la clase es abstracta el constructor solo será accedido desde las clases derivadas.

Caso de Estudio: Expendedora Café //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() { cantAgua = maxAgua; IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café //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; } IPOO 2 cuatrimestre 2017 En este caso de estudio la clase es abstracta aun cuando NINGUNO DE LOS MÉTODOS ES ABSTRACTO.

Caso de Estudio: Expendedora Café class M111 extends ExpendedoraCafe { //atributos de clase //gramos protected static final int maxLeche = 600; //atributos de instancia protected int cantLeche; 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. IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café //Constructor de M111 public M111() { //Cada depósito se carga completo super(); cantLeche = maxLeche; } 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. IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café :M111 cantCafe cantAgua cantLeche 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. IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café //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; IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café //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; } IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café 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; } IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café //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() { cantCacao = maxCacao; } IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café R101 m1 = new R101 (); M111 m2 = new M111(); Introducción a la Programación Orientada a Objetos m1.cafe(); m2.cafe(); 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().

Caso de Estudio: Expendedora Café R101 m1 = new R101 (); M111 m2 = new M111(); Introducción a la Programación Orientada a Objetos m1.cafeConLeche(); m2.cafeConLeche(); Error de compilación 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.

Caso de Estudio: Expendedora Café R101 m1 = new R101(); R101Plus m2 = new R101Plus(); Introducción a la Programación Orientada a Objetos m1.cafe(); m2.cafe(); Se liga al método definido en ExpendedoraCafe Se liga al método definido en R101Plus El método cafe() de la clase ExpendedoraCafe queda derogado para los objetos de clase R101Plus.

Caso de Estudio: Expendedora Café R101 m1 = new R101(); R101 m3 = new R101Plus(); Introducción a la Programación Orientada a Objetos m1.cafe(); m3.cafe(); Se liga al método definido en ExpendedoraCafe Se liga al método definido en R101Plus La ligadura entre el mensaje y el método se establece en ejecución de acuerdo al tipo dinámico de la variable.

Caso de Estudio: Expendedora Café R101 m1 = new R101(); R101Plus m2 = new R101Plus(); Introducción a la Programación Orientada a Objetos m1.carioca(); m2.carioca(); m1.bahiano(); m2.bahiano(); Error de compilación

Caso de Estudio: Expendedora Café R101 m1 = new R101(); R101 m3 = new R101Plus(); Introducción a la Programación Orientada a Objetos m1.bahiano(); m3.bahiano(); Error de compilación Error de compilación El chequeo de tipos se realiza en compilación de acuerdo al tipo estático de la variable.

Caso de Estudio: Expendedora Café ExpendedoraCafe e; e = new ExpendedoraCafe(); Introducción a la Programación Orientada a Objetos Error de compilación La clase ExpendedoraCafe es abstracta, no pueden crearse objetos.

Caso de Estudio: Expendedora Café ExpendedoraCafe e1,e2,e3; e1 = new M111(); e2 = new R101(); e3 = new R101Plus(); Introducción a la Programación Orientada a Objetos 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.

Caso de Estudio: Expendedora Café ExpendedoraCafe e1,e2,e3; e1 = new M111(); e2 = new R101(); e3 = new R101Plus(); Introducción a la Programación Orientada a Objetos e1.cafe(); Se liga al método definido en ExpendedoraCafe e2.cafe(); Se liga al método definido en ExpendedoraCafe e3.cafe(); Se liga al método definido en R101Plus La clase del objeto determina la ligadura entre el mensaje y el método.

Caso de Estudio: Expendedora Café ExpendedoraCafe e1,e2,e3; e1 = new M111(): e2 = new R101(); e3 = new R101Plus(); Introducción a la Programación Orientada a Objetos e1.cafeConLeche(); ERRORES DE COMPILACION e2.carioca(); e3.bahiano(); El tipo de la variable determina los mensajes que puede recibir el objeto.

Caso de Estudio: Expendedora 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. IPOO 2 cuatrimestre 2017

Caso de Estudio: Expendedora Café *ExpendedoraCafe ExpHospital M111 R101 IPOO 2 cuatrimestre 2017 R101Plus

Caso de Estudio: Expendedora Café ExpHospital T [] ExpendedoraCafe <<constructores>> ExpHospital (max : entero) <<comandos>> instalar (r :ExpendedoraCafe,s:entero) desinstalar (s : entero)

Caso de Estudio: Expendedora Café ExpHospital Introducción a la Programación Orientada a Objetos T [] ExpendedoraCafe <<consultas>> cantSectores():entero cantSectoresOcupados(): entero todosOcupados () : boolean estaExpendedoraCafe (r: ExpendedoraCafe) : boolean existeSector(s:entero):boolean cantDisponible(vasos:entero):entero

Caso de Estudio: Expendedora Café ExpHospital Introducción a la Programación Orientada a Objetos T [] ExpendedoraCafe 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.

Caso de Estudio: Expendedora Café 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

Caso de Estudio: Expendedora Café 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 public void desinstalar(int s) { /*Elimina la asignación de la máquina r del sector s. Requiere 0<=s<cantSectores()*/ T[s] = null; }

Caso de Estudio: Expendedora Café 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

Caso de Estudio: Expendedora Café 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; Introducción a la Programación Orientada a Objetos El arreglo T es una estructura de datos polimórficas, todos los elementos son instancias de alguna clase derivada de ExpendedoraCafe.

Caso de Estudio: Expendedora Café 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

Caso de Estudio: Expendedora Café public boolean existeSector (int s){ return s>= 0 & s< cantSectores(); } Introducción a la Programación Orientada a Objetos public ExpendedoraCafe expSector (int s){ /*Retorna la máquina instalada en el sector s, requiere 0<=s<cantSectores()*/ return T[s]; }

Caso de Estudio: Expendedora Café 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; } Introducción a la Programación Orientada a Objetos El mensaje vasosCafe() se liga al método definido en la clase del objeto referenciado por T[i]

Caso de Estudio: Expendedora Café 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

Caso de Estudio: Expendedora Café m1 m2 :ExpHospital eh :R101Plus T Introducción a la Programación Orientada a Objetos :M111 10

Caso de Estudio: Expendedora Café ExpHospital Introducción a la Programación Orientada a Objetos T [] ExpendedoraCafe <<consultas>> 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.

Caso de Estudio: Expendedora Café 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

Caso de Estudio: Expendedora Café *ExpendedoraCafe <<atributos de clase>> maxCafe : entero maxAgua:entero <<atributos de instancia>> cantCafé : entero cantAgua:entero <<Constructor>> ExpendedoraCafe() <<Comandos>> cafe() recargarCafe() recargarAgua() <<consultas>> vasosCafe():entero obtenerCafe():entero obtenerAgua():entero equals(e:ExpendedoraCafe) Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café y 200 ml de agua. IPOO 2 cuatrimestre 2017 Se carga el depósito completo 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.

Caso de Estudio: Expendedora Café abstract class ExpendedoraCafe{ public boolean equals (ExpendedoraCafe e){ return cantCafe == e.obtenerCafe()&& cantAgua == e.obtenerAgua(); } Introducción a la Programación Orientada a Objetos

Caso de Estudio: Expendedora Café M111 <<atributos de clase>> maxLeche:entero <<atributos de instancia>> cantLeche:entero <<Constructor>> M111() <<Comandos>> cafeConLeche() recargarLeche() <<consultas>> vasosCafeConLeche():entero obtenerLeche() equals(e:M111):boolean Las cantidades disponibles se inicializan con los máximos Require disponible 40 grs. de café, 20 de leche y 200 ml de agua. IPOO 2 cuatrimestre 2017 Se carga el depósito completo 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

Caso de Estudio: Expendedora Café 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.

Caso de Estudio: Expendedora Café 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 El mensaje equals siempre se liga al método definido en ExpendedoraCafe.

Caso de Estudio: Expendedora Café M111 <<atributos de clase>> maxLeche:entero <<atributos de instancia>> cantLeche:entero <<Constructor>> M111() <<Comandos>> cafeConLeche() recargarLeche() <<consultas>> vasosCafeConLeche():entero obtenerLeche() equals(e:ExpendedoraCafe):boolean Las cantidades disponibles se inicializan con los máximos Requiere disponible 40 grs. de café, 20 de leche y 200 ml de agua. Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Caso de Estudio: Expendedora Café 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; } Introducción a la Programación Orientada a Objetos 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.

Caso de Estudio: Expendedora Café 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 == m.obtenerLeche(); } return es; El método está redefinido, el tipo dinámico de la variable determina el método que se liga al mensaje. Si se ejecuta esta definición el objeto que recibe el mensaje es de clase M111.

Herencia y Equivalencia La implementación del método equals debe verificar las propiedades: Reflexividad: x.equals(x) retorna true Simetría: si x.equals(y) retorna true si y sólo si y.equals(x) es true Transitividad: si x.equals(y) y y.equals(z) retornan true entonces x.equals(z) retorna true IPOO 2 cuatrimestre 2017