INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo y Chequeo de Tipos Dr. Luciano H.

Download Report

Transcript INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo y Chequeo de Tipos Dr. Luciano H.

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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
2
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 del0 1 1 0 0
10011
comportamiento definiendo tipos de datos abstractos.
10110
• 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
01110
01100
10011
10110
01110
1001
1 11
0 0
1
3
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- 0 1 1 0 0
10011
especialización.
10110
01110
• Cuando la herencia es simple la clasificación es
01100
jerárquica y las clases se estructuran como un árbol. 1 0 0 1 1
•
10110
Un objeto que es instancia de una clase es también 0 1 1 1 0
instancia de sus clases ancestro siguiendo la rama en 1el0 0 1
1 11
árbol.
0 0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
4
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
01100
derivada.
10011
• Un método polimórfico recibe como parámetros a
variables polimórficas.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
5
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.
•
01100
Cuando un método se redefine, la ligadura entre un 1 0 0 1 1
10110
mensaje y un método queda determinada por la clase 0 1 1 1 0
01100
del objeto, esto es, por el tipo dinámico de una variable.
10011
10110
01110
1001
1 11
0 0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
6
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.
•
•
01100
10011
El tipo dinámico de la variable determina el método que
10110
se ejecuta en respuesta a un mensaje.
01110
01100
El compilador no puede establecer la ligadura entre un1 0 0 1 1
10110
mensaje y el método, es la clase del objeto en ejecución
01110
la que lo determina.
1001
1 11
0 0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
7
CASO DE ESTUDIO:
MÁQUINAS EXPENDEDORAS
MaquinaExpendedora
M111
R101
R101Plus
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
8
MaquinaExpendedora
<<atributos de clase>>
maxCafe: entero
maxTe: entero
maxCacao: entero
<<atributos de instancia>>
NroSerie: entero
cantCafe: entero
cantCacao: entero
cantTe: entero
<<constructor>>
MaquinaExpendedora(ns: entero)
<<comandos>>
cafe()
te()
cargarCafe(grs: entero): entero…
<<consultas>>
masCafe(MaquinaExpendedora e):
MaquinaExpedendora
Cada máquina tiene un
número que la identifica
9
M111
<<atributos de clase>>
maxLeche: entero …
<<atributos de instancia>>
cantLeche: entero …
<<constructor>>
M111(ns: entero)
<<comandos>>
te()
teConLeche
subMarino()…
cargarLeche(grs: entero): entero…
<<consultas>>
obtenerCantLeche(): entero…
obtenerMaxLeche(): entero …
vasosTeConLeche(): entero
10
R101
<<atributos de clase>>
maxCrema: entero …
<<atributos de instancia>>
cantCrema: entero …
<<constructor>>
R101(ns: entero)
<<comandos>>
te()
carioca()…
cargarCrema(grs: entero): entero…
<<consultas>>
obtenerCantCrema(): entero…
obtenerMaxCrema(): entero …
vasosCarioca(): entero …
11
R101Plus
<<atributos de clase>>
maxCanela: entero …
<<atributos de instancia>>
cantCanela: entero …
<<constructor>>
R101Plus(ns: entero)
<<comandos>>
cafe()
bahiano()…
cargarCanela(grs: entero) : entero…
<<consultas>>
obtenerCantCanela(): entero…
obtenerMaxCanela(): entero …
vasosCafe():entero
vasosBahiano() : entero …
Los métodos cafe() y
vasosCafe() se
redefinen
12
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.
MaquinaExpendedora me = new M111(nro1);
me
Introducción a la Programación Orientada a Objetos
IPOO - 2015
:M111
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
13
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
MaquinaExpendedora me = new M111(nro1);
…
me = new R101(nro2);
me
:M111
:R101
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
14
CASO DE ESTUDIO:
MÁQUINAS EXPENDEDORAS
MaquinaExpendedora me;
R101 r = new R101(nro);
me = r;
• 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.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
15
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;
}
}
MaquinaExpendedora me1,me2,me3;
R101 meR101 = new R101(nro1);
me1 = new R101Plus(nro2);
me2 = meR101.masCafe(me1);
me3 = me1.masCafe(meR101);
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
16
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.
R101 meR101 = new R101(nro1);
R101Plus meR101Plus ;
• El compilador rechaza :
meR101Plus= new R101(nro2);
meR101Plus= meR101;
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
17
CASO DE ESTUDIO:
MÁQUINAS EXPENDEDORAS
• El casting relaja el control del compilador.
R101 meR101 = new R101(nro);
R101Plus meR101Plus ;
if (meR101 instanceof R101Plus)
meR101Plus= (R101Plus) meR101;
•
•
01100
10011
10110
Es responsabilidad del programador asegurar que el 0 1 1 1 0
objeto referenciado por meR101 sea efectivamente de0 1 1 0 0
10011
clase R101Plus.
10110
Si no se incluye el condicional y meR101 no referencia0a1 1 1 0
1001
un objeto de clase R101Plus se produce una
1 11
0 0
excepción en ejecución.
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
18
CASO DE ESTUDIO:
MÁQUINAS EXPENDEDORAS
MaquinaExpendedora
te()
cafe()
masCafe(me)
M111
te()
teconLeche()
submarino()
Introducción a la Programación Orientada a Objetos
IPOO - 2015
R101
te()
carioca()
R101Plus
bahiano()
cafe()
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
19
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.
R101 meR101 ;
R101Plus meR101Plus = new R101Plus (nro);
meR101 = meR101Plus;
• El compilador rechaza
meR101.bahiano();
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
20
CASO DE ESTUDIO: MÁQUINA
EXPENDEDORA
class MaquinaExpendedora {
…
public void cafe() {
cantCafe=cantCafe–40;
}
…
}
class R101Plus extends R101
…
public void cafe() {
cantCafe=cantCafe-45;
}
…
}
MaquinaExpendedora me;
01100
R101Plus meR101Plus;
10011
10110
meR101Plus=new
01110
01100
R101Plus(nro);
{
10011
me = meR101Plus; 1 0 1 1 0
01110
me.cafe();
1001
1 11
0 0
1
21
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
01100
tienen una.
10011
• La clase MEHospital modela la tabla de máquinas
10110
01110
expendedoras asignadas a los pasillos y brinda servicios
01100
para computar
10011
– la cantidad total de café que contienen las máquinas1 0 1 1 0
01110
y
1001
– la cantidad total de leche entre los modelos M111. 1 1 1
0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
0
22
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
MaquinaExpendedora
M111
R101
R101Plus
MEHospital es una tabla
Introducción a la Programación Orientada a Objetos
IPOO - 2015
MEHospital
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
23
MEHospital
<<atributos de instancia>>
MaquinaExpendedora[] T
<<constructores>>
MEHospital(max: entero)
<<comandos>>
instalar(unaME: MaquinaExpendedora,
p: entero)
retirar(p:entero)
<<consultas>>
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
El pasillo p, que asume válido,
no queda ligado a una máquina
Calcula la cantidad de pasillos
que tienen una máquina
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
24
M111
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public void instalar(MaquinaExpendedora me,
int p) {
/*Inserta me en la posicion p, que asume
valido*/
T[p] = me;
01100
}
10011
public void retirar(int p){
/*Elimina la máquina del pasillo p,
asume valido*/
T[p] = null;
}
• El arreglo está constituido por un conjunto de
polimórficas.
10110
01110
01100
que
10011
10110
01110
1001
1 11
0 0
variables1
25
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public int cantPasillos(){
/*Cantidad de pasillos*/
return T.length;
}
public int cantPasillosOcupados(){
/*Calcula la cantidad de pasillos que
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
01100
10011
10110
tienen
01110
01100
10011
10110
01110
1001
1 11
0 0
1
26
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
27
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
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.
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
28
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
class MEHospital{
private MaquinaExpendedora[] T;
:M111
t
NroSerie
cantCafé
cantTe
cantCacao
cantLeche
:R101
NroSerie
cantCafé
cantTe
cantCacao
cantCrema
:R101Plus
NroSerie
cantCafé
cantTe
cantCacao
cantCrema
cantCanela
Todas tiene el
ingrediente café
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
29
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public int totalVasosCafe (){
int c = 0;
for (int i = 0; i < maxPasillos();i++) {
if (T[i] != null)
c = c + T[i].vasosCafe();
01100
10011
}
10110
return c;
01110
}
01100
•
•
10011
La operación vasosCafe() está provista para todas las 1 0 1 1 0
01110
máquinas.
1001
Si la fábrica ofrece 100 modelos diferentes, cada una con un
1 11
método vasosCafe() distinto, el método
0 0
1
totalVasosCafe() no cambia.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
30
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;
• En un lenguaje imperativo cada vez que se agrega un
nuevo modelo es necesario modificar el código.
31
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
MaquinaExpendedora
café()
vasosCafe()
M111
R101
R101Plus
café()
vasosCafe()
Introducción a la Programación Orientada a Objetos
IPOO - 2015
HEHospital
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
32
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
class MEHospital{
private MaquinaExpendedora[] T;
:M111
t
NroSerie
cantCafé
cantTe
cantCacao
cantLeche
:R101
NroSerie
cantCafé
cantTe
cantCacao
cantCrema
:R101Plus
NroSerie
cantCafé
cantTe
cantCacao
cantCrema
cantCanela
Sólo algunas
tienen leche
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
33
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public int totalLeche (){
int c = 0;
for (int i = 0; i < maxPasillos(); i++){
if (T[i] != null &&
01100
10011
T[i] instanceof M111){
}
•
10110
01110
c = c + T[i].obtenerCantLeche();} ERROR
01100
10011
}
10110
return c;
01110
1001
1 11
0 0
La operación obtenerCantLeche() sólo está provista
1
para los objetos de clase M111.
34
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public int totalLeche (){
int c = 0;
M111 aux;
for (int i = 0; i < maxPasillos(); i++){
if (T[i] != null &&
01100
10011
T[i] instanceof M111){
10110
aux = (M111)T[i];
01110
c = c + aux.obtenerCantLeche();}
01100
10011
}
10110
return c;
01110
}
1001
• La operación obtenerCantLeche() sólo está
para los objetos de clase M111.
1 11
0 0
provista
1
35
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
36
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;
}
• 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.
37
MaquinaExpendedora
<<atributos de clase>>
maxCafe: entero
maxTe: entero
maxCacao: entero
<<atributos de instancia>>
NroSerie: entero
cantCafe: entero
cantCacao: entero
cantTe: entero
<<constructor>>
MaquinaExpendedora(ns: entero)
<<comandos>>
cafe()
te()
cargarCafe(grs: entero): entero…
<<consultas>>
igualNroSerie(me:MaquinaExpendedora):
boolean
38
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
class MaquinaExpendedora {
public boolean
igualNroSerie(MaquinaExpendedora m){
return NroSerie == m.obtenerNroSerie();
}
01100
10011
}
• Todas las máquinas expendedoras tienen un número
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.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
10110
01110
de
01100
10011
10110
01110
1001
1 11
0 0
1
39
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
public boolean existeME
(MaquinaExpendedora unElem){
/* Decide si hay un elemento equivalente a
unElem, que asume ligada*/
int i = 0; boolean esta = false;
01100
10011
while (i < cantME && !esta){
10110
if (T[i] != null)
01110
esta = T[i].igualNroSerie(unaMe);
01100
10011
i++;
10110
}
01110
return esta;
1001
1 11
}
0
máquinas1
• En este caso el diseñador considera que dos
son equivalentes si tienen el mismo número de serie.
0
40
M111
<<atributos de clase>>
maxLeche: entero …
<<atributos de instancia>>
cantLeche: entero …
<<constructor>>
M111(ns: entero)
<<comandos>>
te()
teConLeche
subMarino()…
cargarLeche(grs: entero): entero…
<<consultas>>
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
41
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.
MaquinaExpendedora
M111
Introducción a la Programación Orientada a Objetos
IPOO - 2015
R101
R101Plus
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
42
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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
43
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
01100
expendedoras todas las máquinas brindan el servicio 1 0 0 1 1
te() pero la implementación concreta varía según el 1 0 1 1 0
01110
tipo de máquina.
01100
10011
10110
01110
1001
1 11
0 0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
44
MaquinaExpendedora
<<atributos de clase>>…
<<atributos de instancia>>
<<comandos>>
*te()…
<<consultas>>
*vasosTe() : entero
M111
R101
<<atributos de clase>>…
<<atributos de instancia>>
<<comandos>>
<<atributos de clase>>…
<<atributos de instancia>>
<<comandos>>
te()
te()
<<consultas>>
<<consultas>>
vasosTe() : entero
vasosTe() : entero
45
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
• En Java, el modificador abstract permite declarar una
clase abstracta.
abstract class MaquinaExpendedora {
}
01100
• Una clase abstracta puede contener uno o más métodos
abstractos, esto es, la clase especifica un servicio pero1 0 0 1 1
10110
no indica cómo se implementa.
01110
public abstract void te() ;
public abstract int vasosTe();
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
1001
1 11
0 0
1
46
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
• Todas las máquinas expendedoras ofrecen el servicio
te() pero la implementación varía.
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); }
}
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
47
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
• Todas las máquinas expendedoras ofrecen el servicio
vasosTe() pero la implementación varía.
class abstract MaquinaExpendedora {
public abstract int vasosTe() ;
}
01100
10011
10110
class M111 extends MaquinaExpendedora {
01110
public int vasosTe() {
01100
return this.obtenerCantTe() / 10; } 1 0 0 1 1
10110
}
01110
1001
class R101 extends MaquinaExpendedora{
1 11
0 0
public int vasosTe() {
return this.obtenerCantTe() / 15;} 1
}
48
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
class MEHospital{…
public int totalVasosTe (){
int c = 0;
for (int i = 0; i < maxPasillos();i++) {
if (T[i] != null)
01100
c = c + T[i].vasosTe();
10011
10110
}
01110
return c;
01100
}
10011
10110
}
01110
…
1001
}
1 11
• El arreglo está constituido por un conjunto de variables
polimórficas.
• La operación vasosTe() está provista para todas.
0
1
0
49
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:
MaquinaExpendedora me;
• Pero el compilador reportará un ERROR si se intenta
crear una instancia:
me = new MaquinaExpendedora(nro);
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
50
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
MaquinaExpendedora me;
M111 meM111;
me = new M111(nro1);
meM111 = new M111(nro2);
me.te();
meM111.te();
• Ambos mensajes se ligarán al método te() provisto
por la clase M111.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
51
CASO DE ESTUDIO: M.E. EN
UN HOSPITAL
MaquinaExpendedora me;
R101 meR101;
R101Plus meR101Plus;
me = new R101(nro1);
meR101 = new R101(nro2);
meR101Plus = new R101Plus(nro3);
me.te();
meR101.te();
meR101Plus.te();
• Los mensajes se ligarán al método te() provisto
clase R101.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
10011
10110
01110
01100
10011
10110
01110
1001
por 1la 1 1
0 0
1
52
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
01100
del problema. En ejecución no va a haber instancias de1 0 0 1 1
10110
una clase abstracta.
•
•
01110
Las clases abstractas pueden identificarse en la etapa 0 1 1 0 0
10011
de diseño de la aplicación o pueden crearse
10110
artificialmente durante la implementación.
01110
1001
Una clase abstracta puede tener uno o más métodos 1 1 1
0 0
abstractos.
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
53
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
01100
implementa los métodos abstractos de su clase base, 1 0 0 1 1
debe definirse también como abstracta o el compilador1 0 1 1 0
01110
notifica un error.
• Como no existen instancias de una clase abstracta,
constructor sólo puede ser invocado desde los
constructores de las clases derivadas.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
01100
el 1 0 0 1 1
10110
01110
1001
1 11
0 0
1
54
MODIFICADORES
• Java brinda modificadores que determinan cualidades
de clases, métodos y atributos.
CLASES
– 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
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
55
MODIFICADORES
• Java brinda modificadores que determinan cualidades
de clases, métodos y atributos.
METODOS Y ATRIBUTOS
– public es visible en todas las clases.
–
–
01100
10011
private sólo es visible dentro de la clase en la que1 0 1 1 0
01110
se declara.
01100
protected es visible en el paquete y en las clases1 0 0 1 1
10110
derivadas.
01110
1001
1 11
0 0
1
Introducción a la Programación Orientada a Objetos
IPOO - 2015
56
MODIFICADORES
• Java brinda modificadores que determinan cualidades
de clases, métodos y atributos.
METODOS
– static no hacen referencia a variables de instancia
01100
de la clase, sólo a sus parámetros. Un método de 1 0 0 1 1
10110
instancia no recibe un mensaje a través de un objeto
01110
de la clase sino directamente a través de la clase: 0 1 1 0 0
10011
Math.max(i,j);
–
–
10110
01110
final no pueden ser redefinidos.
1001
abstract no está definido, se implementa en una 1 1 1
0 0
clase derivada. Si un método se declara abstracto, la
1
clase debe declararse como abstracta.
57
MODIFICADORES
• Java brinda modificadores que determinan cualidades
de clases, métodos y atributos.
ATRIBUTOS
– static están compartidos por todas las instancias0 1 1 0 0
10011
de la clase.
– final el valor es constante.
Introducción a la Programación Orientada a Objetos
IPOO - 2015
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
58