La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.

Presentaciones similares


Presentación del tema: ":: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación."— Transcripción de la presentación:

1 :: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación

2 Herencia Programación I La idea básica consiste en que las clases nuevas se construyen a partir de las clases ya existentes. Es decir, las clases nuevas toman las características (atributos y métodos) de la(s) clase(s) de la que se hereda. La herencia es la característica clave de los sistemas orientados a objetos para propiciar la reusabilidad.

3 Herencia Programación I La herencia permite: Adoptar automáticamente características ya implementadas, con lo cual se ahorra tiempo y espacio al no tener que programar toda la clase desde cero. Adoptar automáticamente características ya probadas, con lo cual se ahorra tiempo al no tener que probar y depurar las características heredadas.

4 Herencia Programación I Ejemplo: es-unes-una-clase-de La herencia implementa las relaciones es-un o es-una-clase-de.

5 Herencia Programación I FútbolPelotaFútbol Pelota Fútbol es una clase de Pelota. Fútbol tiene todos los atributos y operaciones de Pelota. Fútbol desinflar lanzar Fútbol No obstante, la clase Fútbol ha ocultado (hecho privada) la operación desinflar (sacándola de la interfaz pública) y sobrecargó el método lanzar con una implementación apropiada para el Fútbol. La clase Pelota es la clase padre (superclase) en la jerarquía.

6 Herencia Programación I La herencia es una forma de especialización en donde las clases hijas son refinadas para tener el comportamiento y atributos adecuados para la aplicación de que se trate. Al poder las clases derivadas añadir, redefinir y ocultar miembros, la herencia se convierte en reusabilidad programable. Cuando se crea una clase es posible que sea útil para la creación de futuras clases. De modo que, cuando se esté haciendo un programa distinto y se necesite esa clase, ésta se pueda incluir en el código de ese nuevo programa.

7 Herencia por Composición Programación I También es posible, que se utilice una clase para crear instancias de la misma en nuevas clases. A eso se le llama Composición. Banco Cuentas Representa una relación “tiene un”, un ejemplo lo vimos en el ejercicio pasado cuando la clase Banco tenía varias Cuentas. RuedaAuto Auto Rueda Otro ejemplo es, supongamos que tenemos la clase Rueda y una clase Auto, es de esperar que la clase Auto tenga cuatro instancias de Rueda ó un vector de 4 posiciones, por ejemplo:

8 Herencia por Composición Programación I public class Rueda{ private int tamanho; private String marca; public Rueda(){ } public class Auto{ private String Placa; private Rueda rueda1, rueda2, rueda3, rueda4; private Rueda [] ruedas=new Rueda[4]; public Auto(){ rueda1=new Rueda(); //A todos los obj ruedas for (int i=0; i < ruedas.length; i++) ruedas[i]=new Rueda(); }

9 Herencia por Composición Programación I public class Circulo{ Punto centro; int radio; public float superficie() { return 3.14*radio*radio; } Es la técnica en la que una clase se compone o contiene instancias de otras clases. Es una técnica muy habitual cuando se diseñan clases. En el ejemplo diríamos que un Circulo tiene un punto (centro) y un radio. Ejemplo:

10 Herencia por Extensión Programación I Pero, además de ésta técnica de Composición es posible pensar en casos en los que una clase es una extensión de otra. Es decir, una clase es como otra y además tiene algún tipo de característica propia que la distingue.

11 Herencia por Extensión Programación I Aves Persona InsectosMamíferos HombreMujer Animal

12 Herencia por Extensión Programación I Es el proceso por el cual un objeto puede adquirir las propiedades y métodos de otro objeto. La herencia supone una clase base y una jerarquía de clases que contiene las clases derivadas de la clase base. Además, es una forma de reutilización de software, en la cual se crean las clases nuevas a partir de las clases existentes, mediante la absorción de sus atributos y comportamientos.

13 Herencia por Extensión: Tipos Programación I La herencia simple es aquella donde las clases derivadas toman atributos y comportamientos de una sola clase base. La herencia múltiple es aquella donde las clases derivadas toman los atributos y comportamientos de varias clases base.

14 Herencia por Extensión: Tipos Programación I Clase Clase Base Clase Padre Sub-Clase Clase Derivada Clase Hija Clase Clase Base Clase Padre Sub-Clase Clase Derivada Clase Hija Herencia Simple Herencia Múltiple

15 Ejercicio 13 Programación I 1.Iniciar la aplicación BlueJ y abrir el proyecto denominado La Red (es un prototipo de una red social como Facebook o Google+). 2.Examine el código. 3.Cree algunos objetos de tipo PublicacionMensaje y PublicacionFoto. 4.Cree un objeto de tipo Noticias. 5.Agregue las publicaciones (tanto mensajes como fotos) al objeto de tipo Noticias y muestre su contenido invocando al método mostrarNoticias.

16 Ejercicio 13 Programación I 6.Ahora cree un nuevo objeto de tipo PublicacionMensaje. Ingréselo a las Noticias. Cuando muestre las noticias, se dará cuenta que la publicación no tiene comentarios. 7.Agrega un comentario a la PublicacionMensaje y muestre nuevamente las noticias 8.Explica el comportamiento observado. Finalmente, el mantenimiento del código de la aplicación resultaría en un trabajo arduo que afectaría de manera directa tanto al cliente como a la empresa encargada del desarrollo del sistema. Por ejemplo, si el código duplicado presenta un error, deberá buscarse en todo el proyecto donde exista código duplicado y corregir el error, lo que a su vez podría inducir nuevos errores. Lo mismo pasaría si se intentase agregar una nueva característica a la aplicación. Por ejemplo, si el código duplicado presenta un error, deberá buscarse en todo el proyecto donde exista código duplicado y corregir el error, lo que a su vez podría inducir nuevos errores. Lo mismo pasaría si se intentase agregar una nueva característica a la aplicación. Esto conlleva a tener “código duplicado”, lo cual es un problema grave, no solo porque se debe escribir el mismo texto más de una vez, sino porque existen problemas asociados al mantenimiento del código duplicado. Cómo se puede observar en el ejercicio anterior, las clases PublicacionMensaje y PublicacionFoto son muy similares y en efecto, la mayor parte de su código fuente es el mismo con algunos pequeños cambios.

17 Herencia por Extensión Programación I La clase Noticias también tiene duplicación de código en el método mostrarNoticias, allí se observan dos ciclos uno para los mensajes y otro para las fotos, igualmente se tienen dos vectores para almacenar estos objetos. Además, se tiene un método para agregar mensajes y otro para fotos. “Fulanito ha sido etiquetado en una foto” “Bernabé y Muchilanga ahora son amigos” Imagine que ahora se desea almacenar la actividad de las publicaciones, la cuál informa sobre las actividades que han realizado nuestros contactos, algo como “Fulanito ha sido etiquetado en una foto” o “Bernabé y Muchilanga ahora son amigos”.

18 Herencia por Extensión Programación I Para ello sería necesario agregar una nueva clase “PublicacionActividad”, agregar un nuevo vector a la clase noticias y un tercer ciclo en el método mostrarNoticias. ¿Cuándo se aplica el mecanismo de herencia? Cuando hay suficientes similitudes. Es decir, Las clases tiene suficientes similitudes. Todos los atributos, métodos o la mayoría de ellos, aplican a ambas clases. Como se puede ver, a medida que se agregan nuevas características a la aplicación, va creciendo el código duplicado.

19 Herencia por Extensión Programación I Por medio de la herencia se puede solucionar el problema de duplicación de código. La idea es sencilla, en vez de tener una independencia total entre las clases (Para nuestro ejemplo PublicacionMensaje y PublicacionFoto), se define una nueva clase que agrupe las características comunes (En el ejemplo esta clase se llamará Publicación). Posteriormente se hace que las clases con características comunes hereden de esta nueva clase y que agreguen las características particulares de cada clase. En el ejemplo la clase PublicacionMensaje y PublicacionFoto heredarían de la clase Publicación

20 Herencia por Extensión Programación I Símbolo usado para representar la herencia PublicacionMensaje y PublicacionFoto son hijas de Publicacion Los objetos de las clases PublicacionMensaje y PublicacionFoto también son objetos de tipo Publicacion Publicacion es la clase Padre de PublicacionMensaje y PublicacionFoto Un Diagrama de clase que represente la herencia de dicho ejemplo es el siguiente:

21 Herencia Programación I Sintaxis en Java: Java utiliza la palabra reservada extends para crear una clase que hereda de otra. nombre_vector[indice].miembroAtributo nombre_vector[indice].miembroMetodo class NombreHija extends NombrePadre { //Declaración de atributos //Declaración de constructores //Declaración de métodos } La clase NombreHija hereda todas las características y funcionalidades de la clase NombrePadre

22 Programación I Ejemplo: class Empleado { protected String nombre; protected int sueldo; Empleado(String nombre, int sueldo) { this.nombre = nombre; this.sueldo = sueldo; } public void aumentarSueldo(int porcentaje) { sueldo += (int)(sueldo * porcentaje / 100); } public void mostrar() { System.out.println (“nombre: ” + nombre); System.out.println (“Sueldo: ” + sueldo); } } class Ejecutivo extends Empleado { public int presupuesto; void asignarPresupuesto(int p) { presupuesto = p; } } nombre sueldo Empleado(String,int) aumentarSueldo(int) mostrar() ObjEmpleado nombre sueldo presupuesto aumentarSueldo(int) mostrar() asignarPresupuesto(int) ObjEjecutivo Herencia por Extensión

23 Programación I Un Ejecutivo “ES UN” Empleado, pero lo contrario no es cierto. Por ejemplo, si escribimos: Se producirá un error de compilación, pués en la clase Empleado no existe ningún método llamado asignarPresupuesto. Empleado objEmp= new Empleado ("Esteban Comex Plota", 100) ; objEmp.asignarPresupuesto(5000); // error Herencia por Extensión

24 Programación I Herencia por Extensión Otro ejemplo de Diagrama de Clase donde existe herencia:

25 Programación I Herencia por Extensión Otro ejemplo de Diagrama de Clase donde existe herencia:

26 Programación I Herencia por Extensión Otro ejemplo de Diagrama de Clase donde existe herencia: Note que una clase hija puede ser a la vez Padre de otra clase Las clases en este diagrama forman lo que se conoce como jerarquía de herencia

27 Criterios de Accesibilidad Programación IModificador Misma class Mismo package SubclasesUniverso privateSi defaultSi protectedSi publicSi

28 SobreEscritura de Métodos Programación I Una subclase puede modificar las características heredadas de una clase padre. Una subclase puede crear un método con funcionalidad diferente al método de la clase padre pero con igual: - Nombre, - Tipo de dato de retorno, - Lista de argumentos. A este método se le dice que sobreescribe al método de la clase padre.

29 Ejemplo de SobreEscritura de Métodos Programación I public class Empleado { protected String nombre; protected int sueldo; public void mostrar() { System.out.println(“nombre: ” + nombre); System.out.println(“Sueldo: ” + sueldo); } public class Ejecutivo extends Empleado{ public int presupuesto; public void mostrar() { System.out.println(“nombre: ” + nombre); System.out.println(“Sueldo: ” + sueldo); System.out.println(“Presupuesto: ” + presupuesto); }

30 La Referencia “super” Programación I super es usado en una subclase, para referirse a su clase padre, tanto atributos como a los métodos. Las características invocadas no tienen que ser solo las de la superclase inmediata, pueden ser las de una superclase en la cadena de jerarquía. Frecuentemente, es usado en la sobreescritura de métodos, debido a que por lo general no se reemplaza toda la funcionalidad del método heredado sino que se le añaden características.

31 Ejemplo de “super” Programación I public class Empleado { protected String nombre; protected float sueldo; public void mostrar() { System.out.println(“nombre: ” + nombre); System.out.println(“Sueldo: ” + sueldo); } public class Ejecutivo extends Empleado{ public int presupuesto; public void mostrar() { //Se invoca al método del padre super.mostrar(); System.out.println(“Presupuesto: ” + presupuesto); }

32 Los Constructores no se heredan Programación I Una subclase hereda todos los atributos y métodos de la superclase (clase padre). Una subclase no hereda el constructor de la superclase. Hay dos formas de incluir el constructor: - Usar el constructor por defecto. (sin parámetros) - Escribir uno o mas constructores explícitos. El constructor de la clase padre es llamado en el constructor de la clase hija.

33 Invocar Constructores de la Clase Padre Programación I Para invocar al constructor del padre, se debe usar la llamada super en la primera línea del constructor de la clase hija. La especificación del constructor se específica en los argumentos que se usan en la llamada super. Si una clase hija, no incluye una llamada this o super, el compilador añade implícitamente una llamada super() que llama al constructor por defecto de la clase padre. Si la clase padre define constructores, pero no tiene un constructor por defecto, el compilador arrojará un mensaje de error.

34 Ejemplo de SobreEscritura de Métodos Programación I public class Empleado { protected String nombre; protected int sueldo; public Empleado(String n, int s) { nombre = n; sueldo = s; } public Empleado(String n) { nombre = n; } //Otras def. de métodos } Observemos la clase Padre Empleado y los constructores que ella posee:

35 Ejemplo de SobreEscritura de Métodos Programación I public class Ejecutivo extends Empleado { private int presupuesto; public Ejecutivo(String xnom, int xsueldo, int xpres) { super(xnom,xsueldo); presupuesto=xpres; } public Ejecutivo(String xnom, int xpres) { super(xnom); presupuesto=xpres; } public Ejecutivo(int xpres) { presupuesto=xpres; //Como no hay llamada a un constructor de la clase Padre, el compilador incorpora una llamada super(); lo que genera ERROR porque en la clase Padre no hay constructor por defecto. } //Otras def. de métodos }

36 Herencia Programación I package Relacion_clases; public class Punto { protected int x,y; public Punto() {} public Punto(int a, int b){ this.SetPunto(a,b); } public void SetPunto(int a, int b){ this.x=a; this.y=b; } public int getX(){ return this.x;} public int getY(){ return this.y;} } package Relacion_clases; public class Circulo extends Punto{ public double radio; public Circulo () { super(0,0); this.setRadio (0); } public Circulo (int a, int b, double r ) { super(a,b); this.setRadio (r); } public void setRadio(double r) { this.radio=(r>=0.0?r:0.0);} public double GetRadio(){ return this.radio;} public double area() { return 3.1416*this.radio*this.radio; } } package Relacion_clases; public class Implementacion { public static void main(String[] args) { Punto p=new Punto(3,5); Circulo c=new Circulo(6,3,2.3); System.out.println(p.getX()+ "," + p.getY()); System.out.println(c.getX()+ "," + c.getY()); } }

37 Ejercicio 14 Programación I 1.Abra el código del proyecto denominado “6.2 La Red”. Este ejemplo es el mismo que se vio anteriormente, pero ha sido reescrito para usar herencia. 2.Edite la clase PublicacionMensaje y elimine el texto “extends Publicacion”, cierre el editor ¿Qué cambios nota en el diagrama de clases?. Vuelve a agregar el texto eliminado. 3.Crea un objeto de tipo PublicacionMensaje. Llame alguno de sus métodos. ¿Puede llamar los métodos heredados de publicación? ¿Qué observa acerca de los métodos heredados?

38 Ejercicio 14 Programación I 4.Modifique la clase PublicacionMensaje y cree un método llamado “imprimirResumenCorto”que tendrá como tarea imprimir el mensaje “Mensaje Publicado Por USUARIO”, donde usuario debería ser reemplazado por el nombre del autor. 5.Compile la clase. ¿Qué ha pasado? ¿Por qué sucede esa situación? 6.Agregue un método getter para el atributo “usuario” y arregle el método “imprimirResumenCorto” para que no se produzcan errores de compilación. 7.Agregue el método “imprimirResumenCorto” en la clase PublicacionFoto y haga lo mismo.

39 SobreEscritura de Métodos Programación I Cuando experimentaron con el Proyecto “La red” tal vez notaron que la segunda versión del proyecto tiene un problema: Cuando se muestran las noticias no se muestra toda la información de las publicaciones, solo se muestra la información común. En cambio la primera versión si mostraba la información completa. La razón por la cual sucede eso, es simple. El método mostrar se implementó en la clase Publicación, la cual muestra solo los atributos comunes.

40 SobreEscritura de Métodos Programación I Para corregir el problema se debe reescribir el método en las clases hijas de publicación (PublicacionMensaje y PublicacionFoto) ya que es allí donde se tiene acceso a los atributos específicos de cada clase.

41 Ejercicio 15 Programación I 1.Abra el código del proyecto denominado “6.2 La Red”. 2.Corte el método “mostrar” de la clase Publicación y péguelo en las clases hijas (PublicacionFoto y PublicacionMensaje) sin hacer ningún otro cambio. 3.Compile el proyecto completo. 4.¿Qué ha pasado? Se obtiene un error en la clase PublicacionMensaje y PublicacionFoto ¿Por qué? ¿Cómo se corrige este error? Se obtiene un error en la clase Noticias ¿Por qué? ¿Cómo se corrige el error? 5.Deshaga los cambios realizados en el proyecto.

42 SobreEscritura de Métodos Programación I Si la clase Publicación no tiene un método mostrar(), éste no podrá ser llamado usando variables del tipo Publicacion, pero el vector en la Clase Noticias es de tipo Publicacion, esto es necesario para poder guardar todas las publicaciones en un solo vector. ¿Qué se debe hacer entonces? La clase Publicación debe tener tanto métodos como atributos comunes de todas las clases. Por tal motivo, este método debe existir en la clase Publicación.

43 SobreEscritura de Métodos Programación I La solución es dejar el método en la clase Publicación implementado de forma parcial y reescribirlo en la clases hijas para agregar el comportamiento faltante.

44 Ejercicio 16 Programación I 1.Reescriba el método mostrar en las clases hijas de Publicacion de la siguiente forma (por ahora solo hágalo en la clase PublicacionFoto): 2.Cree un objeto de tipo Noticias, y agregue objetos de tipo PublicacionFoto y PublicacionMensaje. 3.Muestre las noticias 4.¿Se están mostrando las noticias adecuadamente? public void mostrar() { System.out.println(" [" + archivo+ "]"); System.out.println(" " + titulo); } Clase PublicacionFoto

45 SobreEscritura de Métodos Programación I En el ejemplo las noticias tienen un vector de tipo Publicacion que almacena objeto de las clase PublicacionMensaje y PublicacionFoto Lo que sucede en el ejemplo anterior es que debido al “Polimorfismo” cuando un método es llamado usando una variable de la clase Padre para almacenar un objeto de la clase hija (En el ejemplo las noticias tienen un vector de tipo Publicacion que almacena objeto de las clase PublicacionMensaje y PublicacionFoto), se invocará la implementación del método en la clase hija, si la clase hija no implementa el método, entonces se llamará la implementación del padre. Lo que se quiere hacer ahora es combinar el método del padre con el método de los hijos, para que muestre tanto la información de la clase padre, como la de la clase hija. Para ello es necesario usar la referencia super.

46 La referencia “super” Programación I Recordemos que super es una palabra reservada de Java que se utiliza para referirse a la clase de la cual se está heredando, entre sus usos se encuentran: –Llamar a los constructores de la clase base desde la clase derivada, para que los atributos heredados sean inicializados adecuadamente. –Hacer referencia a los atributos y métodos de la super clase (muy útil cuando se redefinen los métodos).

47 Ejercicio 17 Programación I 1.Cambie el código del método “mostrar” en las clases hijas de Publicacion de la siguiente forma: 2.Cree un objeto de tipo Noticias, y agregue objetos de tipo PublicacionFoto y PublicacionMensaje. Muestre las noticias. 3.Note que ahora se muestra tanto la información del padre como la del hijo. public void mostrar() { System.out.println(mensaje); super.mostrar(); } Clase PublicacionMensaje public void mostrar() { System.out.println(" [" + archivo+ "]"); System.out.println(" " + titulo); super.mostrar(); } Clase PublicacionFoto

48 Ejercicio 18 Programación I Se agregará un nuevo tipo de publicación denominada PublicacionEvento Como PublicacionEvento es hija de Publicación heredará todos sus atributos y métodos Los atributos que hereda PublicacionEvento son: usuario, fechaHora, meGustan y comentarios Los atributos que hereda PublicacionEvento son: usuario, fechaHora, meGustan y comentarios Se necesita que los objetos de PublicacionEvento registren el tipo de evento Este diagrama de clases permite reusar el código existente La posibilidad de reusar código existente es uno de los mayores beneficios de la herencia Ahora supongamos que cambiamos los requerimientos La clase PublicacionEvento no puede tener comentarios ni contador de meGustan Pero como la clase hereda de Publicacion, es inevitable que se transmitan esos atributos Ignorar los atributos no es correcto y además, puede crear confusiones en otros programadores La solución modificar el diagrama de clases introduciendo una SuperClase para todas las publicaciones que tienen comentario, la llamaremos PublicacionComentada Este tipo de situaciones es muy común cuando se diseñan diagramas de clases

49 Ejercicio 16 Programación I 1.Abre el proyecto La red versión 2 en BlueJ. 2.Agrega la clase PublicacionNotificacion la cual guarda como atributo el mensaje de la notificación por ejemplo: “Barack y Fidel ahora son amigos”. 3.Cree un constructor paramétrico, los métodos getter y setter y reescriba el método mostrar. 4.Cree algunos objetos de la clase y llame a sus métodos. 5.Verifique que todo funcione como se espera.

50 Ejercicio 16 Programación I 6.Agregue una clase principal y un método que interactúe con el usuario, permitiendo crear publicaciones de tipo Mensaje o Foto y agregarlas al objeto de tipo noticias. Cuando se cree una Publicación de tipo Foto deberá agregar a las noticias un Objeto PublicaciónEvento con el Mensaje “USUARIO ha agregado una nueva foto”, donde usuario es el nombre del usuario que publicó la foto.

51 :: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Finalización


Descargar ppt ":: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación."

Presentaciones similares


Anuncios Google