Download programación en java - ISA-UMH
Document related concepts
no text concepts found
Transcript
Escuela Politécnica Superior de Elche Ingeniería Industrial SISTEMAS INFORMÁTICOS INDUSTRIALES curso 2007-2008 PROGRAMACIÓN EN JAVA PRÁCTICA 2: Jerarquía de clases en Java Objetivos • • • Implementar una jerarquía de clases para crear una aplicación en Java Comprender los mecanismos de herencia en Java Comprobar la utilidad del polimorfismo Descripción Se va a diseñar un programa que permita almacenar datos relativos a libros y revistas de una biblioteca y, a continuación, proporcionar un listado de los mismos. Tanto los libros como las revistas comparten dos características comunes: el código de referencia y el título. Los libros, además, poseen dos características adicionales: el autor y la editorial. Por otra parte, las revistas también tienen dos características más: el número de la revista y el año de publicación. Por último, hay que tener en cuenta que existen libros que están compuestos por varios volúmenes, por lo que en este caso será necesario saber también el número de volumen. A continuación se muestra un ejemplo de fichas de una biblioteca conteniendo datos de libros y revistas: Referencia Título Autor Editorial Libro I.062 Java 2 Ceballos rama Referencia Título Autor Editorial Nº Volumen Referencia Título Número Año Revista R.001 Linux 23 1999 Libro en volúmenes F.135 Física aplicada R.J.M. Servicio Publicaciones 2 Página 1 de 6 Escuela Politécnica Superior de Elche Ingeniería Industrial Diseño Una manera de diseñar el programa sería escribir una clase para cada tipo de objeto de la biblioteca, definiendo para cada clase los datos asociados a cada ficha, así como los métodos necesarios para manejar esos datos. Es decir, se definirían las tres clases siguientes: - FichaLibro: En esta clase se definirían como datos miembro la referencia, el título, el autor y la editorial del libro; así como los métodos necesarios para manipular estos datos. - FichaRevista: En esta clase se definirían como datos miembro la referencia, el título, el número y el año de publicación de la revista; así como los métodos necesarios para manipular estos datos. - FichaLibroVol: En esta clase se definirían como datos miembro la referencia, el título, el autor, la editorial y el número de volumen del libro; así como los métodos necesarios para manipular estos datos. Como puede apreciarse, si se definieran las clases de la forma especificada, se estaría derrochando tiempo y esfuerzo, ya que se duplica código. Se sabe que una clase derivada hereda los datos y métodos de su clase base, por lo tanto, lo más adecuado para diseñar el programa sería definir una clase base con los datos comunes de los distintos objetos y los métodos para manipular dichos datos. A partir de la clase base se definirían clases derivadas de esta clase, con los datos específicos de cada objeto y los métodos para manipular esos datos. Por lo tanto se definirán las siguientes clases: - - Ficha. Es la clase base. Contiene los datos comunes de los distintos objetos: la referencia y el título; así como los métodos para manipular estos datos. FichaLibro. Clase derivada de la clase Ficha. Incluirá los datos específicos de un libro: el autor y la editorial, así como los métodos necesarios para manipular estos datos. Nótese que puesto la clase FichaLibro es una clase derivada de Ficha, cualquier objeto de la clase FichaLibro heredará los datos y métodos de la clase Ficha. FichaLibroVol. Clase derivada de la clase FichaLibro. Aportará el número de volumen y la funcionalidad necesaria para manipularlo. FichaRevista. Clase derivada de la clase Ficha. Contendrá los datos específicos de una revista: el número y el año; y los métodos necesarios para manipular estos datos. Como puede apreciarse, la clase FichaLibro es una clase derivada de Ficha, pero a su vez es una clase base para la clase FichaLibroVol. La jerarquía de las clases definidas es la siguiente: Página 2 de 6 Escuela Politécnica Superior de Elche Ingeniería Industrial Ficha FichaRevista FichaLibro FichaLibroVol Además de las clases anteriores, se definirá una clase más: Biblioteca. Esta clase contendrá un array de objetos de tipo Ficha (Ficha []volumenes), así como los métodos necesarios para manipular dicho array. En el array se almacenará una referencia a los datos de cada libro o revista. Ejemplo: volumenes[0] volumenes[1] volumenes[2] Libro Referencia Título Autor Editorial I.062 Java 2 Ceballos rama ... Revista Referencia Título Número Año R.001 Linux 23 1999 Referencia Título Autor Editorial Nº Volumen Libro en volúmenes F.135 Física aplicada R.J.M. S. Publicaciones 2 Detalles de implementación Clase Ficha → clase abstract (fichero Ficha.java) Datos miembro: - protected String referencia: Cadena para almacenar la referencia asociada - protected String titulo: Cadena para guardar el título asociado a la ficha a la ficha. Métodos: - public Ficha(): Constructor por defecto. Inicializará las variables miembro. public Ficha(String ref, String tit): Constructor con argumentos. Se encargará de asignar la referencia y el título pasados como argumentos a las variables miembro referencia y titulo respectivamente. Página 3 de 6 Escuela Politécnica Superior de Elche Ingeniería Industrial - public void asignarReferencia(String ref): Asignará la referencia - public void asignarTitulo(String tit): Asignará el título pasado como pasada como argumento a la variable miembro referencia. argumento a la variable miembro titulo. - public abstract void mostrarFicha(): Esta método mostrará los datos asociados a una ficha. Como se puede observar, se ha definido abstract, ya que sólo tiene sentido invocarla desde objetos de clases derivadas. Este método no se definirá en la clase base, sino que se definirá en las clases derivadas. Clase FichaLibro → clase derivada de Ficha (fichero FichaLibro.java) Datos miembro: - private String autor: Cadena para almacenar el autor asociado al libro. private String editorial: Cadena para guardar la editorial asociada al libro. Métodos miembro: - public FichaLibro(): Constructor por defecto. Inicializará las variables miembro autor y editorial. - - public FichaLibro(String ref, String tit, String aut, String edit): Constructor con argumentos. Se encargará de asignar la referencia y el título pasados como argumentos a las variables miembro referencia y titulo utilizando el constructor con argumentos de la clase Ficha. Además, asignará el autor y la editorial pasados como argumentos a las variables miembro autor y editorial. public void asignarAutor(String aut): Asignará el autor pasado como parámetro a la variable miembro autor. public void asignarEditorial(String edit): Asignará la editorial pasada como parámetro a la variable miembro editorial. public void mostrarFicha(): Este método mostrará los datos asociados a la ficha del libro. Clase FichaLibroVol → clase derivada de FichaLibro (fichero FichaLibroVol.java) Datos miembro: - private int numVolumen: Almacenará el número de volumen del libro. Métodos miembro: - public FichaLibroVol(): Constructor por defecto. public FichaLibroVol(String ref, String tit,String aut, String edit, int nv): Constructor con argumentos. Se encargará de asignar la referencia, el título, el autor y la editorial pasados como argumentos a las Página 4 de 6 Escuela Politécnica Superior de Elche Ingeniería Industrial - variables miembro referencia, titulo, autor y editorial utilizando el constructor con argumentos de la clase FichaLibro. Además, asignará el número de volumen pasado como argumento a la variable miembro numVolumen. public void asignarNumVolumen(int nv): Asignará el número de volumen pasado como parámetro a la variable miembro numVolumen. public void mostrarFicha(): Este método mostrará los datos asociados a la ficha de un libro con varios volúmenes. Usará el método mostrarFicha() de la clase FichaLibro. Clase FichaRevista → clase derivada de Ficha (fichero FichaRevista.java) Datos miembro: - private int numRevista: Almacenará el número de la revista. private int anyo: Guardará el año de publicación de la revista. Métodos miembro: - public FichaRevista(): Constructor por defecto. public FichaRevista(String ref, String tit, int nr, int an): - Constructor con argumentos. Se encargará de asignar la referencia y el título pasados como argumentos a las variables miembro referencia y titulo utilizando el constructor con argumentos de la clase Ficha. Además, asignará el número de revista y el año de publicación pasados como argumentos a las variables miembro numRevista y anyo. public void asignarNumRevista(int nr): Asignará el número de revista pasado como parámetro a la variable miembro numRevista. public void asignarAnyo(int an): Asignará el año de publicación pasado como parámetro a la variable miembro anyo. public void mostrarFicha(): Este método mostrará los datos asociados a la ficha de la revista. - Clase Biblioteca (fichero Biblioteca.java) Datos miembro: - private int numMaxVols: Guardará el número máximo de volúmenes que se pueden almacenar. - private int numVols: Guardará el número actual de volúmenes almacenados. private Ficha []volumenes: Array de objetos de tipo Ficha para almacenar las referencias a los libros y a las revistas. Página 5 de 6 Escuela Politécnica Superior de Elche Ingeniería Industrial Métodos miembro: - public Biblioteca(int vm): Constructor. Asignará a numMaxVols el número máximo de volúmenes pasado como parámetro e inicializará la variable miembro numVols. Además reservará la memoria necesaria del array de objetos volumenes. public void asignarVolumen(Ficha fich): Asignará la ficha pasada como parámetro a una posición libre del array volumenes. public void mostrarVolumenes(): Este método mostrará los datos asociados a todos los volúmenes. Utilizará el método mostrarFicha() de la clase Ficha. - Clase Practica2 (fichero Practica2.java) Esta clase contendrá el main() y debe permitir comprobar el funcionamiento de las clases implementadas. Por ejemplo, una posible implementación de esta clase sería la siguiente: // fichero Practica2.java public class Practica2 { public static void main(String[] args) { Biblioteca biblio = new Biblioteca(3); FichaLibro fl = new FichaLibro("I.062","Java 2","Ceballos","rama"); FichaLibroVol flv = new FichaLibroVol("F.135","Fisica aplicada","R.J.M.","S. publicaciones",2); FichaRevista fr = new FichaRevista("R.001","Linux",23,1999); biblio.asignarVolumen(fl); biblio.asignarVolumen(flv); biblio.asignarVolumen(fr); biblio.mostrarVolumenes(); } } Página 6 de 6