12
Introducción a la Programación Orientada a Objetos Profesor Luciano H. Tamargo 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 1 1 1 0 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia y Polimorfismo Dr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2018 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 1 1 1 0 0 1 Introducción a la Programación Orientada a Objetos 2 TEMARIO Relaciones entre clases. • Herencia. Caso de estudio: Maquina expendedora. 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 1 1 1 0 0 1 RELACIONES ENTRE CLASES Un sistema desarrollado en base al paradigma de programación orientada a objetos está conformado por una colección de clases vinculadas por relaciones. Hasta el momento las clases estuvieron vinculadas a través de dos formas de relación: dependencia y asociación. El mecanismo fundamental propuesto por la POO para relacionar clases es la herencia. Introducción a la Programación Orientada a Objetos 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 1 1 1 0 0 1 Se establece cuando una clase declara variables locales, o hay servicios que reciben parámetros de otra clase. RELACIONES ENTRE CLASES Dependencia Asociación Herencia Se establece cuando un atributo de instancia de una clase corresponde a otra clase. Se establece cuando una clase especializa a otra de modo tal que los objetos de la clase más específica son también instancias de la clase más general. Las clases se vinculan a través de una relación del tipo usaUn Las clases se vinculan a través de una relación del tipo tieneUn Las clases se vinculan a través de una relación del tipo esUn 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 1 1 1 0 0 1 Introducción a la Programación Orientada a Objetos 5 TEMARIO Relaciones entre clases. • Herencia. Caso de estudio: Maquina expendedora. 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 1 1 1 0 0 1 HERENCIA Una clase puede ser usada para crear instancias en ejecución pero también para definir otras clases más específicas y especializadas. Cada clase que se usa para definir otra más específica se llama clase base o superclase. Toda clase que hereda de una clase base se llama clase derivada o subclase. Introducción a la Programación Orientada a Objetos 6 La herencia jerárquica es un mecanismo que permite organizar clases de acuerdo a relaciones de generalización-especialización.

v } µ ] v o W } P u ] v K ] v K i } 352*5$0$&,Ï1 25,(17 ...lt/ipoo/downloads/ClasesTeoria/Clase 4.2.pdf · gh vxv fodvh dqfhvwur vl hvshflilfd ho plvpr qrpeuh q~phur \ wlsr gh

Embed Size (px)

Citation preview

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 1

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA

A OBJETOS

Herencia y Polimorfismo

Dr. Luciano H. Tamargo

http://cs.uns.edu.ar/~lt

Depto. de Ciencias e Ingeniería de la Computación

Universidad Nacional del Sur, Bahía Blanca

2018

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

Introducción a la Programación Orientada a Objetos 2

TEMARIO

• Relaciones entre clases.

• Herencia.

• Caso de estudio: Maquina expendedora.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

RELACIONES ENTRE CLASES

• Un sistema desarrollado en base al paradigma de programación orientada a objetos está conformado por una colección de clases vinculadas por relaciones.

• Hasta el momento las clases estuvieron vinculadas a través de dos formas de relación:

– dependencia y

– asociación.

• El mecanismo fundamental propuesto por la POO para relacionar clases es la herencia.

Introducción a la Programación Orientada a Objetos 3

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

Se establece cuando una clase declara variables

locales, o hay servicios que

reciben parámetros de otra clase.

RELACIONES ENTRE CLASES

Dependencia Asociación Herencia

Se establece cuando un atributo de instancia de una clase corresponde a

otra clase.

Se establece cuando una clase especializa a otra

de modo tal que los objetos de la clase más específica son también instancias

de la clase más general.

Las clases se vinculan a través de una relación del tipo

usaUn

Las clases se vinculan a través de una relación del tipo

tieneUn

Las clases se vinculan a través de una relación del tipo

esUn

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

Introducción a la Programación Orientada a Objetos 5

TEMARIO

• Relaciones entre clases.

• Herencia.

• Caso de estudio: Maquina expendedora. 0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

HERENCIA

• Una clase puede ser usada para crear instancias en ejecución pero también para definir otras clases más específicas y especializadas.

• Cada clase que se usa para definir otra más específica se llama clase base o superclase.

• Toda clase que hereda de una clase base se llama clase derivada o subclase.

Introducción a la Programación Orientada a Objetos 6

La herencia jerárquica es un mecanismo que permite organizar clases de acuerdo a relaciones de generalización-especialización.

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 2

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

HERENCIA

• La herencia jerárquica se caracteriza porque cada clase puede derivar en varias clases subclases, sólo puede llegar a tener una única clase padre, aunque puede tener varios ancestros.

• Las clases relacionadas por herencia pueden dibujarse como un árbol, cuya raíz es la clase más general.

• Las hojas del árbol son las clases más especializadas.

• Las clases de los niveles intermedio son al mismo tiempo clases base y derivadas.

Introducción a la Programación Orientada a Objetos 7

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

HERENCIA

• La abstracción de datos permite clasificar objetos en clases.

• La herencia jerárquica aumenta el nivel de abstracción porque las clases son a su vez clasificadas a partir de un proceso de generalización o especialización.

• Los conceptos clase, abstracción de datos y encapsulamiento, NO son exclusivos de la POO.

• El mecanismo de herencia aplicado al desarrollo de software, surge con la POO.

Introducción a la Programación Orientada a Objetos 8

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

HERENCIA Y ENCAPSULAMIENTO

• El encapsulamiento permite oscurecer los detalles de la definición de una clase, mostrando sólo aquellos elementos que permiten crear y manipular objetos.

• La interfaz está constituida por todos los miembros que van a ser visibles desde otras clases.

Introducción a la Programación Orientada a Objetos 9

• En Java el modificador de acceso protectedestablece que las clases derivadas tienen acceso a los miembros protegidos de sus clases ancestro.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

HERENCIA Y ENCAPSULAMIENTO

• Existen diferentes criterios referidos al nivel de encapsulamiento que debería ligar a clases vinculadas por una relación de herencia.

• Un argumento a favor de que las clases derivadas accedan a todos sus atributos, es que una instancia de una clase específica es también una instancia de las clases más generales de modo que debería poder acceder y modificar su estado interno.

• El argumento en contra es que si se modifica la implementación de la clase base, el cambio afectará a todas las clases derivadas que accedan directamente a la representación.

Introducción a la Programación Orientada a Objetos 10

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

REDEFINICIÓN Y SOBRECARGA

• Una clase derivada puede redefinir un método de una de sus clase ancestro, si especifica el mismo nombre, número y tipo de parámetros.

• Decimos que el método en la clase derivada deroga al método de la clase base.

• Una clase derivada puede sobrecargar un método de una de sus clase ancestro, si especifica el mismo nombre, con distinto número o tipo de parámetros.

• ¿Qué pasa si el método se declara privado en la clase derivada?

Introducción a la Programación Orientada a Objetos 11

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

LA CLASE OBJECT

• Java brinda la clase predefinida Object como raíz de la jerarquía de herencia.

• Es la única clase que no está relacionada con una superclase.

• Todas las demás clases, explícita o implícitamente, heredan de la clase Object.

• La clase Object brinda el comportamiento común a todos los objetos.

• Los servicios provistos por Object van a ser redefinidos o sobrecargados por las clases derivadas para implementar comportamiento específico.

Introducción a la Programación Orientada a Objetos 12

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 3

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

Introducción a la Programación Orientada a Objetos 13

TEMARIO

• Relaciones entre clases.

• Herencia.

• Caso de estudio: Maquina expendedora. 0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Una fábrica produce dos tipos diferentes de máquinas expendedoras de café, M111 y R101.

• Las máquinas del tipo M111 preparan café y café con leche. Tienen depósitos para los siguientes ingredientes: café y leche.

• Las máquinas de tipo R101 preparan café y café carioca. Tienen depósitos para café, crema y cacao.

• Los dos modelos tienen un depósito de agua.

Introducción a la Programación Orientada a Objetos 14

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE 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.

Introducción a la Programación Orientada a Objetos 15

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Cuando se habilita una máquina las cantidades disponibles comienzan con el valor máximo de cada ingrediente.

• La cantidad disponible aumenta cuando se carga el depósito con un ingrediente específico y disminuye cada vez que se prepara un café.

• Cuando se recarga se completa el depósito hasta su máxima capacidad.

Introducción a la Programación Orientada a Objetos 16

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Cada vez que se solicita una infusión se reducen los ingredientes de acuerdo a la siguiente tabla:

17

Café Café con leche

café carioca

Café 40 40 30

Leche 20

Cacao 10

Crema 30

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• El diseñador de un modelo para las máquinas expendedoras podría especificar dos clases de acuerdo al siguiente diagrama.

M111<<atributos de clase>>maxCafe: entero maxAgua: entero maxLeche: entero <<atributos de instancia>>cantCafé: enterocantAgua: enterocantLeche: entero

R101<<atributos de clase>>maxCafe: enteromaxAgua: enteromaxCacao: enteromaxCrema: entero<<atributos de instancia>>cantCafé: enterocantAgua: enterocantCacao: enterocantCrema: entero

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 4

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

19

M111<<Constructor>>M111()<<Comandos>>cafe()cafeConLeche()recargarCafe()recargarAgua()recargarLeche()<<consultas>>vasosCafe():enterovalosCafeConLeche():entero

R101<<Constructor>>R101()<<Comandos>>cafe()cafeCarioca()recargarCafe()recargarAgua()recargarCrema()recargarCacao()<<consultas>>vasosCafe():enterovasosCafeCarioca(): entero

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Alternativamente el diagrama podría incluir a una única clase que modele los dos tipos de máquinas:

20

ExpendedoraCafe<<atributos de clase>>maxCafe: entero maxAgua: entero maxLeche : enteromaxCacao: entero maxCrema : entero<<atributos de instancia>>cantCafe: entero cantAgua: entero cantLeche : enterocantCacao: entero cantCrema : entero

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

21

ExpendedoraCafe<<constructor>>ExpendedoraCafe()<<comandos>> cafe()cafeConLeche()cafeCarioca()

Las cantidadesdisponibles se inicializan con losmáximos

Introducción a la Programación Orientada a Objetos

Require disponible 40 grsde café, 200 ml de agua y 20 grs. de leche.

Require disponible 40 grs. de café y 200 ml de agua.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

22

ExpendedoraCafe<<comandos>>...recargarCafe()recargarAgua()recargarLeche()recargarCrema()recargarCacao()

Se carga el depósitocompleto

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

23

ExpendedoraCafe<<consultas>>vasosCafe() : enterovasosCafeConLeche() : enterovasosCafeCarioca() : entero

Calcula la cantidadmáxima de vasos quepueden prepararsecon las cantidades endepósito

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Un modelo más adecuado consistiría en factorizar los atributos y comportamiento compartidos de M111 y R101 en una clase general y retener los atributos y comportamientos específicos en clases especializadas.

• Este proceso se conoce como generalización porque fuimos desde dos clases específicas a una más general.

24

ExpendedoraCafe

R101M111

Introducción a la Programación Orientada a Objetos

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 5

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase más general incluye los atributos compartidos por todas las instancias:

25

ExpendedoraCafe

<<atributos de clase>>maxCafe: entero maxAgua: entero

<<atributos de instancia>>cantCafe: entero cantAgua: entero

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase más general incluye los servicios compartidos por todas las instancias:

26

ExpendedoraCafe

<<Constructor>>ExpendedoraCafe()<<Comandos>>cafe()recargarCafe()recargarAgua()<<consultas>>vasosCafe():entero

Se carga el depósito completo

Las cantidades disponibles se inicializan con los máximos

Require disponible 40 grs. de café y 200 ml de agua.

Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Las clases especializadas incluyen atributos y servicios específicos.

27

M111<<atributos de clase>>maxLeche:entero<<atributos de instancia>>cantLeche:entero<<Constructor>>M111()<<Comandos>>cafeConLeche()recargarLeche()<<consultas>>vasosCafeConLeche():entero

Se carga el depósito completo

Las cantidades disponibles se inicializan con los máximos

Require disponible 40 grs. de café, 20 de leche y 200 ml de agua.

Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

28

R101<<atributos de clase>>maxCrema:enteromaxCacao:entero<<atributos de instancia>>cantCrema:enterocantCacao:entero<<Constructor>>R101()<<Comandos>>carioca()recargarCrema()recargarCacao()<<consultas>>vasosCarioca():entero

Se carga el depósito completo

Las cantidades disponibles se inicializan con los máximos

Require disponible 30 grs. de café, 30 de crema, 10 de cacaoy 200 ml de agua.

Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase M111 está vinculada a la clase ExpendedoraCafe por una relación de herencia.

• Todo objeto de clase M111 es también un objeto de clase ExpendedoraCafe.

• Un objeto de clase M111 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 ExpendedoraCafe.

29Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase R101 está vinculada a la clase ExpendedoraCafe por una relación de herencia.

• Todo objeto de clase R101 es también un objeto de clase ExpendedoraCafe.

• Un objeto de clase R101 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 ExpendedoraCafe.

30Introducción a la Programación Orientada a Objetos

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 6

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

class ExpendedoraCafe {//atributos de clase//gramosprotected static final int maxCafe = 1500;//mililitrosprotected static final int maxAgua = 1500;//atributos de instanciaprotected int cantCafe;protected int cantAgua;…}

31Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Constructor de ExpendedoraCafepublic ExpendedoraCafe() {//Cada depósito se carga completocantCafe = maxCafe;cantAgua = maxAgua;

}

32Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Comandos de ExpendedoraCafepublic 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 completocantCafe = maxCafe;

}public void recargarAgua() {//Carga el depósito completocantAgua = maxAgua;

} 33

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Consultas de ExpendedoraCafepublic 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;}

34Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

class M111 extends ExpendedoraCafe{//atributo de clase//gramosprotected static final int maxLeche = 600;

//atributo de instanciaprotected int cantLeche;

35

• En Java la palabra extend especifica que la clase M111hereda de la clase ExpendedoraCafe.

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Constructor de M111public M111() {//Cada depósito se carga completosuper();cantLeche = maxLeche;

}

36

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

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 7

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• El estado interno de cada objeto de clase M111 incluye los atributos definidos en esa clase más los atributos heredados de ExpendedoraCafe.

37

: M111cantCafecantAguacantLeche

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Comandos de M111public 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 completocantLeche = maxLeche;

}

38Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Consultas de M111public 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;}

39Introducción a la Programación Orientada a Objetos Introducción a la Programación Orientada a Objetos 40

class R101 extends ExpendedoraCafe {//atributos de clase//gramosprotected static final int maxCrema = 600;protected static final int maxCacao = 300;//atributos de instanciaprotected int cantCrema;protected int cantCacao;

//Constructor de R101public R101() {//Cada depósito se carga completosuper();cantCacao = maxCacao;cantCrema = maxCrema;

}

41

//Comandos de R101public 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 completocantCrema = maxCrema; }

public void recargarCacao() {//Carga el depósito completocantCacao = maxCacao;

}

• El atributo cantCafe es accesible porque está declarado como protegido.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• En el problema, las máquinas R101 y M111 ofrecen café.

• En la solución, las clases R101 y M111 heredan los atributos de instancia y los servicios de la clase ExpendedoraCafe, de modo que un objeto de cualquiera de esas clases puede recibir el mensaje cafe().

Introducción a la Programación Orientada a Objetos 42

R101 m1 = new R101 ();M111 m2 = new M111();

m1.cafe();m2.cafe();

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 8

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• En el problema, solo las máquinas del modelo M111 ofrecen café con leche.

• En la solución, solo los objetos de clase M111 pueden recibir el mensaje cafeConLeche.

Introducción a la Programación Orientada a Objetos 43

R101 m1 = new R101 ();M111 m2 = new M111();

m1.cafeConLeche();m2.cafeConLeche();

Error en compilación

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La fábrica incorpora ahora un nuevo modelo R101 Plus que tiene la funcionalidad de R101 pero prepara un café más fuerte usando 50 grs. y agrega como ingrediente a la canela con capacidad máxima de 300 gramos y prepara café bahiano.

• El café bahiano requiere la preparación de un café carioca al cual se le agregan 10 gramos de canela.

Introducción a la Programación Orientada a Objetos 44

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase R101Plus especializa a la clase R101.

45

MaquinaExpendedora

R101M111

R101Plus

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

46

R101Plus<<atributos de clase>>maxCanela:entero<<atributos de instancia>>cantCanela:entero<<Constructor>>R101Plus()<<Comandos>>cafe()bahiano()recargarCanela()<<consultas>>vasosCafe():enterovasosBahiano():entero

• Las clases especializadas incluyen atributos y servicios específicos.

Se carga el depósito completo

Las cantidades disponibles se inicializan con los máximos

Require disponible para un café carioca y 10 gramos de canela.

Calcula la cantidad máxima de vasos que pueden prepararse con las cantidades en depósito

Require 50 gr. de café.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• La clase R101Plus está vinculada a la clase R101 por una relación de herencia.

• Todo objeto de la clase R101Plus es también un objeto de la clase R101 y además un objeto de la clase ExpendedoraCafe.

• La clase R101 es una clase derivada de la clase ExpendedoraCafe, pero a su vez es una clase base para la clase R101Plus.

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

Introducción a la Programación Orientada a Objetos 47

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

class R101Plus extends R101 {//Atributo de claseprotected static final int maxCanela = 300;//Atributo de instanciaprotected int cantCanela;//Constructorpublic R101Plus (){super();cantCanela = maxCanela;

}

48Introducción a la Programación Orientada a Objetos

• El constructor de R101Plus puede acceder al constructor de la clase R101 pero no al constructor de ExpendedoraCafe.

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 9

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Comandos en la clase R101Pluspublic void cafe() {/*Requiere 50 gramos de café en el depósito*/cantCafe = cantCafe -50;cantAgua= cantAgua -200;

}public void bahiano() {/*Requiere disponible para un carioca y 10

gramos de canela*/carioca ();cantCanela = cantCanela-10;

}public void recargarCanela() {//Carga el depósito completocantCanela = maxCanela; }

49Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Consultas en la clase R101Pluspublic int vasosCafe(){/*Computa cuántos vasos de café pueden prepararse con las cantidades disponibles*/int c = (int) cantCafe / 50;int a = (int) cantAgua / 200;if (c < a) return c;else return a;}

50

• La consulta vasosCafe() de la clase R101Plusredefine a la consulta vasosCafe() definido en ExpendedoraCafe.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

//Comandos en la clase ExpendedoraCafepublic void cafe() {/*Requiere 40 gs de café en el depósito*/cantCafe = cantCafe -40;

}

51

• El método cafe() de la clase R101Plus redefine al método cafe() definido en ExpendedoraCafe.

//Comandos en la clase R101Pluspublic void cafe() {/*Requiere 50 gramos de café en el depósito*/cantCafe = cantCafe -50;

}

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• El método cafe() de la clase ExpendedoraCafequeda derogado para los objetos de clase R101Plus.

Introducción a la Programación Orientada a Objetos 52

R101 m1 = new R101(); R101Plus m2 = new R101Plus();

m1.cafe();m2.cafe();

Se liga al método definido en ExpendedoraCafeSe liga al método definido en R101Plus

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 53

R101 m1 = new R101(); R101Plus m2 = new R101Plus();

m1.carioca();m2.carioca();m1.bahiano();m2.bahiano();

Error de compilación

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Las variables e1, e2 y e3 son polimórficas, pueden quedar ligadas a objetos de la clase ExpendedoraCafe o de sus clases derivadas.

Introducción a la Programación Orientada a Objetos 54

ExpendedoraCafe e1,e2,e3;e1 = new M111();e2 = new R101(); e3 = new R101Plus();

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 10

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 55

ExpendedoraCafe e1,e2,e3;e1 = new M111();e2 = new R101(); e3 = new R101Plus();

e1.cafe();e2.cafe();e3.cafe();

Se liga al método definido en ExpendedoraCafe

Se liga al método definido en R101Plus

Se liga al método definido en ExpendedoraCafe

• La clase del objeto determina la ligadura entre el mensaje y el método.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 56

ExpendedoraCafe e1,e2,e3;e1 = new M111();e2 = new R101(); e3 = new R101Plus();

e1.cafeConLeche();e2.carioca();e3.bahiano();

ERRORES de compilación

• El tipo de la variable determina los mensajes que puede recibir el objeto.

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 57

ExpendedoraCafe e;if conde = new M111():

elsee = new R101();

e.cafe(); 0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 58

ExpendedoraCafe e;if conde = new M111():

elsee = new R101();

e.carioca(); ERROR

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

• Como parte de sus actividades de responsabilidad social la fábrica instala y mantiene en funcionamiento las máquinas expendedoras de café de algunos hospitales.

• Cada máquina se asigna a un sector del hospital y el encargado realiza un relevamiento que le permite instalar nuevas máquinas, desinstalar y efectuar consultas.

Introducción a la Programación Orientada a Objetos 59

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

60

MaquinaExpendedora

R101M111

R101Plus

Introducción a la Programación Orientada a Objetos

MEHospital

Introducción a la Programación Orientada a Objetos

Profesor Luciano H. Tamargo 11

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

ExpHospital<<atributos de instancia>>T [] ExpendedoraCafe<<constructores>>expHospital(max: entero)<<comandos>>instalar(r: ExpendedoraCafe, s: entero)desinstalar(s: entero)<<consultas>>cantSectores(): enterocantSectoresOcupados(): enterotodosOcupados(): booleanestaExpendedoraCafe(r: ExpendedoraCafe): booleanexisteSector(s: entero): booleancantDisponible(vasos: entero): entero 61

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 62

class ExpHospital {private ExpendedoraCafe[] T;

//Constructorpublic ExpHospital(int max) {/*Crea un arreglo con max elementos, cada elemento representa un sector de lafábrica*/T = new ExpendedoraCafe[max];

}...}

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

public void instalar(ExpendedoraCafe r, int s) {

/*Asigna el la máquina r al sector s. Requiere 0<=s<cantSectores() */T[s] = r;

}

63

public void desinstalar(int s) {/*Elimina la asignación de la máquina r del sector s. Requiere 0<=s<cantSectores()*/T[s] = null;

}

Introducción a la Programación Orientada a Objetos

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 64

public int cantSectores(){return T.length;

}public int cantSectoresOcupados (){int i = 0; int cant = 0;while (i < cantSectores()){if (T[i]!=null) cant++;i++;

}return cant;

}

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 65

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;

}

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 66

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

Profesor Luciano H. Tamargo 12

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

Introducción a la Programación Orientada a Objetos 67

public boolean existeSector (int s){return s>= 0 & s< cantSectores();

}

public ExpendedoraCafe expSector (int s){/*Retorna la máquina instalada en el sector s, requiere 0<=s<cantSectores()*/return T[s];

}

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE 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;}

El mensaje vasosCafe() se liga al método definido en la clase del objeto referenciado por T[i] 68

0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1

CASO DE ESTUDIO: EXPENDEDORA DE CAFÉ

class gestionHospital{

…ExpHospital eh = new ExpHospiral(10);M111 m1 = new M111();R101Plus m2 = new R101Plus();

eh.instalar(m1,5);eh.instalar(m2,1);

}

Introducción a la Programación Orientada a Objetos 69 70

eh

10

t

:ExpHospital

:R101Plus

:M111

m1 m2