La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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 Polimorfismo.

Presentaciones similares


Presentación del tema: "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 Polimorfismo."— Transcripción de la presentación:

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 Polimorfismo y Chequeo de Tipos 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 PROGRAMACIÓN ORIENTADA A OBJETOS Aunque no existe una caracterización precisa acerca de qué es un lenguaje orientado a objetos, en general se acuerda que debe soportar: –Abstracción de datos y encapsulamiento. –Herencia. –Polimorfismo y ligadura dinámica. Java brinda soporte para todos estos conceptos. 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 ABSTRACCIÓN DE DATOS En el diseño de una aplicación, siguiendo la metodología de abstracción de datos, los objetos son organizados en clases de acuerdo a sus atributos y comportamiento. Además, en esta metodología, las clases encapsulan la representación de los atributos y la implementación del comportamiento definiendo tipos de datos abstractos. La abstracción de datos tiene limitaciones para numerosas aplicaciones, en las cuales los objetos comparten algunos atributos o comportamiento, pero difieren en otros. Introducción a la Programación Orientada a Objetos IPOO - 2015 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 HERENCIA En el diseño de una aplicación, siguiendo el paradigma orientado a objetos, las clases son organizadas de acuerdo a sus atributos y comportamiento. La herencia es un mecanismo que permite clasificar clases estableciendo una relación de generalización- especialización. Cuando la herencia es simple la clasificación es jerárquica y las clases se estructuran como un árbol. Un objeto que es instancia de una clase es también instancia de sus clases ancestro siguiendo la rama en el árbol. Introducción a la Programación Orientada a Objetos IPOO - 2015 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 POLIMORFISMO Una variable polimórfica puede referenciar a objetos de diferentes clases. Una asignación polimórfica asocia a una variable declarada de una clase dada a un objeto de una clase derivada. Un método polimórfico recibe como parámetros a variables polimórficas. Introducción a la Programación Orientada a Objetos IPOO - 2015 5

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 LIGADURA DINÁMICA El tipo estático de una variable es la clase que aparece en la declaración. El tipo dinámico de una variable es la clase del objeto al que está ligada en ejecución. Cuando un método se redefine, la ligadura entre un mensaje y un método queda determinada por la clase del objeto, esto es, por el tipo dinámico de una variable. Introducción a la Programación Orientada a Objetos IPOO - 2015 6

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 CHEQUEO DE TIPOS El tipo estático de una variable determina los mensajes que puede recibir. El compilador chequea que no va a haber errores en ejecución. El tipo dinámico de la variable determina el método que se ejecuta en respuesta a un mensaje. El compilador no puede establecer la ligadura entre un mensaje y el método, es la clase del objeto en ejecución la que lo determina. Introducción a la Programación Orientada a Objetos IPOO - 2015 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 CASO DE ESTUDIO: MÁQUINAS EXPENDEDORAS 8 MaquinaExpendedora R101M111 R101Plus Introducción a la Programación Orientada a Objetos IPOO - 2015

9 9 MaquinaExpendedora > maxCafe: entero maxTe: entero maxCacao: entero > NroSerie: entero cantCafe: entero cantCacao: entero cantTe: entero > MaquinaExpendedora(ns: entero) > cafe() te() cargarCafe(grs: entero): entero… > masCafe(MaquinaExpendedora e): MaquinaExpedendora Cada máquina tiene un número que la identifica

10 10 M111 > maxLeche: entero … > cantLeche: entero … > M111(ns: entero) > te() teConLeche subMarino()… cargarLeche(grs: entero): entero… > obtenerCantLeche(): entero… obtenerMaxLeche(): entero … vasosTeConLeche(): entero

11 11 R101 > maxCrema: entero … > cantCrema: entero … > R101(ns: entero) > te() carioca()… cargarCrema(grs: entero): entero… > obtenerCantCrema(): entero… obtenerMaxCrema(): entero … vasosCarioca(): entero …

12 12 R101Plus > maxCanela: entero … > cantCanela: entero … > R101Plus(ns: entero) > cafe() bahiano()… cargarCanela(grs: entero) : entero… > obtenerCantCanela(): entero… obtenerMaxCanela(): entero … vasosCafe():entero vasosBahiano() : entero … Los métodos cafe() y vasosCafe() se redefinen

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ÁQUINAS EXPENDEDORAS 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. 13 : M111 me MaquinaExpendedora me = new M111(nro1); Introducción a la Programación Orientada a Objetos IPOO - 2015

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ÁQUINAS EXPENDEDORAS 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 14 : M111 me MaquinaExpendedora me = new M111(nro1); … me = new R101(nro2); : R101 Introducción a la Programación Orientada a Objetos IPOO - 2015

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ÁQUINAS EXPENDEDORAS El tipo estático de me es MaquinaExpendedora El tipo dinámico de me es R101 ; El tipo estático MaquinaExpendedora determina el conjunto de tipos dinámicos para me. El mismo criterio se aplica al pasaje de parámetros. 15 MaquinaExpendedora me; R101 r = new R101(nro); me = r; Introducción a la Programación Orientada a Objetos IPOO - 2015

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ÁQUINA EXPENDEDORA class MaquinaExpendedora {… … public MaquinaExpendedora masCafe (MaquinaExpendedora m) { //Asume m ligada if (cantCafe > m.obtenerCantCafe()) return this; else return m; } 16 MaquinaExpendedora me1,me2,me3; R101 meR101 = new R101(nro1); me1 = new R101Plus(nro2); me2 = meR101.masCafe(me1); me3 = me1.masCafe(meR101);

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ÁQUINAS EXPENDEDORAS El chequeo de tipo impone algunas limitaciones a nivel de polimorfismo. Una variable polimórfica sólo puede referenciar a objetos de su clase o de las clases derivadas. Una asignación polimórfica asocia un objeto de una clase a una variable cuyo tipo estático es una clase ancestro de la clase del objeto. El compilador rechaza : 17 R101 meR101 = new R101(nro1); R101Plus meR101Plus ; meR101Plus= new R101(nro2); meR101Plus= meR101;

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ÁQUINAS EXPENDEDORAS El casting relaja el control del compilador. Es responsabilidad del programador asegurar que el objeto referenciado por meR101 sea efectivamente de clase R101Plus. Si no se incluye el condicional y meR101 no referencia a un objeto de clase R101Plus se produce una excepción en ejecución. 18 R101 meR101 = new R101(nro); R101Plus meR101Plus ; if (meR101 instanceof R101Plus) meR101Plus= (R101Plus) meR101; Introducción a la Programación Orientada a Objetos IPOO - 2015

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: MÁQUINAS EXPENDEDORAS 19 MaquinaExpendedora te() cafe() masCafe(me) R101 te() carioca() M111 te() teconLeche() submarino() R101Plus bahiano() cafe() Introducción a la Programación Orientada a Objetos IPOO - 2015

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: MÁQUINAS EXPENDEDORAS Una variable polimórfica determina los mensajes que un objeto puede recibir, aunque el objeto determina la implementación específica del comportamiento que se ejecuta en respuesta a los mensajes. El compilador rechaza 20 R101 meR101 ; R101Plus meR101Plus = new R101Plus (nro); meR101 = meR101Plus; Introducción a la Programación Orientada a Objetos IPOO - 2015 meR101.bahiano();

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA class MaquinaExpendedora { … public void cafe() { cantCafe=cantCafe–40; } … } 21 class R101Plus extends R101 { … public void cafe() { cantCafe=cantCafe-45; } … } MaquinaExpendedora me; R101Plus meR101Plus; meR101Plus=new R101Plus(nro); me = meR101Plus; me.cafe();

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 CASO DE ESTUDIO: M.E. EN UN HOSPITAL En un hospital cada una de los pasillos tiene un número asignado a partir de 0. 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 22

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: M.E. EN UN HOSPITAL 23 MaquinaExpendedora R101M111 R101Plus Introducción a la Programación Orientada a Objetos IPOO - 2015 MEHospital MEHospital es una tabla

24 24 MEHospital > 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 totalVasosCafe(): entero totalLeche(): entero Asigna la máquina unaMe al pasillo p que asume válido Decide si al menos un pasillo tiene una máquina Decide si todos los pasillos tienen una máquina Computa la cantidad total de vasos de café entre todas las máquinas Computa la cantidad total de leche entre todas las máquinas M111 Calcula la cantidad de pasillos que tienen una máquina El pasillo p, que asume válido, no queda ligado a una máquina

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: M.E. EN UN HOSPITAL El arreglo está constituido por un conjunto de variables polimórficas. 25 public void instalar(MaquinaExpendedora me, int p) { /*Inserta me en la posicion p, que asume valido*/ T[p] = me; } public void retirar(int p){ /*Elimina la máquina del pasillo p, que asume valido*/ T[p] = null; }

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: M.E. EN UN HOSPITAL 26 public int cantPasillos(){ /*Cantidad de pasillos*/ return T.length; } public int cantPasillosOcupados(){ /*Calcula la cantidad de pasillos que tienen asignada una máquina expendedora*/ int cant = 0; for (int i=0; i< maxPasillos();i++) if (T[i] != null) cant++; return cant; } Introducción a la Programación Orientada a Objetos IPOO - 2015

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: M.E. EN UN HOSPITAL 27 public boolean todosOcupados(){ /*Decide si todos los pasillos tienen asignada una máquina*/ int i = 0; boolean hay = false; while (i < maxPasillos() && !hay){ if (T[i] == null) hay = true ; i++; } return !hay; } Introducción a la Programación Orientada a Objetos IPOO - 2015

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: M.E. EN UN HOSPITAL 28 class Test { MEHospital lote = new MEHospital(5); … MaquinaExpendedora m1,m2,m3,m4; m1 = new M111(11); m2 = new R101Plus(12); m3 = new R101(13); … lote.instalar(m1,1); lote.instalar(m2,2); lote.instalar(m3,4); … } Todos los elementos del arreglo tienen el mismo tipo estático, la estructura es homogénea.

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: M.E. EN UN HOSPITAL 29 :M111 t class MEHospital{ private MaquinaExpendedora[] T; NroSerie cantCafé cantTe cantCacao cantLeche :R101 NroSerie cantCafé cantTe cantCacao cantCrema :R101Plus NroSerie cantCafé cantTe cantCacao cantCrema cantCanela Todas tiene el ingrediente café

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: M.E. EN UN HOSPITAL La operación vasosCafe() está provista para todas las máquinas. Si la fábrica ofrece 100 modelos diferentes, cada una con un método vasosCafe () distinto, el método totalVasosCafe () no cambia. 30 public int totalVasosCafe (){ int c = 0; for (int i = 0; i < maxPasillos();i++) { if (T[i] != null) c = c + T[i].vasosCafe(); } return c; } Introducción a la Programación Orientada a Objetos IPOO - 2015

31 31 En un lenguaje imperativo cada vez que se agrega un nuevo modelo es necesario modificar el código. Procedure totalVasosCafe(var lote:MEHospital var c:integer) var i:integer; begin c = 0; for i := 0 to lote.max do if (lote.T[i] != null) case lote.T[i].tipo of 1 : c = c+lote.T[i].vasosCafeM111(); 2 : c = c+lote.T[i].vasosCafeR101(); 3 : c = c+lote.T[i].vasosCafeR101Plus(); … return c; end;

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: M.E. EN UN HOSPITAL 32 MaquinaExpendedora café() vasosCafe() R101M111 R101Plus café() vasosCafe() Introducción a la Programación Orientada a Objetos IPOO - 2015 HEHospital

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: M.E. EN UN HOSPITAL 33 :M111 t class MEHospital{ private MaquinaExpendedora[] T; NroSerie cantCafé cantTe cantCacao cantLeche :R101 NroSerie cantCafé cantTe cantCacao cantCrema :R101Plus NroSerie cantCafé cantTe cantCacao cantCrema cantCanela Sólo algunas tienen leche

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: M.E. EN UN HOSPITAL La operación obtenerCantLeche() sólo está provista para los objetos de clase M111. 34 public int totalLeche (){ int c = 0; for (int i = 0; i < maxPasillos(); i++){ if (T[i] != null && T[i] instanceof M111){ c = c + T[i].obtenerCantLeche();} } return c; } ERROR

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: M.E. EN UN HOSPITAL La operación obtenerCantLeche() sólo está provista para los objetos de clase M111. 35 public int totalLeche (){ int c = 0; M111 aux; for (int i = 0; i < maxPasillos(); i++){ if (T[i] != null && T[i] instanceof M111){ aux = (M111)T[i]; c = c + aux.obtenerCantLeche();} } return c; }

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: M.E. EN UN HOSPITAL 36 public boolean existeME (MaquinaExpendedora unElem){ /* Decide si hay un elemento con la misma identidad que unElem, que asume ligada*/ int i = 0; boolean esta = false; while (i < maxPasillos() && !esta){ if (T[i] != null) esta = T[i] == unElem; i++; } return esta; } Introducción a la Programación Orientada a Objetos IPOO - 2015

37 37 El mensaje equals debe ligarse con el método que corresponda a la clase del objeto asociado T[i]. Consideremos este caso un poco más adelante. public boolean existeME (MaquinaExpendedora unElem){ /* Decide si hay un elemento equivalente a unElem, que asume ligada*/ int i = 0; boolean esta = false; while (i < cantME && !esta){ if (T[i] != null) esta = T[i].equals(unaMe); i++; } return esta; }

38 38 MaquinaExpendedora > maxCafe: entero maxTe: entero maxCacao: entero > NroSerie: entero cantCafe: entero cantCacao: entero cantTe: entero > MaquinaExpendedora(ns: entero) > cafe() te() cargarCafe(grs: entero): entero… > igualNroSerie(me:MaquinaExpendedora): boolean

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: M.E. EN UN HOSPITAL Todas las máquinas expendedoras tienen un número de serie que las identifica. Este número sirve de clave de búsqueda, para identificar a cada instancia particular. Este servicio no compara todos los atributos, sólo el número de serie. 39 class MaquinaExpendedora { public boolean igualNroSerie(MaquinaExpendedora m){ return NroSerie == m.obtenerNroSerie(); } Introducción a la Programación Orientada a Objetos IPOO - 2015

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: 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. 40 public boolean existeME (MaquinaExpendedora unElem){ /* Decide si hay un elemento equivalente a unElem, que asume ligada*/ int i = 0; boolean esta = false; while (i < cantME && !esta){ if (T[i] != null) esta = T[i].igualNroSerie(unaMe); i++; } return esta; }

41 41 M111 > maxLeche: entero … > cantLeche: entero … > M111(ns: entero) > te() teConLeche subMarino()… cargarLeche(grs: entero): entero… > obtenerCantLeche(): entero… obtenerMaxLeche(): entero … vasosTeConLeche(): entero El método igualNroSerie se hereda de la clase base, en la cual está también el atributo clave

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: MÁQUINAS EXPENDEDORAS En la fábrica toda máquina expendedora es de clase M111, R101 o R101Plus, no existen máquinas que queden modeladas con la clase MaquinaExpendedora. 42 MaquinaExpendedora R101M111 R101Plus Introducción a la Programación Orientada a Objetos IPOO - 2015

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: M.E. EN UN HOSPITAL En el diseño la clase MaquinaExpendedora permite factorizar los atributos y comportamiento que comparten todas las máquinas de la fábrica. La clase MaquinaExpendedora es entonces abstracta, en la aplicación no hay entidades de esa clase y en ejecución no habrá instancias de clase máquina expendedora. 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 - 2015 43

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: M.E. EN UN HOSPITAL Con frecuencia una clase general establece algunos de los servicios que brindan todas sus instancias, sin llegar a implementarlos de manera concreta. En el ejemplo de la fábrica de las máquinas expendedoras todas las máquinas brindan el servicio te() pero la implementación concreta varía según el tipo de máquina. Introducción a la Programación Orientada a Objetos IPOO - 2015 44

45 45 MaquinaExpendedora >… > *te()… > *vasosTe() : entero M111 >… > te() > vasosTe() : entero R101 >… > te() > vasosTe() : entero

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: M.E. EN UN HOSPITAL En Java, el modificador abstract permite declarar una clase abstracta. Una clase abstracta puede contener uno o más métodos abstractos, esto es, la clase especifica un servicio pero no indica cómo se implementa. 46 abstract class MaquinaExpendedora { } Introducción a la Programación Orientada a Objetos IPOO - 2015 public abstract void te() ; public abstract int vasosTe();

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: M.E. EN UN HOSPITAL Todas las máquinas expendedoras ofrecen el servicio te() pero la implementación varía. 47 class abstract MaquinaExpendedora { public abstract void te() ; } class M111 extends MaquinaExpendedora { public void te() { this.retirarTe (10); } } class R101 extends MaquinaExpendedora{ public void te() { this.retirarTe (15); } }

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: M.E. EN UN HOSPITAL Todas las máquinas expendedoras ofrecen el servicio vasosTe() pero la implementación varía. 48 class abstract MaquinaExpendedora { public abstract int vasosTe() ; } class M111 extends MaquinaExpendedora { public int vasosTe() { return this.obtenerCantTe() / 10; } } class R101 extends MaquinaExpendedora{ public int vasosTe() { return this.obtenerCantTe() / 15;} }

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: M.E. EN UN HOSPITAL El arreglo está constituido por un conjunto de variables polimórficas. La operación vasosTe() está provista para todas. 49 class MEHospital{… public int totalVasosTe (){ int c = 0; for (int i = 0; i < maxPasillos();i++) { if (T[i] != null) c = c + T[i].vasosTe(); } return c; } } … }

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: M.E. EN UN HOSPITAL Una clase abstracta solo va a ser usada para definir clases más específicas, pero no va a tener instancias. De modo que la declaración que sigue es válida: Pero el compilador reportará un ERROR si se intenta crear una instancia: 50 MaquinaExpendedora me; Introducción a la Programación Orientada a Objetos IPOO - 2015 me = new MaquinaExpendedora(nro);

51 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 Ambos mensajes se ligarán al método te() provisto por la clase M111. 51 MaquinaExpendedora me; M111 meM111; me = new M111(nro1); meM111 = new M111(nro2); me.te(); meM111.te(); Introducción a la Programación Orientada a Objetos IPOO - 2015

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: M.E. EN UN HOSPITAL Los mensajes se ligarán al método te() provisto por la clase R101. 52 MaquinaExpendedora me; R101 meR101; R101Plus meR101Plus; me = new R101(nro1); meR101 = new R101(nro2); meR101Plus = new R101Plus(nro3); me.te(); meR101.te(); meR101Plus.te(); Introducción a la Programación Orientada a Objetos IPOO - 2015

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 CLASES ABSTRACTAS En la jerarquía de clases que modelan un sistema, las clases de los niveles superiores son generales y las de los niveles inferiores son más específicas. Una clase es abstracta si no está asociada a entidades del problema. En ejecución no va a haber instancias de una clase abstracta. Las clases abstractas pueden identificarse en la etapa de diseño de la aplicación o pueden crearse artificialmente durante la implementación. Una clase abstracta puede tener uno o más métodos abstractos. Introducción a la Programación Orientada a Objetos IPOO - 2015 53

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 CLASES ABSTRACTAS Las clases derivadas deben redefinir los métodos abstractos provistos por la clase base, implementando el comportamiento específico. Si una clase derivada de una clase abstracta no implementa los métodos abstractos de su clase base, debe definirse también como abstracta o el compilador notifica un error. Como no existen instancias de una clase abstracta, el constructor sólo puede ser invocado desde los constructores de las clases derivadas. Introducción a la Programación Orientada a Objetos IPOO - 2015 54

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 MODIFICADORES Java brinda modificadores que determinan cualidades de clases, métodos y atributos. – public es visible para cualquier otra clase. – final no puede ser extendida. – abstract debe ser extendida. Introducción a la Programación Orientada a Objetos IPOO - 2015 55 CLASES

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 MODIFICADORES Java brinda modificadores que determinan cualidades de clases, métodos y atributos. – public es visible en todas las clases. – private sólo es visible dentro de la clase en la que se declara. – protected es visible en el paquete y en las clases derivadas. Introducción a la Programación Orientada a Objetos IPOO - 2015 56 METODOS Y ATRIBUTOS

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 MODIFICADORES Java brinda modificadores que determinan cualidades de clases, métodos y atributos. – static no hacen referencia a variables de instancia de la clase, sólo a sus parámetros. Un método de instancia no recibe un mensaje a través de un objeto de la clase sino directamente a través de la clase: Math.max(i,j); – final no pueden ser redefinidos. – abstract no está definido, se implementa en una clase derivada. Si un método se declara abstracto, la clase debe declararse como abstracta. 57 METODOS

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 MODIFICADORES Java brinda modificadores que determinan cualidades de clases, métodos y atributos. – static están compartidos por todas las instancias de la clase. – final el valor es constante. 58 ATRIBUTOS Introducción a la Programación Orientada a Objetos IPOO - 2015


Descargar ppt "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 Polimorfismo."

Presentaciones similares


Anuncios Google