Foros aprenderaprogramar.com
		Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Enzo en 09 de Diciembre 2015, 19:13
		
			
			- 
				Hola,
 
 Aquí dejo mi ejercicio del Tema "CU00695B clases abstractas java métodos abstract class api ejemplo ejercicio" para su corrección:
 
 Superclase Persona:
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Superclase de la que "beberan" otras clases.<br>
 * Clase 1 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public class Persona_CU00695B {
 
 // Inicialización de Atributos
 private String nombre;
 private String apellidos;
 private int edad;
 
 /**
 * Constructor 1 del Producto - Atribututos sin asignación de Valores
 * @param nombre El parámetro nombre define el Nombre de la Persona
 * @param apellidos El parámetro apellidos define los Apellidos de la Persona
 * @param edad El parámetro edad define la edad de la Persona
 */
 public Persona_CU00695B() {
 nombre = "";
 apellidos = "";
 edad = 0;
 } // Cierre del constructor 1
 
 /**
 * Constructor 2 del Producto - Atribututos con asignación de Valores
 * @param nombre El parámetro nombre define el Nombre de la Persona
 * @param apellidos El parámetro apellidos define los Apellidos de la Persona
 * @param edad El parámetro edad define la edad de la Persona
 */
 public Persona_CU00695B (String nombre, String apellidos, int edad) {
 this.nombre = nombre;
 this.apellidos = apellidos;
 this.edad = edad;
 } // Cierre del constructor 2
 
 /**
 * Método para para obtener la Nombre de la Persona
 * @return El Nombre de la Persona
 */
 public String getNombre() {return nombre;}
 
 /**
 * Método para para obtener los Apellidos de la Persona
 * @return Los Apellidos de la Persona
 */
 public String getApellidos() {return apellidos;}
 
 /**
 * Método para para obtener la Edad de la Persona
 * @return La Edad de la Persona
 */
 public int getEdad() {return edad;}
 
 /**
 * Método para para obtener los datos de la Persona
 * @return Los datos de la Persona
 */
 public String toString() {
 /* Se transforma edad en un Integer para poder aplicarle el método toString().
 * De otra manera no se puede hacer por ser edad un tipo primitivo.*/
 Integer datoEdad = edad;
 // Se devuelve uns String con los datos de la Persona
 return "- ".concat(nombre).concat(" ").concat(apellidos)
 .concat(" de ").concat(datoEdad.toString().concat(" años,") );
 } // Cierre del método para para obtener los datos de la Persona
 
 } //Cierre de la clase
 Subclase Abstracta Legislador:
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase Abstracta que "bebe" de la Superclase Persona_CU00695B.<br>
 * Clase 2 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public abstract class Legislador_CU00695B extends Persona_CU00695B {
 
 // Campos específicos de la subclase.
 private String provinciaQueRepresenta,
 idLegislador;
 int antiguedad;
 
 /**
 * Constructor 1 del Profesor - Atribututos sin asignación de Valores
 * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define la Provincia a la que representa el Legislador
 * @param idLegislador El parámetro idLegislador define el Cod. Identificativo del Legislador
 * @param antiguedad El parámetro antiguedad define los años de antiguedad del Legislador
 */
 public Legislador_CU00695B () {
 super();
 provinciaQueRepresenta = "";
 idLegislador = "";
 antiguedad = 0;
 } // Cierre del constructor 1
 
 /**
 * Constructor 2 del Profesor - Atribututos con asignación de Valores
 * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define la Provincia a la que representa el Legislador
 * @param idLegislador El parámetro idLegislador define el Cod. Identificativo del Legislador
 * @param antiguedad El parámetro antiguedad define los años de antiguedad del Legislador
 */
 public Legislador_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
 super(nombre, apellidos, edad);
 this.provinciaQueRepresenta = provinciaQueRepresenta;
 this.idLegislador = idLegislador;
 this.antiguedad = antiguedad;
 } // Cierre del constructor 2
 
 // METODOS ESPECIFICOS DE LA SUBLASE
 /** Método para establecer la Provincia Que Representa el Legislador
 * @param provinciaQueRepresenta El parámetro provinciaQueRepresenta define el valor que contendrá la Provincia Que Representa el Legislador
 */
 public void setProvinciaQueRepresenta (String provinciaQueRepresenta) {this.provinciaQueRepresenta = provinciaQueRepresenta;}
 
 /** Método para establecer el id del Legislador
 * @param idLegislador El parámetro idLegislador define el valor que contendrá el Cod. Identificativo del Legislador
 */
 public void setIdLegislador (String idLegislador) {this.idLegislador = idLegislador;}
 
 /** Método para establecer la Antiguedad del Legislador
 * @param antiguedad El parámetro antiguedad define el valor que contendrá la Antiguedad del Legislador
 */
 public void setAntiguedad (int antiguedad) {this.antiguedad = antiguedad;}
 
 /** Método para obtener la Provincia Que Representa el Legislador
 * @return La provincia a la que representa el Legislador
 */
 public String getProvinciaQueRepresenta() {return provinciaQueRepresenta;}
 
 /** Método para obtener el id del Legislador
 * @return El Código Identificativo del Legislador
 */
 public String getIdLegislador() {return idLegislador;}
 
 /** Método para obtener la Antiguedad del Legislador
 * @return La antiguedad del Legislador
 */
 public int getAntiguedad() {return antiguedad;}
 
 /**
 * Método Abstracto para la camara en la que trabaja el Legislador
 */
 // Método abstracto (definido como abstract y sin cuerpo)
 abstract public String getCamaraEnQueTrabaja();
 
 /**
 * Método para para obtener los datos del Legislador
 * @return Los datos del Legislador
 */
 public String toString () {
 /* Se transforma antiguedad en un Integer para poder aplicarle el método toString().
 * De otra manera no se puede hacer por ser antiguedad un tipo primitivo.*/
 Integer datoAntiguedad = antiguedad;
 // Se devuelve uns String con los datos de Persona + los de Legislador
 return super.toString().concat(" con Cod. identificativo ").concat(idLegislador)
 .concat(" y con ").concat(datoAntiguedad.toString().concat(" años representando a la Provincia de ").concat(provinciaQueRepresenta));
 }// Cierre del método para obtener los datos del Profesor
 
 } //Cierre de la clase
 Subclase Diputado:
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Legislador_CU00695B.<br>
 * Clase 3 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public class Diputado_CU00695B extends Legislador_CU00695B {
 
 // No hay campos específicos de la subclase.
 
 /**
 * Constructor 1 del Diputado - Atribututos sin asignación de Valores
 */
 public Diputado_CU00695B () {
 super();
 } // Cierre del constructor 1
 
 /**
 * Constructor 2 del Diputado - Atribututos con asignación de Valores
 */
 public Diputado_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
 super(nombre, apellidos, edad, provinciaQueRepresenta, idLegislador, antiguedad);
 } // Cierre del constructor 2
 
 /**
 * Método Abstracto que redefine (obligatoriamente han de hacerlo) el método abstracto getCamaraEnQueTrabaja() de la superclase.
 * @return En que Cámara trabaja el Diputado
 */
 public String getCamaraEnQueTrabaja() { return " en la Cámara del Congreso.";} //Método abstracto sobreescrito en esta clase
 
 /**
 * Método para para obtener los datos del Diputado
 * @return Los datos del Diputado
 */
 public String toString () { // Sobreescritura del método
 return super.toString().concat (getCamaraEnQueTrabaja());}
 
 } //Cierre de la clase
 Subclase Senador:
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de la Superclase Legislador_CU00695B.<br>
 * Clase 4 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public class Senador_CU00695B extends Legislador_CU00695B {
 
 // No hay campos específicos de la subclase.
 
 /**
 * Constructor 1 del Senador - Atribututos sin asignación de Valores
 */
 public Senador_CU00695B () {
 super();
 } // Cierre del constructor 1
 
 /**
 * Constructor 2 del Senador - Atribututos con asignación de Valores
 */
 public Senador_CU00695B (String nombre, String apellidos, int edad, String provinciaQueRepresenta,String idLegislador, int antiguedad) {
 super(nombre, apellidos, edad, provinciaQueRepresenta, idLegislador, antiguedad);
 } // Cierre del constructor 2
 
 /**
 * Método Abstracto que redefine (obligatoriamente han de hacerlo) el método abstracto getCamaraEnQueTrabaja() de la superclase.
 * @return En que Cámara trabaja el Senador
 */
 public String getCamaraEnQueTrabaja() { return " en la Cámara del Senado.";} //Método abstracto sobreescrito
 
 /**
 * Método para para obtener los datos del Senador
 * @return Los datos del Senador
 */
 public String toString () { // Sobreescritura del método
 return super.toString().concat (getCamaraEnQueTrabaja());}
 
 } //Cierre de la clase
 Clase Lista Legisladores:
 import java.util.ArrayList;
 import java.util.Iterator;
 
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una Subclase que "bebe" de las Superclases intermedias de tipos de Legisladores.<br>
 * Clase 5 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public class ListaLegisladores_CU00695B {
 
 // Inicialización de la Colección
 private ArrayList <Legislador_CU00695B> listaLegisladores; //Campo de la clase
 
 /**
 * Constructor de la Colección Lista de Legisladores.
 * @param listaLegisladores El parámetro listaLegisladores define la colección de la Lista de Legisladores
 */
 public ListaLegisladores_CU00695B () {
 // Creación de la Colección
 listaLegisladores = new ArrayList <Legislador_CU00695B> ();
 } // Cierre del Constructor
 
 /**
 * Método para añadir un legislador a la Colección
 * @param legisladorNuevo El parámetro legisladorNuevo define el Legislador que se añade a la Colección
 */
 public void addLegislador (Legislador_CU00695B legisladorNuevo) {
 listaLegisladores.add(legisladorNuevo);
 } // Cierre del método para añadir un legislador a la Colección
 
 /**
 * Método para mostrar por pantalla la Información usando un For Extendido
 */
 public void imprimirListado() {
 
 // Se limpia la pantalla de la Consola
 System.out.println("\f");
 
 // Se Muestra en pantalla un mensaje de Inicio
 System.out.println ("En la actualidad, tenemos los siguientes Legisladores:");
 
 // Se recorre la lista mostrando los datos
 for (Legislador_CU00695B tmp: listaLegisladores) {
 // Se realiza una llamada al método "toString" del objeto en curso
 System.out.println (tmp.toString());
 }
 
 } //Cierre método imprimirListin
 
 } //Cierre de la clase
 Clase Test:
 /**
 * EJERCICIO DE HERENCIAS + CLASES Y MÉTODOS ABSTRACTOS.<br>
 * Esta Clase define una clase test para probar Herencias y Clase & Métodos Abstractos.<br>
 * Clase 6 del Ejercicio del Tema "CU00695B clases abstractas java metodos abstract class api ejemplo ejercicio".
 * @author Lorenzo Fernández Asensio
 * @version 20151209.01
 */
 public class TestAbstractLegis_CU00695B {
 
 public static void main (String [ ] Args) {
 
 
 // Creación de varios Diputados
 Diputado_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);
 Diputado_CU00695B Diputado2 = new Diputado_CU00695B ("Celia", "Jimenez Ladrillo", 63, "Sevilla", "SEV-7841", 14);
 Diputado_CU00695B Diputado3 = new Diputado_CU00695B ("Felix", "Garcia Trujillo", 58, "Badajoz", "BAD-459", 3);
 
 // Creación de varios Senadores
 Senador_CU00695B senador1 = new Senador_CU00695B ("Maria de la O", "Abellan Ruiz", 46, "Salamanca", "BSAL-4978", 1);
 Senador_CU00695B senador2 = new Senador_CU00695B ("Ramón", "Guitarra Espada", 69, "Murcia", "MUR-1599", 8);
 Senador_CU00695B senador3 = new Senador_CU00695B ("Margarita", "Sanchez Raspa", 51, "Huelva", "HUE-1994", 5);
 
 // Creación de un objeto Lista de Legisladores
 ListaLegisladores_CU00695B listaLegisladores = new ListaLegisladores_CU00695B ();
 
 // Se Añaden a la lista los Diputados
 listaLegisladores.addLegislador(Diputado1);
 listaLegisladores.addLegislador(Diputado2);
 listaLegisladores.addLegislador(Diputado3);
 
 // Se Añaden al listin los Senadores
 listaLegisladores.addLegislador(senador1);
 listaLegisladores.addLegislador(senador2);
 listaLegisladores.addLegislador(senador3);
 
 // Se realiza llamada al método "imprimirListado" de la clase "listaLegisladores" para imprimirlo
 listaLegisladores.imprimirListado();
 
 } // Cierre del main
 
 } // Cierre de la clase
 Como siempre, espero vuestros comentarios.
 
 Muchas Gracias,
 
 Un Saludo,
- 
				Hola Enzo
 
 Bien comentado, buen uso de la sobreescritura de toString con invocaciones a superclase, bien los constructores en las subclases, bien el uso del método declarado abstracto...
 
 Realmente no hacía falta crear una clase ListaLegisladores para resolver el ejercicio (podía hacerse creándola simplemente dentro del método con el main como se hace en https://www.aprenderaprogramar.com/foros/index.php?topic=2961.0
 
 Para hacer uso del polimorfismo se recomienda declarar siempre los tipos estáticos de la superclase, clase abstracta o interface ("lo más amplio") y el tipo dinámico de la clase concreta. Por ejemplo:
 
 Legislador_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);
 
 Donde el tipo estático es Legislador y el tipo dinámico Diputado. El objeto tiene así los dos tipos y por eso decimos que existe polimorfismo (varias formas del mismo objeto). Prueba a cambiar los tipos estáticos, verás que te funciona igualmente.
 
 Saludos
- 
				Hola Alex,
 
 OK. Tienes razón con lo que me comentas:
 Para hacer uso del polimorfismo se recomienda declarar siempre los tipos estáticos de la superclase, clase abstracta o interface ("lo más amplio") y el tipo dinámico de la clase concreta. Por ejemplo: 
 
 Legislador_CU00695B Diputado1 = new Diputado_CU00695B ("Adrian", "De las Heras Cortes", 57, "Barcelona", "BAR-35752", 7);
 
 Y no eres el primero en decírmelo.
 Lo que ocurre es que por defecto tiendo siempre, al escribir el código, a hacerlo usando la subclase (con la idea de cambiarlo cuando tenga terminado y probado todo) y al final se me olvida cambiarlo.
 
 Muchas gracias,
 
 Un Saludo,