Introduccin a la Programacin Orientada a Objetos Herencia
Introducción a la Programación Orientada a Objetos Herencia y Polimorfismo Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre 2019 Sonia Rueda
La programación orientada a objetos propone abordar el diseño de una aplicación a partir de la definición de una estructura de clases relacionadas entre sí. La dependencia modela un vínculo del tipo usa-un La asociación modela un vínculo del tipo tiene-un La herencia modela un vínculo del tipo es-un Introducción a la Programación Orientada a Objetos Relaciones entre clases
Si hablamos de abstracción cuando en la etapa de diseño clasificamos los objetos del problema, podemos llamar superabstracción al proceso de organizar las clases a través de una relación de herencia. Los lenguajes soportan el mecanismo de herencia de manera diferente, algunos de manera más compleja y flexible, otros brindan alternativas más simples pero menos poderosas. La herencia simple permite modelar una organización jerárquica de clases. Introducción a la Programación Orientada a Objetos Herencia
• Cuando en una clase se define un método con el mismo nombre que otro método dentro de la misma clase o de alguna clase ancestro, pero con diferente número o tipo de parámetros, el método queda sobrecargado. • Cuando en una clase derivada se define un método con el mismo nombre que en alguna clase ancestro y con el mismo número y tipo de parámetros, el método queda redefinido. Introducción a la Programación Orientada a Objetos Sobrecarga y Redefinición de métodos
Una fábrica produce dos tipos diferentes de máquinas expendedoras de café, M 111 y R 101. Las máquinas del tipo M 111 preparan café y café con leche. Tienen depósitos para los siguientes ingredientes secos: café y leche. Las máquinas de tipo R 101 preparan café , y café carioca. Tienen depósitos para café, crema y cacao. Los dos modelos tienen un depósito de agua. IPOO 2 cuatrimestre 2019 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 Además de la capacidad máxima de cada ingrediente, cada máquina mantiene registro de la cantidad disponible. IPOO 2 cuatrimestre 2019 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 café. Cuando se recarga se completa el depósito hasta su máxima capacidad. Cada infusión consume 200 mililitros de agua. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café Leche 40 Café con leche 40 Café Carioca 30 20 Cacao 10 Crema 30 IPOO 2 cuatrimestre 2019 Cada vez que se solicita una infusión se reducen los ingredientes de acuerdo a la siguiente tabla:
Caso de Estudio: Expendedora Café M 111 R 101 <<atributos de clase>> max. Cafe : entero max. Agua: entero max. Leche: entero <<atributos de instancia>> cant. Café : entero cant. Agua: entero cant. Leche : entero <<atributos de clase>> max. Cafe : entero… max. Agua: entero max. Cacao: entero max. Crema: entero <<atributos de instancia>> cant. Café : entero cant. Agua: entero cant. Cacao : entero cant. Crema : entero IPOO 2 cuatrimestre 2019 El diseñador de un modelo para las máquinas expendedoras podría especificar dos clases de acuerdo al siguiente diagrama:
Caso de Estudio: Expendedora Café M 111 R 101 <<Constructor>> M 111() <<Comandos>> cafe() cafe. Con. Leche() recargar. Cafe() recargar. Agua() recargar. Leche() <<consultas>> vasos. Cafe(): entero valos. Cafe. Con. Leche(): entero <<Constructor>> R 101() <<Comandos>> cafe() cafe. Carioca() recargar. Cafe() recargar. Agua() recargar. Crema() recargar. Cacao() <<consultas>> vasos. Cafe(): entero vasos. Cafe. Carioca(): entero
Caso de Estudio: Expendedora Café Alternativamente el diagrama podría incluir a una única clase que modele los dos tipos de máquinas: <<atributos de clase>> max. Cafe : entero max. Agua: entero max. Leche: entero max. Cacao: entero max. Crema: entero <<atributos de instancia>> cant. Café : entero cant. Agua: entero cant. Leche : entero cant. Cacao : entero cant. Crema : entero IPOO 2 cuatrimestre 2019 Expendedora. Cafe
Caso de Estudio: Expendedora Café Expendedora. Cafe() Las cantidades disponibles se inicializan con los máximos cafe() Requiere disponible 40 grs. de café y 200 ml de agua. cafe. Con. Leche() Requiere disponible 40 grs de café, 200 ml de agua y 20 grs. de leche. recargar. Cafe() Se carga el depósito completo vasos. Cafe(): entero Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito IPOO 2 cuatrimestre 2019 <<Constructor>> Expendedora. Cafe() <<Comandos>> cafe() cafe. Con. Leche() cafe. Carioca() recargar. Cafe() recargar. Agua() recargar. Leche() recargar. Crema() recargar. Cacao() <<consultas>> vasos. Cafe(): entero vasos. Cafe. Con. Leche(): entero vasos. Cafe. Carioca(): entero
Un modelo más adecuado consistiría en factorizar los atributos y comportamiento compartidos de M 111 y R 101 en una clase general y retener los atributos y comportamientos específicos en clases especializadas. Este proceso se conoce como generalización porque parte de dos clases específicas para obtener una más general. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café M 111 R 101 IPOO 2 cuatrimestre 2019 Expendedora. Cafe
Caso de Estudio: Expendedora Café Expendedora. Cafe <<atributos de clase>> max. Cafe : entero max. Agua: entero <<atributos de instancia>> cant. Café : entero cant. Agua: entero IPOO 2 cuatrimestre 2019 La clase más general incluye los atributos compartidos por todas las instancias:
Caso de Estudio: Expendedora Café Expendedora. Cafe <<Constructor>> Expendedora. Cafe() <<Comandos>> cafe() recargar. Cafe() recargar. Agua() <<consultas>> vasos. Cafe(): entero Expendedora. Cafe() Las cantidades disponibles se inicializan con los máximos cafe() Requiere disponible 40 grs. de café y 200 ml de agua. recargar. Agua() recargar. Cafe() Se carga el depósito completo vasos. Cafe(): entero Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito IPOO 2 cuatrimestre 2019 La clase más general incluye los servicios compartidos por todas las instancias:
Caso de Estudio: Expendedora Café M 111 <<atributos de clase>> max. Leche: entero <<atributos de instancia>> cant. Leche: entero <<Constructor>> M 111() <<Comandos>> cafe. Con. Leche() recargar. Leche() <<consultas>> vasos. Cafe. Con. Leche(): entero cafe. Con. Leche() Requiere disponible 40 grs de café, 200 ml de agua y 20 grs. de leche. recargar. Leche() Se carga el depósito completo vasos. Cafe. Con. Leche(): entero Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito IPOO 2 cuatrimestre 2019 Las clases especializadas incluyen atributos y servicios específicos.
Caso de Estudio: Expendedora Café Las clases especializadas incluyen atributos y servicios específicos. <<atributos de clase>> max. Crema: entero max. Cacao: entero <<atributos de instancia>> cant. Crema: entero cant. Cacao: entero <<Constructor>> R 101() <<Comandos>> carioca() recargar. Crema() recargar. Cacao() <<consultas>> vasos. Carioca(): entero Las cantidades disponibles se inicializan con los máximos Require disponible 30 grs. de café, 30 de crema, 10 de cacaoy 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 IPOO 2 cuatrimestre 2019 R 101
Caso de Estudio: Expendedora Café Todo objeto de clase M 111 es también un objeto de clase Expendedora. Cafe. Un objeto de clase M 111 estará caracterizado por todos los atributos y el comportamiento propio de la clase, pero además por todos los atributos y el comportamiento de la clase Expendedora. Cafe. IPOO 2 cuatrimestre 2019 La clase M 111 está vinculada a la clase Expendedora. Cafe por una relación de herencia.
Caso de Estudio: Expendedora Café Todo objeto de clase R 101 es también un objeto de clase Expendedora. Cafe. Un objeto de clase R 101 estará caracterizado por todos los atributos y el comportamiento propio de la clase, pero además por todos los atributos y el comportamiento de la clase Expendedora. Cafe. IPOO 2 cuatrimestre 2019 La clase R 101 está vinculada a la clase Expendedora. Cafe por una relación de herencia.
class Expendedora. Cafe { //atributos de clase //medido en gramos protected static final int max. Cafe = 1500; //medido en mililitros protected static final int max. Agua = 1500; //atributos de instancia protected int cant. Cafe; protected int cant. Agua; //Constructor de Expendedora. Cafe public Expendedora. Cafe() { //Cada depósito se carga completo cant. Cafe = max. Cafe; cant. Agua = max. Agua; } Como los atributos están protegidos, las clases que heredan a Expendedora. Cafe tiene acceso a ellos. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Comandos de Expendedora. Cafe public void cafe() { /*Requiere disponibles 40 gramos de café y 200 ml de agua*/ cant. Cafe = cant. Cafe – 40; cant. Agua = cant. Agua – 200; } public void recargar. Cafe() { //Carga el depósito completo cant. Cafe = max. Cafe; } public void recargar. Agua() { //Carga el depósito completo cant. Agua = max. Agua; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Consultas de Expendedora. Cafe public int vasos. Cafe() { /*Computa cuántos vasos de café pueden prepararse con las cantidades disponibles*/ int c = (int) cant. Cafe / 40; int a = (int) cant. Agua / 200; if (c < a) return c; else return a; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café IPOO 2 cuatrimestre 2019 class M 111 extends Expendedora. Cafe { //atributos de clase //gramos protected static final int max. Leche = 600; //atributos de instancia protected int cant. Leche; En Java la palabra extend especifica que la clase M 111 hereda de la clase Expendedora. Cafe.
Caso de Estudio: Expendedora 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. IPOO 2 cuatrimestre 2019 //Constructor de M 111 public M 111() { //Cada depósito se carga completo super(); cant. Leche = max. Leche; }
Caso de Estudio: Expendedora Café : M 111 cant. Cafe cant. Leche El estado interno de cada objeto de clase M 111 incluye los atributos definidos en esa clase más los atributos heredados de Expendedora. Cafe. IPOO 2 cuatrimestre 2019 cant. Agua
//Comandos de M 111 public void cafe. Con. Leche() { /*Requiere disponibles 40 gramos de café, 200 ml de agua y 20 grs de leche*/ cafe(); cant. Leche = cant. Leche -20; } public void recargar. Leche() { //Carga el depósito completo cant. Leche = max. Leche; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Consultas de M 111 public int vasos. Cafe. Con. Leche() { /*Computa cuántos vasos de café con leche pueden prepararse con las cantidades disponibles*/ int c = vasos. Cafe(); int l = (int) cant. Leche / 20; if (c < l) return c; else return l; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
class R 101 extends Expendedora. Cafe { //atributos de clase //gramos protected static final int max. Crema = 600; protected static final int max. Cacao = 300; //atributos de instancia protected int cant. Crema; protected int cant. Cacao; //Constructor de R 101 public R 101() { //Cada depósito se carga completo super(); cant. Cacao = max. Cacao; cant. Crema = max. Crema; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Comandos de R 101 public void carioca() { /*Requiere disponibles 30 gramos de café, 200 ml de agua, 30 de crema y 10 grs de cacao*/ cant. Cafe = cant. Cafe -30; cant. Agua = cant. Agua -200; cant. Crema = cant. Crema -30; cant. Cacao = cant. Cacao -10; } public void recargar. Crema() { //Carga el depósito completo cant. Crema = max. Crema; } public void recargar. Cacao() { //Carga el depósito completo cant. Cacao = max. Cacao; } El atributo cant. Cafe es accesible porque está declarado como protegido. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
R 101 m 1 = new R 101 (); M 111 m 2 = new M 111(); m 1. cafe(); m 2. cafe(); En el problema, Las máquinas R 101 y M 111 ofrecen café. En la solución, las clases R 101 y M 111 heredan los atributos de instancia y los servicios de la clase Expendedora. Cafe, de modo que un objeto de cualquiera de esas clases puede recibir el mensaje cafe(). Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
R 101 m 1 = new R 101 (); M 111 m 2 = new M 111(); m 1. cafe. Con. Leche(); m 2. cafe. Con. Leche(); Error de compilación En el problema, solo las máquinas del modelo M 111 ofrecen café con leche. En la solución, solo los objetos de clase M 111 pueden recibir el mensaje cafe. Con. Leche. Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
La fábrica incorpora ahora un nuevo modelo R 101 Plus que tiene la funcionalidad de R 101 pero prepara un café más fuerte usando 50 grs. y agrega como ingrediente a la canela con capacidad máxima de 300 grs. y prepara café bahiano. El café bahiano requiere la preparación de un café carioca al cual se le agregan 10 gramos de canela. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café M 111 R 101 Plus La clase R 101 Plus especializa a la clase R 101. IPOO 2 cuatrimestre 2019 Expendedora. Cafe
Caso de Estudio: Expendedora Café Las clases especializadas incluyen atributos y servicios específicos. <<atributos de clase>> max. Canela: entero <<atributos de instancia>> cant. Canela: entero <<Constructor>> R 101 Plus() <<Comandos>> cafe() bahiano() recargar. Canela() <<consultas>> vasos. Cafe(): entero vasos. Bahiano(): entero Las cantidades disponibles se inicializan con los máximos Require 50 gr. de café. Require disponible para un café carioca y 10 gramos de canela. Se carga el depósito completo Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito IPOO 2 cuatrimestre 2019 R 101 Plus
La clase R 101 Plus está vinculada a la clase R 101 por una relación de herencia. Todo objeto de la clase R 101 Plus es también un objeto de la clase R 101 y además un objeto de la clase Expendedora. Cafe. La clase R 101 es una clase derivada de la clase Expendedora. Cafe, pero a su vez es una clase base para la clase R 101 Plus. NOTEMOS QUE la modificación en la especificación del problema no requiere modificar las clases ya implementadas y verificadas, sino agregar una nueva clase. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
class R 101 Plus extends R 101 { //Atributo de clase protected static final int max. Canela = 300; //Atributo de instancia protected int cant. Canela; //Constructor public R 101 Plus (){ super(); cant. Canela = max. Canela; } El constructor de R 101 Plus puede acceder al constructor de la clase R 101 pero no al constructor de Expendedora. Cafe. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Comandos en la clase R 101 Plus public void cafe() { /*Requiere 50 gramos de café en el depósito*/ cant. Cafe = cant. Cafe -50; cant. Agua= cant. Agua -200; } public void bahiano() { /*Requiere disponible para un carioca y 10 gramos de canela*/ carioca (); cant. Canela = cant. Canela-10; } public void recargar. Canela() { //Carga el depósito completo cant. Canela = max. Canela; } IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
//Consultas en la clase R 101 Plus public int vasos. Cafe(){ /*Computa cuántos vasos de café pueden prepararse con las cantidades disponibles*/ int c = (int) cant. Cafe / 50; int a = (int) cant. Agua / 200; if (c < a) return c; else return a; } La consulta vasos. Cafe() de la clase R 101 Plus redefine a la consulta vasos. Cafe() definido en Expendedora. Cafe. IPOO 2 cuatrimestre 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café //Comandos en la clase R 101 Plus public void cafe() { /*Requiere 50 gramos de café en el depósito*/ cant. Cafe = cant. Cafe -50; } El método cafe() de la clase R 101 Plus redefine al método cafe() definido en Expendedora. Cafe. IPOO 2 cuatrimestre 2019 //Comandos en la clase Expendedora. Cafe public void cafe() { /*Requiere 40 gramos de café en el depósito*/ cant. Cafe = cant. Cafe -40; }
R 101 m 1 = new R 101(); R 101 Plus m 2 = new R 101 Plus(); m 1. cafe(); m 2. cafe(); Se liga al método definido en Expendedora. Cafe Se liga al método definido en R 101 Plus El método cafe() de la clase Expendedora. Cafe queda derogado para los objetos de clase R 101 Plus. Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
R 101 m 1 = new R 101(); R 101 Plus m 2 = new R 101 Plus(); m 1. carioca(); m 2. carioca(); m 1. bahiano(); m 2. bahiano(); Error de compilación Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
Expendedora. Cafe e 1, e 2, e 3; e 1 = new M 111(); e 2 = new R 101(); e 3 = new R 101 Plus(); Las variables e 1, e 2 y e 3 son polimórficas, pueden quedar ligadas a objetos de la clase Expendedora. Cafe o de sus clases derivadas. Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
Expendedora. Cafe e 1, e 2, e 3; e 1 = new M 111(); e 2 = new R 101(); e 3 = new R 101 Plus(); e 1. cafe(); Se liga al método definido en Expendedora. Cafe e 2. cafe(); Se liga al método definido en Expendedora. Cafe e 3. cafe(); Se liga al método definido en R 101 Plus La clase del objeto determina la ligadura entre el mensaje y el método. Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
Expendedora. Cafe e 1, e 2, e 3; e 1 = new M 111(): e 2 = new R 101(); e 3 = new R 101 Plus(); e 1. cafe. Con. Leche(); e 2. carioca(); e 3. bahiano(); ERRORES DE COMPILACION El tipo de la variable determina los mensajes que puede recibir el objeto. Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
Expendedora. Cafe e; if (cond) e = new M 111(): else e = new R 101(); e. cafe(); Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
Expendedora. Cafe e; if (cond) e = new M 111(): else e = new R 101(); e. carioca(); ERROR Introducción a la Programación Orientada a Objetos 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 2019 Caso de Estudio: Expendedora Café
Caso de Estudio: Expendedora Café M 111 R 101 Plus IPOO 2 cuatrimestre 2019 Exp. Hospital Expendedora. Cafe
Caso de Estudio: Expendedora Café Exp. Hospital T [] Expendedora. Cafe <<constructores>> exp. Hospital (max : entero) <<comandos>> instalar (r : Expendedora. Cafe, s: entero) desinstalar (s : entero)
Exp. Hospital T [] Expendedora. Cafe <<consultas>> cant. Sectores(): entero cant. Sectores. Ocupados(): entero todos. Ocupados () : boolean esta. Expendedora. Cafe (r: Expendedora. Cafe) : boolean existe. Sector(s: entero): boolean cant. Disponible(vasos: entero): entero Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
class Exp. Hospital { private Expendedora. Cafe[] T; //Constructor public Exp. Hospital(int max) { /*Crea un arreglo con max elementos, cada elemento representa un sector de la fábrica*/ T= new Expendedora. Cafe [max]; }. . . } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public void instalar(Expendedora. Cafe r, int s) { /*Asigna el la máquina r al sector s. Requiere 0<=s<cant. Sectores() */ T[s] = r; } public void desinstalar(int s) { /*Elimina la asignación de la máquina r del sector s. Requiere 0<=s<cant. Sectores()*/ T[s] = null; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public int cant. Sectores(){ return T. length; } public int cant. Sectores. Ocupados (){ int i = 0; int cant = 0; while (i < cant. Sectores()){ if (T[i]!=null) cant++; i++; } return cant; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public boolean todos. Ocupados (){ /*Retorna true si hay al menos un sector que no tiene una máquina instalada*/ int i = 0; boolean hay. Nulo= false; while (i<cant. Sectores() && !hay. Nulo ){ hay. Nulo = T[i]==null; i++; } return !hay. Nulo; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public boolean esta. Exp(Expendedora. Cafe 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 < cant. Sectores() && !esta ){ esta = T[i] == r ; i++; } return esta; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public boolean existe. Sector (int s){ return s>= 0 & s< cant. Sectores(); } public Expendedora. Cafe exp. Sector (int s){ /*Retorna la máquina instalada en el sector s, requiere 0<=s<cant. Sectores()*/ return T[s]; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
public int cant. Disponible(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<cant. Sectores(); i++) if (T[i] != null) if(T[i]. vasos. Cafe() >= n) cont++; return cont; } El mensaje vasos. Cafe() se liga al método definido en la clase del objeto referenciado por T[i] Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
class gestion. Hospital{ … Exp. Hospital eh = new Exp. Hospiral(10); M 111 m 1 = new M 111(); R 101 Plus m 2 = new R 101 Plus(); eh. instalar(m 1, 5); eh. instalar(m 2, 1); } Introducción a la Programación Orientada a Objetos Caso de Estudio: Expendedora Café
eh : Exp. Hospital T 10 : R 101 Plus : M 111 Introducción a la Programación Orientada a Objetos m 1 m 2
- Slides: 60