Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: adrit en 04 de Agosto 2015, 14:35
-
Hola! Dejo mi código para el ejercicio CU00695B.
EJERCICIO
Declara una clase abstracta Legislador que herede de la clase Persona, con un atributo provinciaQueRepresenta (tipo String) y otros atributos. Declara un método abstracto getCamaraEnQueTrabaja. Crea dos clases concretas que hereden de Legislador: la clase Diputado y la clase Senador que sobreescriban los métodos abstractos necesarios. Crea una lista de legisladores y muestra por pantalla la cámara en que trabajan haciendo uso del polimorfismo.
public class Persona {
private String nombre; private String apellidos; private int edad;
public Persona() { nombre = ""; apellidos = ""; edad = 0; }
public Persona (String nombre, String apellidos, int edad) { this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; }
public String getNombre() { return nombre; }
public String getApellidos() { return apellidos; }
public int getEdad() { return edad; }
public String toString() { Integer datoEdad = edad;
return "-Nombre: ".concat(nombre).concat(" -Apellidos: ").concat(apellidos).concat(" -Edad: ").concat(datoEdad.toString() ); }
}
public abstract class Legislador extends Persona {
private String provinciaQueRepresenta;
public Legislador (String nombre, String apellidos, int edad, String provinciaQueRepresenta){
super(nombre, apellidos, edad);
this.provinciaQueRepresenta=provinciaQueRepresenta;
}
public String getProvinciaQueRepresenta() {return provinciaQueRepresenta;}
public String toString () {
return super.toString().concat("\nProvincia que representa: ").concat(provinciaQueRepresenta);
}
abstract public String getCamaraEnQueTrabaja();
}
public class Diputado extends Legislador{
private String camaraEnQueTrabaja;
public Diputado(String nombre, String apellidos, int edad, String provinciaQueRepresenta,
String camaraEnQueTrabaja){
super(nombre, apellidos, edad, provinciaQueRepresenta);
this.camaraEnQueTrabaja=camaraEnQueTrabaja;
}
public String getCamaraEnQueTrabaja() {
return camaraEnQueTrabaja;
}
public String toString() {
return super.toString().concat("\nCamara en que trabaja: ").concat(camaraEnQueTrabaja);
}
}
public class Senador extends Legislador{
private String camaraEnQueTrabaja;
public Senador (String nombre, String apellidos, int edad, String provinciaQueRepresenta,
String camaraEnQueTrabaja){
super(nombre, apellidos, edad, provinciaQueRepresenta);
this.camaraEnQueTrabaja=camaraEnQueTrabaja;
}
public String getCamaraEnQueTrabaja() {
return camaraEnQueTrabaja;
}
public String toString() {
return super.toString().concat("\nCamara en que trabaja: ").concat(camaraEnQueTrabaja);
}
}
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class Listador {
private List<Persona> lista;
private Iterator<Persona> iterador;
public Listador() {
lista = new ArrayList<Persona>();
}
public void add (Persona persona) {
lista.add(persona);
}
public void mostrarLista() {
iterador = lista.iterator();
String tmp = "";
Persona tmpPersona;
while(iterador.hasNext()){
tmpPersona=iterador.next();
if(tmpPersona instanceof Diputado){
tmp = "Diputado";
}else tmp = "Senador";
System.out.println("Listando datos del "+tmp+" :\n"+tmpPersona.toString());
}
}
}
public class Test {
public static void main (String[] args) {
Listador lista = new Listador();
lista.add(new Diputado ("Jose", "Gomez" , 40, "Rio Negro", "Camara alta"));
lista.add(new Diputado ("Alberto", "Perez", 39, "Neuquen", "Camara baja"));
lista.add(new Diputado ("Enrique", "Lopez", 45, "Salta", "Camara alta"));
lista.add(new Senador ("Alberto", "Esteves", 51, "Mendoza", "Camara alta"));
lista.add(new Senador ("Roberto", "Gomez", 55, "Jujuy", "Camara baja"));
lista.add(new Senador ("Ricardo", "Bargas", 52, "Santa Fe", "Camara baja"));
lista.mostrarLista();
}
}
Gracias!!
-
Hola Adrián:
Estuve revisando tu ejercicio y lo veo muy bien. Solamente haría una observación que sería respecto a las clases Diputado y Senador.
Tal como están codificadas estas clases, daría la impresión de que el atributo 'camaraEnQueTrabaja' debiera haber sido declarado en la clase abstracta y así heredado por ambas clases para optimizar el diseño de las clases.
Otro detalle: si analizamos las clase Senador y Diputado son exactamente iguales, duplicidad de código, y esto no sería óptimo.
Mi sugerencia sería la siguiente:
Como al momento de instanciar un objeto tipo Diputado ya estoy conociendo de antemano que trabaja en la 'Cámara Baja', entonces no sería necesario que sea un atributo que pudiera contener otro valor. Lo mismo sucedería con los objetos tipo Senador.
Por lo tanto eliminaría el atributo 'camaraEnQueTrabaja' de ambas clases.
De esta manera, la clase Diputado podría codificarse:
public class Diputado extends Legislador{
public Diputado(String nombre, String apellidos, int edad, String provinciaQueRepresenta)
{
super(nombre, apellidos, edad, provinciaQueRepresenta);
}
public String getCamaraEnQueTrabaja() {
return "Cámara Baja";
}
public String toString() {
return super.toString().concat("\nCamara en que trabaja: Cámara Baja");
}
}
Y muy parecida sería la clase Senador (la única diferencia sería que habría que cambiar "Camara Baja" por "Cámara Alta").
Luego habría que eliminar el parámetro que ya no existe al momento de instanciar los objetos en la clase Test.
Analízalo y cualquier incoveniente seguimos discutiéndolo. Saludos!
-
Perfecto!!
Muchas gracias por la devolucion.