La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.

Presentaciones similares


Presentación del tema: "INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia."— 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 Herencia 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 Introducción a la Programación Orientada a Objetos IPOO - 2015 2 TEMARIO Relaciones entre clases. Herencia. Caso de estudio: Maquina expendedora.

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 RELACIONES ENTRE CLASES El diseño orientado a objetos propone modelar la resolución de un problema a partir de una colección de clases relacionadas entre sí. 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 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 Se establece cuando una clase declara variables locales o servicios que reciben parámetros de otra clase. RELACIONES ENTRE CLASES DependenciaAsociaciónHerencia 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

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 Introducción a la Programación Orientada a Objetos IPOO - 2015 5 TEMARIO Relaciones entre clases. Herencia. Caso de estudio: Maquina expendedora.

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 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. Se establece así una vinculación de generalización- especialización en la cual las clases de los niveles superiores son más generales que las clases de los niveles inferiores, considerando la estructura jerárquica. Introducción a la Programación Orientada a Objetos IPOO - 2015 6 La herencia es un mecanismo que permite organizar clases en una estructura jerárquica.

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 HERENCIA En toda relación de herencia podemos distinguir –a una clase base o superclase y –una clase derivada o subclase. La herencia jerárquica se caracteriza porque cada clase puede derivar en varias clases subclases, pero sólo puede llegar a tener una única clase base. Así las clases se organizan en un árbol cuya raíz es la clase más general. Introducción a la Programación Orientada a Objetos IPOO - 2015 7 En esta materia nos restringiremos exclusivamente a esta forma de herencia.

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 HERENCIA La abstracción de datos permite clasificar objetos en clases. La herencia 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 concepto de herencia en cambio surge con la POO. Introducción a la Programación Orientada a Objetos IPOO - 2015 8

9 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 IPOO - 2015 9 TEMARIO Relaciones entre clases. Herencia. Caso de estudio: Maquina expendedora.

10 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 Una fábrica produce dos tipos diferentes de máquinas expendedoras de infusiones, M111 y R101. Las máquinas del tipo M111 preparan café, café con leche, té, té con leche y submarino. Tienen depósitos para los siguientes ingredientes: café, té, leche y cacao. Las máquinas de tipo R101 preparan café, té y café carioca. Tienen depósitos para café, té, crema y cacao. Introducción a la Programación Orientada a Objetos IPOO - 2015 10

11 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 Los depósitos tienen las siguientes capacidades máximas: Café 1500 Té1000 Leche 600 Cacao600 Crema 600 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 IPOO - 2015 11

12 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 Cuando se habilita una máquina las cantidades disponibles comienzan con el valor máximo de cada ingrediente. La cantidad disponible aumenta cuando se carga el depósito con un ingrediente específico y disminuye cada vez que se prepara una infusión. El aumento es variable, aunque nunca se puede superar la capacidad máxima de cada ingrediente. Si el valor que se intenta cargar, sumado al disponible, supera al máximo, se completa hasta el máximo y retorna el sobrante. Introducción a la Programación Orientada a Objetos IPOO - 2015 12

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ÁQUINA EXPENDEDORA Cada vez que se solicita una infusión se reducen los ingredientes de acuerdo a la siguiente tabla: En el caso de la preparación de una taza de té, la máquina M111 utiliza 10 grs y la máquina R101 15 grs. 13 CaféCafé con leche SubmarinoTé con leche café carioca Café4030 Leche205020 Té20 Cacao4010 Crema30

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ÁQUINA EXPENDEDORA El diseñador de un modelo para las máquinas expendedoras podría especificar dos clases M111 y R101 de acuerdo al siguiente diagrama. 14 M111 > maxCafe: entero … > cantCafé: entero cantTe: entero cantCacao: entero cantLeche: entero > … R101 > maxCafe: entero… > cantCafé: entero cantTé: entero cantCacao: entero cantCrema: entero > …

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ÁQUINA EXPENDEDORA 15 M111 > … > cafe() te() cafeConLeche() teConLeche() submarino() … > obtenerCantCafe() : entero obtenerCantTe() : entero… R101 > … > cafe() te() carioca () … > obtenerCantCafe(): entero obtenerCantCrema(): entero …

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 16 MaquinaExpendedora > maxCafe: entero maxTe: entero maxCacao: entero maxLeche : entero maxCrema : entero

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ÁQUINA EXPENDEDORA 17 MaquinaExpendedora > cantCafe: entero cantTe: entero cantCacao: entero cantLeche : entero cantCrema : entero

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ÁQUINA EXPENDEDORA 18 MaquinaExpendedora > MaquinaExpendedora() > cargarCafe(grs: entero) : entero cargarCacao(grs: entero): entero cargarTe(grs: entero): entero cargarLeche(grs : entero) : entero cargarCrema(grs : entero) : entero Se carga lo necesario para alcanzar el máximo y devuelve lo que sobra Las cantidades disponibles se inicializan con los máximos

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ÁQUINA EXPENDEDORA 19 MaquinaExpendedora > MaquinaExpendedora() > cargarCafe(grs: entero) : entero cargarCacao(grs: entero): entero cargarTe(grs: entero): entero cargarLeche(grs : entero) : entero cargarCrema(grs : entero) : entero Se carga lo necesario para alcanzar el máximo y devuelve lo que sobra Las cantidades disponibles se inicializan con los máximos

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ÁQUINA EXPENDEDORA 20 MaquinaExpendedora >... cafe() cafeConLeche() teSuave() teFuerte() teConLeche() submarino() carioca() Require 30 grs de café y 20 de leche, se asume que se controló la disponibilidad Require cantCafe >=40

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 21 MaquinaExpendedora > obtenerCantCafe(): entero obtenerCantTe(): entero obtenerCantCacao(): entero obtenerCantLeche() : entero obtenerCantCrema() : entero obtenerMaxCafe(): entero obtenerMaxTe(): entero obtenerMaxCacao(): entero obtenerMaxLeche() : entero obtenerMaxCrema() : entero

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ÁQUINA EXPENDEDORA 22 MaquinaExpendedora > vasosCafe() : entero vasosTeSuave() : entero vasosTeFuerte() : entero vasosCafeConLeche() : entero vasosTeConLeche() : entero vasosSubmarino () : entero vasosCarioca() : entero Calcula la cantidad máxima de vasos de la infusión que pueden prepararse con las cantidades actuales

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ÁQUINA EXPENDEDORA 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. 23 MaquinaExpendedora R101M111

24 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 24 MaquinaExpendedora > maxCafe: entero maxTe: entero maxCacao: entero > cantCafe: entero cantTe: entero cantCacao: entero

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ÁQUINA EXPENDEDORA 25 MaquinaExpendedora >… > MaquinaExpendedora() Las cantidades disponibles se inicializan con los máximos

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ÁQUINA EXPENDEDORA 26 MaquinaExpendedora > cafe() cargarCafe(grs: entero) : entero cargarCacao(grs: entero): entero cargarTe(grs: entero): entero Se carga lo necesario para alcanzar el máximo y devuelve lo que sobra

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ÁQUINA EXPENDEDORA 27 MaquinaExpendedora > obtenerCantCafe(): entero obtenerCantTe(): entero obtenerCantCacao(): entero obtenerMaxCafe(): entero obtenerMaxTe(): entero obtenerMaxCacao(): entero vasosCafe() : entero Calcula la cantidad máxima de vasos de la infusión que pueden prepararse con las cantidades actuales

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ÁQUINA EXPENDEDORA Las clases especializadas especifican los atributos y servicios específicos. 28 M111 > maxLeche > cantLeche > teConLeche() submarino() > obtenerLeche() : entero… R101 > maxCrema > cantCrema > carioca () > obtenerCrema(): entero … … … …

29 29 MaquinaExpendedora >… > cantCafé cantTé cantCacao > cafe()… > obtenerCafe() : entero M111 >… > cantLeche > te() teConLeche() submarino() … > obtenerLeche() : entero… R101 >… > cantCrema > te() carioca ()… > obtenerCrema(): entero …

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ÁQUINA EXPENDEDORA La clase M111 está vinculada a la clase MaquinaExpendedora por una relación de herencia. La relación de herencia establece una relación de tipo es-un (isa) ya que todo objeto de clase M111 es también un objeto de clase MaquinaExpendedora. 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 MaquinaExpendedora. Análogamente entre la clase R101 y la clase MaquinaExpendedora existe una relación de tipo es-un. 30

31 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 { //atributos de clase private static final int maxCafe = 1500; private static final int maxTe = 1000; private static final int maxCacao = 600; //atributos de instancia private int cantCafe; private int cantTe; private int cantCacao; … } 31 La clase MaquinaExpendedora define los atributos compartidos por todas las máquinas

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 class MaquinaExpendedora { //atributos de clase private static final int maxCafe = 1500; private static final int maxTe = 1000; private static final int maxCacao = 600; //atributos de instancia private int cantCafe; private int cantTe; private int cantCacao; 32 /constructor public MaquinaExpendedora() { //Cada depósito se carga completo cantCafe = maxCafe; cantTe = maxTe; cantCacao = maxCacao; }

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ÁQUINA EXPENDEDORA class MaquinaExpendedora {… > public void cafe() { cantCafe = cantCafe – 40; } public int cargarCafe(int grs) { int vuelve = 0; if (cantCafe+grs > maxCafe) { vuelve = cantCafe+grs-maxCafe; cantCafe = maxCafe; } else cantCafe = cantCafe+grs; return vuelve; } 33

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ÁQUINA EXPENDEDORA class MaquinaExpendedora {… … > public int obtenerCantCafe (){ return cantCafe ; } public int vasosCafe() { return (int) cantCafe / 40; } … } 34

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ÁQUINA EXPENDEDORA class M111 extends MaquinaExpendedora { //atributo de clase private static final int maxLeche = 600; //atributo de instancia private int cantLeche; public M111 (){ … } … } 35 En Java la relación de herencia se especifica definiendo una clase derivada que extiende a una clase base.

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ÁQUINA EXPENDEDORA La clase M111 hereda de la clase MaquinaExpendedora todas las variables de clase, de instancia y métodos. Un objeto de clase M111 tiene todos los atributos de una MaquinaExpendedora más los específicos de su clase. 36 cantCafe cantTe cantCacao cantLeche

37 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 M111 extends MaquinaExpendedora { private static final int maxLeche = 600; private int cantLeche; … public int obtenerCantLeche (){ return cantLeche; } 37

38 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 R101 extends MaquinaExpendedora { //atributo de clase private static final int maxCrema=600; //atributo de instancia private int cantCrema; 38 public R101 (){ … } … }

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ÁQUINA EXPENDEDORA class R101 extends MaquinaExpendedora { private static final int maxCrema=600; private int cantCrema; … public int obtenerCantCrema(){ return cantCrema; } 39

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ÁQUINA EXPENDEDORA Una clase derivada hereda de la clase base todos sus atributos y métodos, pero no los constructores. Cada clase derivada tendrá sus propios constructores que pueden invocar a los constructores de las clases más generales. Para invocar al constructor de la clase base se usa la palabra clave super. Si se invoca al constructor de una clase base siempre tiene que ser en la primera línea de la definición del constructor de la clase derivada. Si no se invoca al constructor de la clase base explícitamente Java invoca implícitamente al constructor por omisión de la clase base. Introducción a la Programación Orientada a Objetos IPOO - 2015 40

41 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 { //atributos de clase private static final int maxCafe = 1500; private static final int maxTe = 1000; private static final int maxCacao = 600; //atributos de instancia private int cantCafe; private int cantTe; private int cantCacao; /constructor public MaquinaExpendedora() { //Cada depósito se carga completo cantCafe = maxCafe; cantTe = maxTe; cantCacao = maxCacao; } 41

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ÁQUINA EXPENDEDORA class M111 extends MaquinaExpendedora { //atributo de clase private static final int maxLeche = 600; //atributo de instancia private int cantLeche; public M111 (){ //Los depósitos comienzan completos super(); cantLeche = maxLeche; } } 42 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ÁQUINA EXPENDEDORA class R101 extends MaquinaExpendedora { //atributo de clase private static final int maxCrema = 600; //atributo de instancia private int cantCrema; public R101 (){ //Los depósitos comienzan completos super(); cantCrema = maxCrema; } 43 Introducción a la Programación Orientada a Objetos IPOO - 2015

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ÁQUINA EXPENDEDORA R101 m1 = new R101 (); M111 m2 = new M111(); m1.cafe(); m2.cafe(); 44 Introducción a la Programación Orientada a Objetos IPOO - 2015 En la realidad los modelos R101 y M111 ofrecen café. En el modelo, las clases R101 y M111 heredan los atributos de instancia y los servicios de la clase MaquinaExpendedora, de modo que un objeto de cualquiera de esas clases puede recibir el mensaje cafe.

45 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 R101 m1 = new R101 (); M111 m2 = new M111(); m2.teConLeche(); m1.teConLeche(); 45 Introducción a la Programación Orientada a Objetos IPOO - 2015 En la realidad solo el modelo M111 ofrece te con leche. En el modelo el servicio teConLeche está definido en la clase M111, de modo que solo las instancias de esa clases pueden recibir ese mensaje (y sus derivadas si las tuviera). NO ES VÁLIDO

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ÁQUINA EXPENDEDORA El encapsulamiento permite oscurecer los detalles de la definición de una clase, mostrando sólo aquellos elementos que permiten crear y manipular objetos. En Java los modificadores de acceso public y private permiten establecer el nivel de encapsulamiento. La interface está constituida por todos los elementos públicos que van a ser visibles desde otras clases. Introducción a la Programación Orientada a Objetos IPOO - 2015 46

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ÁQUINA EXPENDEDORA class M111 extends MaquinaExpendedora { private static final int maxLeche = 600; private int cantLeche;… public void teConLeche(…){ cantLeche = cantLeche - 20; cantTe = cantTe – 20; } } 47 Introducción a la Programación Orientada a Objetos IPOO - 2015 Solo los miembros públicos de la clase MaquinaExpendedora van a ser accesibles para la clase M111.

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ÁQUINA EXPENDEDORA class M111 extends MaquinaExpendedora { … private int cantLeche;… public void teConLeche(…){ cantLeche = cantLeche - 20; this.retirarTe(20); } } 48 Introducción a la Programación Orientada a Objetos IPOO - 2015 Toda instancia de la clase M111 tiene un atributo cantTe por ser también instancia de MaquinaExpendedora, pero para acceder a él tiene que usar el método retirarTe().

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ÁQUINA EXPENDEDORA 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, aun los que corresponden a las clases superiores en la jerarquía, 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 representación de los datos 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 IPOO - 2015 49

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ÁQUINA EXPENDEDORA class MaquinaExpendedora { protected int cantCafe; protected int cantTe; protected int cantCacao; … } 50 Introducción a la Programación Orientada a Objetos IPOO - 2015 Los elementos protegidos son accesibles para las clases derivadas. Java soporta ambas alternativas introduciendo un tercer modificador de acceso protected.

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ÁQUINA EXPENDEDORA class MaquinaExpendedora { protected int cantCafe; protected int cantTe; protected int cantCacao; … } 51 class M111 extends MaquinaExpendedora { protected int cantLeche; public void teConLeche(…){ cantLeche = cantLeche - 20; cantTe = cantTe – 20; } }

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ÁQUINA EXPENDEDORA El diseño de una aplicación puede realizarse partiendo de clases específicas y generalizando o en sentido inverso. La fábrica incorpora ahora un nuevo modelo R101 Plus que tiene la funcionalidad de R101 pero prepara un café más fuerte usando 45 grs. y agrega como ingrediente a la canela con capacidad máxima de 600 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. Introducción a la Programación Orientada a Objetos IPOO - 2015 52

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA El diagrama puede extenderse con este nuevo tipo de máquina expendedora como sigue: 53 R101Plus > maxCanela > cantCanela > cafe() bahiano() … > obtenerCanela(): entero … …

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA Si definimos una clase R101Plus con los atributos y comportamiento específico estamos realizando un proceso de especialización. 54 MaquinaExpendedora R101M111 R101Plus

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA 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 MaquinaExpendedora. La clase R101 es una clase derivada de la clase MaquinaExpendedora, 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 IPOO - 2015 55

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA class R101Plus extends R101 { protected static final int maxCanela = 600; protected int cantCanela; public R101Plus (){ super(); cantCanela = maxCanela; } } 56 Introducción a la Programación Orientada a Objetos IPOO - 2015

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA class R101Plus extends R101{ //atributo de clase protected static final int maxCanela = 600; //atributo de instancia protected int cantCanela; … public void cafe() { cantCafe = cantCafe -45; } public void bahiano() { carioca (); cantCanela = cantCanela-10; } 57 Asumiendo protegidos los atributos definidos en MaquinaExpendedora

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 CASO DE ESTUDIO: MÁQUINA EXPENDEDORA R101 m1 = new R101(); R101Plus m2 = new R101Plus(); m2.carioca(); m1.carioca(); m1.bahiano(); m2.bahiano(); 58 Introducción a la Programación Orientada a Objetos IPOO - 2015 NO ES VÁLIDO

59 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 Un mismo nombre puede utilizarse para definir un método en la clase base y otro en la clase derivada. Si en la clase derivada se define un método con el mismo nombre, número y tipo de parámetros que un método definido en la clase base, el método de la clase base queda derogado. Decimos que la definición de la clase derivada redefine al método de la clase base. Introducción a la Programación Orientada a Objetos IPOO - 2015 59

60 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; } 60 class R101Plus extends R101 { public void cafe() cantCafe = cantCafe - 45; } R101 m1 = new R101(); R101Plus m2 = new R101Plus(); … m1.cafe(); m2.cafe(); 1 2 2 1

61 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 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. Introducción a la Programación Orientada a Objetos IPOO - 2015 61

62 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 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 IPOO - 2015 62 public String toString() public boolean equals(Object o)

63 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 String toString(){ return cantCafe+ ”grs café “+ cantTe+“ grs te “+ cantCacao+”grs cacao”; } 63 Introducción a la Programación Orientada a Objetos IPOO - 2015

64 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 R101 extends MaquinaExpendedora { public String toString(){ return super.toString()+ cantCrema+ ”grs crema “; } 64 Introducción a la Programación Orientada a Objetos IPOO - 2015


Descargar ppt "INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia."

Presentaciones similares


Anuncios Google