Autor Tema: Java ejemplo interfaces similitud con herencia múltiple Ejercicio CU00697B  (Leído 4455 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Buenas noches!!

Vengo a resolver el ejercicio 97° del curso, cuyo enunciado dice así:

Se plantea desarrollar un programa Java que permita representar la siguiente situación. Una instalación deportiva es un recinto delimitado donde se practican deportes, en Java interesa disponer de un método int getTipoDeInstalacion(). Un edificio es una construcción cubierta y en Java interesa disponer de un método double getSuperficieEdificio(). Un polideportivo es al mismo tiempo una instalación deportiva y un edificio; en Java interesa conocer la superficie que tiene y el nombre que tiene. Un edificio de oficinas es un edificio; en Java interesa conocer el número de oficinas que tiene.

Definir dos interfaces y una clase que implemente ambas interfaces para representar la situación anterior. En una clase test con el método main, crear un ArrayList que contenga tres polideportivos y dos edificios de oficinas y utilizando un iterator, recorrer la colección y mostrar los atributos de cada elemento.


Bien, he dejado los códigos adjuntados a este post (pulsar en el icono de descarga estando logados en los foros), ellas contienen las 2 interfaces y clases! Hagamos una prueba:

Antes de mostrarle todo, quiero hacerles saber que no tengo ni idea de cuanto podría medir una superficie de un edificio o campo deportivo, así que entiendame  :-[

Código: [Seleccionar]
package Deportivo;
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[]args){
        Edificio polideportivo1 = new Polideportivo("Balboa",2,30.50,20.56,1);
        Edificio polideportivo2 = new Polideportivo("Espinar",1,14.150,25.75,1);
        Edificio polideportivo3 = new Polideportivo("Margarita",3,50.345,20.39,1);
        Edificio EdificioOficina1 = new EdificioOficina(35,70.34,80.54,19);
        Edificio EdificioOficina2 = new EdificioOficina(25,50.35,34.45,15);
        ArrayList <Edificio> lista = new <Edificio> ArrayList();
        lista.add(polideportivo1);
        lista.add(polideportivo2);
        lista.add(polideportivo3);
        lista.add(EdificioOficina1);
        lista.add(EdificioOficina2);
        Iterator<Edificio> recorre = lista.iterator();
        while(recorre.hasNext()){
            Edificio aux = recorre.next();
            System.out.println(aux.imprimirInfo());
        }
    }
}

Ejecución!


Citar
¿Entre qué clases existe una relación que se asemeja a la herencia múltiple?

Mis dos interfaces: InstalacionDeportiva y Edificio.
Mis dos clases: Polideportivo y EdificioOficina.

La clase Polideportivo implementa InstalacionDeportiva y Edificio.
La clase EdificioOficina implementa Edificio.

En el caso de la clase Polideportivo, podemos observar algo que se asemeje a herencia múltiple.

Ya pude comprobar exactamente para que funciona esto de las interfaces.... se puede dar provecho mucho mas fácil al polimosfismo! Hice otra funcion mas a la interface Edificio para poder imprimir los datos... espero haber no hecho trampa jejeje

Esperare sus comentarios y correcciones! :)
« Última modificación: 29 de Abril 2015, 09:35 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 (CU00697B), Las interfaces en java!
« Respuesta #1 en: 28 de Abril 2015, 09:21 »
Hola de nuevo!

En la interface Edificio

public interface Edificio {
    double getSuperficieEdificio();
    String imprimirInfo();
}


Normalmente imprimirInfo() no es algo que se suela usar en programación profesional dentro de una interface (ni dentro de una clase), aunque puede ser válido si se considera necesario. En general se usa toString() y se delega el mostrar mensajes por pantalla a otras clases (en este caso se delegaría a la clase con el main). Pero está bien hacer pruebas, con las pruebas se aprende.



Tienes un lapsus en el cálculo public double getSuperficieEdificio(){return (ancho * largo * alto);} ya que esta fórmula lo que devuelve es un volumen, el cálculo de superficie simplemente es public double getSuperficieEdificio(){return (ancho * largo);}

En el main salta un warning debido a esto: ArrayList <Edificio> lista = new <Edificio> ArrayList();

Lo correcto es esto: ArrayList <Edificio> lista = new  ArrayList<Edificio>();

En el main ArrayList <Edificio> lista = new  ArrayList<Edificio>(); está bien pero mejor acostumbrarse a usar List <Edificio> lista = new  ArrayList<Edificio>(); para hacer uso del polimorfismo (en este caso hay que importar List).

Estamos con detalles pero la idea es seguir mejorando!!


Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00697B), Las interfaces en java!
« Respuesta #2 en: 28 de Abril 2015, 16:53 »
El toString() me tiene suave jaja, voy a subir luego los arreglos en los detalles

Saludos
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00697B), Las interfaces en java!
« Respuesta #3 en: 28 de Abril 2015, 18:21 »
Interface Edificio

Código: [Seleccionar]
package Deportivo;

public interface Edificio {
    double getSuperficieEdificio();
    String toString();
}


Interface InstalacionDeportiva

Código: [Seleccionar]
package Deportivo;
public interface InstalacionDeportiva {
    int getTipoInstalacion();
}


Clase Polideportivo:

Código: [Seleccionar]
package Deportivo;

public class Polideportivo implements Edificio,InstalacionDeportiva{
    private String nombrePoli, tipo;
    private int tipoInstalacion;
    private double ancho, largo;
    public Polideportivo(String nombrePoli, int tipoInstalacion, double ancho, double largo){
        this.nombrePoli = nombrePoli;
        this.tipoInstalacion = tipoInstalacion;
        this.ancho = ancho;
        this.largo = largo;
    }
    public void setNombre(String dato){nombrePoli = dato;}
    public void setTipoInstalacion(int num){tipoInstalacion = num;}
    public void setSuperficieEdificio(double dato1, double dato2){ancho = dato1; largo = dato2;}
    public double getSuperficieEdificio(){return (ancho * largo);}
    public int getTipoInstalacion(){return tipoInstalacion;}
    public String toString(){
        return "Nombre del Establecimiento: "+nombrePoli+"\nTipo De Instalacion: "+tipoInstalacion+"\nSuperficie: "+Math.round(getSuperficieEdificio())+"m^2\n";
    }
}



Clase EdificioOficina:

Código: [Seleccionar]
package Deportivo;

public class EdificioOficina implements Edificio {
    private int numeroOficinas;
    private double ancho, largo;
    public EdificioOficina(int numeroOficinas, double ancho, double largo){this.numeroOficinas = numeroOficinas; this.ancho = ancho; this.largo = largo;}
    public void setNumeroOficina(int dato){numeroOficinas = dato;}
    public void setSuperficieEdificio(double dato1, double dato2){ancho = dato1; largo = dato2;}
    public int getNumeroOficina(){return numeroOficinas;}
    public double getSuperficieEdificio(){return (ancho * largo);}
    public String toString(){
        return "Numero de oficinas: "+numeroOficinas+"\nSuperficie: "+Math.round(getSuperficieEdificio())+"m^2\n";
    }
}


Clase Main

Código: [Seleccionar]
package Deportivo;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

public class Main {
    public static void main(String[]args){
        Edificio polideportivo1 = new Polideportivo("Balboa",2,30.50,20.56);
        Edificio polideportivo2 = new Polideportivo("Espinar",1,14.150,25.75);
        Edificio polideportivo3 = new Polideportivo("Margarita",3,50.345,20.39);
        Edificio EdificioOficina1 = new EdificioOficina(35,70.34,80.54);
        Edificio EdificioOficina2 = new EdificioOficina(25,50.35,34.45);
        List <Edificio> lista = new ArrayList <Edificio>();
        lista.add(polideportivo1);
        lista.add(polideportivo2);
        lista.add(polideportivo3);
        lista.add(EdificioOficina1);
        lista.add(EdificioOficina2);
        Iterator<Edificio> recorre = lista.iterator();
        while(recorre.hasNext()){
            Edificio aux = recorre.next();
            System.out.println(aux.toString());
        }
    }
}

Saludos y gracias por el curso! muy bueno!!
« Última modificación: 29 de Abril 2015, 09:34 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
Hola Dan, ahora todo bien

En otro mensaje he comentado algunas cuestiones sobre toString(). En este caso, ten en cuenta que incluir String toString(); es redundante (realmente no hace nada)

public interface Edificio {
    double getSuperficieEdificio();
    String toString();
}


El motivo es que toString() es un método que todo objeto en Java tiene disponible por herencia de la superclase Object. En una interface tú declaras los métodos que obligatoriamente deben existir en las clases que implementen la interface. Pero el método toString() ya existe en toda clase por herencia de Object, con lo cual declarar en una interface String toString() no tendría sentido.

Basta con

public interface Edificio {
    double getSuperficieEdificio();
}

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