Autor Tema: Ejemplo clases y métodos abstractos en Java. Ejercicio CU00695B del curso  (Leído 7935 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Buenos dias!!

Vengo a resolver el ejercicio 95° del curso, con el siguiente enunciado:

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.

(Primera vez que hago esto  :P) Los códigos de clases se los dejo adjuntados en este post! (pulsar en el icono de descarga estando logeados en el foro)

Les dejo estas cosas como prueba de que funciona:

Código: [Seleccionar]
package Asamblea;

public class Main {
    public static void main(String[]args){
        Legislador legislador1 = new Senador("Daniel","Phillips","8-342-1234",24,"Panamá","Senado",true,19);
        Legislador legislador2 = new Senador("Eric","Valdes","3-431-1434",25,"Colón","Senado",true,17);
        Legislador legislador3 = new Senador("Kristian","Espinoza","3-345-2343",32,"Herrera","Senado",false,20);
        Legislador legislador4 = new Diputado("Yarviz","Suarez","3-347-2345",28,"Chiriqui","Diputado",false, 15);
        Legislador legislador5 = new Diputado("Carlos","Vega","3-23-3454",40,"Bocas del Toro","Diputado",true,18);
        Legislador legislador6 = new Diputado("Marvin","Ceballos","3-456-3456",31,"Los Santos","Diputado",false,16);
        Listado legisladores = new Listado();
        legisladores.añadir(legislador1);
        legisladores.añadir(legislador2);
        legisladores.añadir(legislador3);
        legisladores.añadir(legislador4);
        legisladores.añadir(legislador5);
        legisladores.añadir(legislador6);
        legisladores.imprimirLista();
    }
}



Espero sus comentarios! :)
« Última modificación: 28 de Abril 2015, 09:01 por Mario R. Rancel »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio (CU00695B), Clases y métodos abstractos en Java.
« Respuesta #1 en: 28 de Abril 2015, 08:51 »
Hola Dan, he revisado tu código (por cierto para dejar código como archivos adjuntos mejor dejar los archivos .java que archivos txt, ya que con los java se puede trabajar con el compilador directamente y con los txt no) y demuestras un buen nivel.

Comentarios

De la clase Persona nada que comentar, únicamente tener en cuenta que los atributos

    protected String nombre, apellido, cedula;
    protected int edad;

podemos declararlos como protected para dar acceso directo desde las subclases, o como private y acceder a ellos a través de los métodos get que serán públicos.

De la clase Legislador recomendarte que añosDeResidencia lo sustituyas por anyosDeResidencia ó annosResidencia, el uso de eñes o tildes en el código puede generar problemas (aunque en principio es permitido por java puede haber problemas cuando el código se traslada a otro pc). Esto no aplica cuando se trata de texto a mostrar al usuario, sólo a lo que son partes del programa java.

También recomendarte que vayas sustituyendo métodos como public String getLegisladorInfo() por public String toString() para trabajar según los convenios aceptados de que una representación en forma de texto se haga a través del método toString(). En ocasiones puedes tener representaciones de texto y no llamarlas toString(), pero es bueno ir acostumbrándose a esto.

En la clase Listado tienes ArrayList<Legislador> lista; ¡Buen uso del polimorfismo, así admites tanto senadores como diputados en la lista!. En esta clase lo único que falla es el nombre: creo que ya lo habrás leido en muchos hilos, los nombres tienen que describir lo que representa la clase y Listado es un nombre muy pobre, no se sabe de qué es el listado.

En el main con estas declaraciones Legislador legislador1 = new Senador("Daniel","Phillips","8-342-1234",24,"Panamá","Senado",true,19); también estás haciendo un buen uso del polimorfismo.

Saludos!

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Ah, lo de la ñ lo habia leido en otros post, se me habia olvidado! con lo del archivo txt... ups... los demas post restantes los subi asi como un texto, espero que me puedan disculpar por eso..

Muchas gracias por tus comentarios y correcciones
Saludos
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Clase persona
Código: [Seleccionar]
package Asamblea;
public class Persona {
    protected String nombre, apellido, cedula;
    protected int edad;
    public Persona(String nombre,String apellido,String cedula,int edad){this.nombre = nombre;this.apellido = apellido;this.cedula = cedula;this.edad = edad;}
    public void setNombre(String dato){nombre = dato;}
    public void setApellido(String dato){apellido = dato;}
    public void setCedula(String dato){cedula = dato;}
    public void setEdad(int dato){edad = dato;}
    public String getNombre(){return nombre;}
    public String getApellido(){return apellido;}
    public String getCedula(){return cedula;}
    public int getEdad(){return edad;}
    public String getPersonaInfo(){
        return "Nombre: ".concat(nombre).concat(" ").concat(apellido).concat("\nEdad: ").concat(String.valueOf(this.edad)).concat("\nCedula: ").concat(cedula);}
}

Clase legislador
Código: [Seleccionar]
package Asamblea;

public abstract class Legislador extends Persona{
    protected String provinciaQueRepresenta, camara;
    protected boolean nacional;
    protected int aniosDeResidencia;
    public Legislador(String nombre,String apellido,String cedula,int edad, String provinciaQueRepresenta,String camara, boolean nacional, int aniosDeResidencia){
        super(nombre,apellido,cedula,edad);
        this.provinciaQueRepresenta = provinciaQueRepresenta;
        this.camara = camara;
        this.nacional = nacional;
        this.aniosDeResidencia = aniosDeResidencia;
    }
    public void setProvincia(String dato){provinciaQueRepresenta = dato;}
    public void setCamara(String dato){camara = dato;}
    public void setNacional(boolean dato){nacional = dato;}
    public void setAñosResidencia(int dato){aniosDeResidencia = dato;}
    public String getProvincia(){return provinciaQueRepresenta;}
    public String getNacional(){if(nacional == true) return "Si"; else return "No";}   
    abstract public String getCamaraEnQueTrabaja();
    @Override
    public String toString(){       
        return getPersonaInfo().concat("\nProvincia que representa: ").concat(provinciaQueRepresenta).concat("\n¿Es de nacionalidad panameña?: ").concat(getNacional())
                .concat("\nCamara en que trabaja: ").concat(getCamaraEnQueTrabaja()).concat("\n");
    }
}

Clase Diputado
Código: [Seleccionar]
package Asamblea;

public class Diputado extends Legislador{
    public Diputado(String nombre,String apellido,String cedula,int edad, String provinciaQueRepresenta,String camara, boolean nacional, int añosDeResidencia){
        super(nombre,apellido,cedula,edad,provinciaQueRepresenta,camara,nacional,añosDeResidencia);
    }
    public String getCamaraEnQueTrabaja(){return camara;}
}

Clase Senador
Código: [Seleccionar]
package Asamblea;

public class Senador extends Legislador{
    public Senador(String nombre,String apellido,String cedula,int edad, String provinciaQueRepresenta,String camara, boolean nacional, int añosDeResidencia){
        super(nombre,apellido,cedula,edad,provinciaQueRepresenta,camara,nacional,añosDeResidencia);
    }
    public String getCamaraEnQueTrabaja(){return camara;}
}

Clase ListadoDeLegisladores
Código: [Seleccionar]
package Asamblea;
import java.util.ArrayList;
import java.util.Iterator;

public class ListadoDeLegisladores {
    ArrayList<Legislador> lista;   
    public ListadoDeLegisladores(){lista = new <Legislador> ArrayList();}
    public void añadir(Legislador obj){lista.add(obj);}
    public void imprimirLista(){
        Iterator<Legislador> recorre = lista.iterator();
        while(recorre.hasNext()){
            Legislador aux = recorre.next();
            System.out.println(aux.toString());
        }
    }
    public ArrayList getLista(){return lista;}
}

Muchas gracias y saludos
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola Dan!

En la clase Legislador has hecho la sobreescritura de toString (correcto)

Código: [Seleccionar]
    @Override
    public String toString(){       
        return getPersonaInfo().concat("\nProvincia que representa: ").concat(provinciaQueRepresenta).concat("\n¿Es de nacionalidad panameña?: ").concat(getNacional())
                .concat("\nCamara en que trabaja: ").concat(getCamaraEnQueTrabaja()).concat("\n");
    }


Sin embargo en la clase persona mantienes el método

Código: [Seleccionar]
    public String getPersonaInfo(){
        return "Nombre: ".concat(nombre).concat(" ").concat(apellido).concat("\nEdad: ").concat(String.valueOf(this.edad)).concat("\nCedula: ").concat(cedula);}
}


Esto no es adecuado, la filosofía Java es mantener en clases y superclases el mismo nombre para métodos que hacen lo mismo (con variaciones debido al nivel dentro de la jerarquía de herencia en que nos encontremos)

Ten en cuenta que toString() es un método disponible en la superclase Object, y que es heredado por todos los objetos (aunque puede ser no útil si no lo sobreescribimos).

La forma de resolver esto sería:

En la clase Persona:

Código: [Seleccionar]
    public String toString(){
        return "Nombre: ".concat(nombre).concat(" ").concat(apellido).concat("\nEdad: ").concat(String.valueOf(this.edad)).concat("\nCedula: ").concat(cedula);}
}

En la clase Legislador:

Código: [Seleccionar]
   @Override
    public String toString(){       
        return super.toString().concat("\nProvincia que representa: ").concat(provinciaQueRepresenta).concat("\n¿Es de nacionalidad panameña?: ").concat(getNacional())
                .concat("\nCamara en que trabaja: ").concat(getCamaraEnQueTrabaja()).concat("\n");
    }


No lo he probado (prúebalo tú por si acaso) pero quédate con la idea de que en Java hay ciertos métodos que ya están concebidos para sobreescribirlos y hacer ciertas cosas, por ejemplo:

toString para devolver un String que es una representación en forma de texto de una clase

equals para devolver un booleano que dice si dos objetos deben considerarse iguales o no

Hay más (que se deben ir conociendo poco a poco, como compareTo y otros)


En realidad no es obligatorio, podríamos usar otros nombres, pero la ventaja de esto es que todos los programadores usan el mismo nombre para métodos y otras cuestiones y hace más fácil el desarrollo e intercambio de código entre programadores.

Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".