Autor Tema: Para qué sirven las interfaces Java. Ejemplo ejercicio resuelto CU00697B  (Leído 6647 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas dejo mi solución del ejercicio. Comentar que he modificado algo, he creado una clase abstracta intermedia, entre la interface Edificio y los dos tipos actuales de edificios, clase llamada Edificacion. El resto creo que hago todo lo que pide el ejercicio.

Mil gracias tienes razón, adjunto el correcto ;)

« Última modificación: 01 de Mayo 2015, 09:02 por Alex Rodríguez »

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Vi el código, lo veo bien, hiciste un buen uso del polimorfismo, pero... veo figuras... y en el enunciado del ejercicio leo "Edificio, polideportivo"... era esto lo que nos querías compartir?



Huelo una confusion aqui.. a mi me ha pasado esto con trabajos de la U, quedo entregando otra cosa q no era xdd (El trabajo impreso me queda salvando <.<)
« Última modificación: 01 de Mayo 2015, 09:03 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Hola lorenzo!

Le has metido bastante dedicación a este código (se nota!) bien por eso! bueno, como buen compañero del foro te señalo algunos detalles a continuación:

1. En tus interface tienes esto:
Código: [Seleccionar]
abstract public double getSuperficieEdificio();
Código: [Seleccionar]
abstract public String getTipoInstalacion();
¿Sabias tu que todo método declarado en una interface es abstracto y publico por defecto? No necesitas escribir abstract ni public. Si lo escribo así: double getSuperficieEdificio(); java lo tomara por defecto abstracto y publico.

2. En tu clase GestorDeDatos, veo esto:
Citar
String cadena = "";
        do{
            Scanner escaner = new Scanner(System.in);
            cadena = escaner.nextLine();
            escaner.close();
        }while(cadena == "");
        return cadena;

A estas alturas en el curso se pudo ver que String es una clase y no es posible comparar contenidos de objetos Strings con el operador ==. Aqui era usar un equals...

3. Tenias lo siguiente:

private ArrayList <Edificicacion> lista; y tambien Iterator  iter = lista.iterator();

En este metodo:
public void addEdificacion(Edificacion edificacion){ lista.add(edificacion); }

En el switch de la clase test:

switch(numeroMenu){     
             case 1: Polideportivo poli1 = new Polideportivo(entrada1.recogerNombre(),entrada1.recogerTipoPolideportivo(),entrada1.recogerSuperficie() );
                     lista1.addEdificacion(poli1);
                     break;
             case 2: EdificioOficinas edi1 = new EdificioOficinas(entrada1.recogerSuperficie(),entrada1.recogerNumeroOficinas() );
                     lista1.addEdificacion(edi1);
                     break;
             case 3: lista1.listarEdificaciones(); break;           
             case 4: System.out.println("....... Final del programa" ); break;   


Lo correcto era declarar el metodo, objetos, ArrayList y el Iterator de la siguiente manera para sacarle provecho al polimorfismo:

private ArrayList <Edificio> lista; y tambien Iterator <Edificio> iter = lista.iterator();

Método: public void addEdificacion(Edificio edificacion){ lista.add(edificacion); }

switch(numeroMenu){     
             case 1: Edificio poli1 = new Polideportivo(entrada1.recogerNombre(),entrada1.recogerTipoPolideportivo(),entrada1.recogerSuperficie() );
                     lista1.addEdificacion(poli1);
                     break;
             case 2: Edificio edi1 = new EdificioOficinas(entrada1.recogerSuperficie(),entrada1.recogerNumeroOficinas() );
                     lista1.addEdificacion(edi1);
                     break;
             case 3: lista1.listarEdificaciones(); break;           
             case 4: System.out.println("....... Final del programa" ); break;     

4. Por ultimo, vi que usastes un try-catch... esto lo vi en la universidad una vez cuando un compañero expuso en el tablero sobre el tal "try-catch".  Recuerdo que menciono que era para manejar "excepciones"... sinceramente no conozco como utilizarlo aun... pero... mira esto:



Me salio el error siguiente, no me dejaba continuar... hice cambios en la clase GestorDeDatos... Elimine todos esos try-catch y coloque lo siguiente:

Código: [Seleccionar]
package Poli;
import java.util.Scanner;

public class GestorDeDatos {   
    //Constructor
    public GestorDeDatos(){ /*vacio*/ }   
    //Método seleccion menu   
    public int recogerMenu(){ //método que controla la seleccion del menú
        int numero = 0;   
        do{
            System.out.println(" Elige una opción entre 1 y 4 \n ");
            numero = recogerEntero();   
        } while (numero < 1 || numero > 4);
        return numero;
    }
   
    public double recogerSuperficie(){ //método que controla la seleccion del menú
        double numero = 0;   
        do{
            System.out.println(" Introduce la superficie de la edificacion");
            numero = recogerDouble();   
        } while (numero < 0 );
        return numero;
    }
   
    public String recogerNombre(){ System.out.println("Introduce el nombre del polideportivo"); return recogerCadena(); }
   
    public String recogerTipoPolideportivo(){ System.out.println("Introduce el tipo de polideportivo, Estadio, Pista de atletismo... "); return recogerCadena(); }
   
    public int recogerNumeroOficinas(){ System.out.println(" Introduce el numero de oficinas del edificio: "); return recogerEntero(); }
   
    public double recogerDouble(){
        Scanner in = new Scanner(System.in);
        return in.nextDouble();   
    }
       
    public int recogerEntero(){
        Scanner in = new Scanner(System.in);
        return in.nextInt();   
    }   
    public String recogerCadena(){
        Scanner in = new Scanner(System.in);
        return in.nextLine();   
    }
}

De esta manera se me permitió continuar la ejecución:





Recomiendo: Probar tu programa antes de publicarlo en el foro y también, siempre trata de utilizar lo que has aprendido en este foro. Es bueno improvisar (yo lo hago y ya lo he hecho aqui  ::) ), pero trata siempre de utilizar hasta donde te han enseñado!

No he revisado nada del java avanzado, pero puedo jurar que el try-catch es tema de java avanzado xd

Espero haberte ayudado amigo!
Saludos y sigue asi!  :D
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas, primero gracias a Dan por sus percepciones, te diste cuenta del == "" , es un fallazo si, al copiPastearlo de ejercicios anteriores se me coló.

Sobre la excepcion que te salta, fijate que es un "no line found", así que no tiene nada que ver con los try catch, a mi no me ha saltado, pero poniendome a deducir, puede ser por la falta del equals("");  y que introdujeras una cadena vacía y te saltó.

Polimorfismo, en este caso que era ejercicio de Interface pues igual debia hacer la lista de Edificio, toda la razón pero también usa polimorfismo en Edificación.  No es menos polimorfismo segun mi esquema, sino hariamos solo Arrays de Object ;)

Sobre mi esquema alguien mas puede comentarme, ya que lo hice algo diferente al planteado y si vienen criticas las tomare en cuenta y las corregiré.

P.D. Cambié el equals Dan, añado en adjuntos jejeje

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Hola Lorenzo te hablo tanto de lo que me ha gustado como de lo que no me ha gustado, aunque tengo que decirte que me ha gustado más que no gustado.

Ya te lo ha comentado Dan pero en el código de las interfaces

public interface InstalacionDeportiva {
    abstract public String getTipoInstalacion();
}

No debes escribir abstract public porque no hace falta.


El introducir la clase abstracta public abstract class Edificacion no parece mala idea porque favorece el reuso del código, aunque el ejercicio no lo pedía.

Esta forma de bucle creo que no se explica en el curso, pero es una forma de las existentes para crear un bucle.

Código: [Seleccionar]
        for(Iterator iter = lista.iterator(); iter.hasNext();){
            System.out.println(indice.toString()+ "*** " + iter.next().toString());
            indice++;
        }


Estos métodos dentro de GestorDeDatos se ven bien pensados...

Código: [Seleccionar]
public String recogerNombre(){ System.out.println("Introduce el nombre del polideportivo"); return recogerCadena(); }
y además demuestran que sabes bien lo que estás haciendo

En general me ha gustado la clase GestorDeDatos, bien pensada

Y también me ha gustado la clase con el main, breve y se encarga de lo que se debe encargar, de dirigir a las otras clases.

Saludos!!



 8) Distintas formas de bucles y algunas ideas en inglés

Código: [Seleccionar]
import java.util.*;

public class ListIterationExample {

     public static void main(String []args){
        List<Integer> numbers = new ArrayList<Integer>();

        // populates list with initial values
        for (Integer i : Arrays.asList(0,1,2,3,4,5,6,7))
            numbers.add(i);
        printList(numbers);         // 0,1,2,3,4,5,6,7

        // replaces each element with twice its value
        for (int index=0; index < numbers.size(); index++) {
            numbers.set(index, numbers.get(index)*2);
        }
        printList(numbers);         // 0,2,4,6,8,10,12,14

        // does nothing because list is not being changed
        for (Integer number : numbers) {
            number++; // number = new Integer(number+1);
        }
        printList(numbers);         // 0,2,4,6,8,10,12,14 

        // same as above -- just different syntax
        for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
            Integer number = iter.next();
            number++;
        }
        printList(numbers);         // 0,2,4,6,8,10,12,14

        // ListIterator<?> provides an "add" method to insert elements
        // between the current element and the cursor
        for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
            Integer number = iter.next();
            iter.add(number+1);     // insert a number right before this
        }
        printList(numbers);         // 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

        // Iterator<?> provides a "remove" method to delete elements
        // between the current element and the cursor
        for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
            Integer number = iter.next();
            if (number % 2 == 0)    // if number is even
                iter.remove();      // remove it from the collection
        }
        printList(numbers);         // 1,3,5,7,9,11,13,15

        // ListIterator<?> provides a "set" method to replace elements
        for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
            Integer number = iter.next();
            iter.set(number/2);     // divide each element by 2
        }
        printList(numbers);         // 0,1,2,3,4,5,6,7
     }

     public static void printList(List<Integer> numbers) {
        StringBuilder sb = new StringBuilder();
        for (Integer number : numbers) {
            sb.append(number);
            sb.append(",");
        }
        sb.deleteCharAt(sb.length()-1); // remove trailing comma
        System.out.println(sb.toString());
     }
}

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Jajaja bueno, no puedo comentar casi nada porque no se como manejar esos try-catch :(

pero te puedo jurar que no ingrese nada y el error se me colaba u,u .. que pudo ser entonces? :(
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
A si perdonad dan y javi, no dije nada de lo de abstracto public, al estar practicando, decidí escribirlo igual que en la variable abstract static creo q es, aunque como decís lo hace automático. 

gracias por el comentario sobre la estructura que era lo que me preocupaba más saber.

Dan en principio por lo que se ve en tu captura fallo el nextline() porque no había next línea, quizá me falto poner en try catch la excepción de no next línea, pero a mi no me ha saltado nunca. lo mirare otro rato. pq además fíjate que hago .close en los scanner para que se reinicien x si acaso.
« Última modificación: 03 de Mayo 2015, 22:54 por Lorenzo31 »

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
me compartes el codigo cuando lo resuelvas amigo! Asi me sirve de guia para aprender algo nuevo!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
me compartes el codigo cuando lo resuelvas amigo! Asi me sirve de guia para aprender algo nuevo!

Cuenta con ello Dan ;)

 

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".