Autor Tema: Implementar interfaz en Java simular la herencia múltiple entre clases CU00697B  (Leído 2616 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas noches. Aquí dejo el ejercicio CU00697B del curso Java desde cero.

Citar
EJERCICIO

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.

El código de la interfaz "InstalacionDeport":

Código: [Seleccionar]
public interface InstalacionDeport{
   
    int getTipoDeInstalacion();
}

El código de la inteface "Edificio":

Código: [Seleccionar]
public interface Edificio{
   
    double getSuperficieEdificio();
}

El código de la clase "Polideportivo":

Código: [Seleccionar]
public class Polideportivo implements InstalacionDeport, Edificio{
    private String nombre;
    private int tipoDeInstalacion;
    private double largo;
    private double ancho;
   
    public Polideportivo(String nombre, int tipoDeInstalacion, double largo, double ancho){
        this.nombre = nombre;
        this.tipoDeInstalacion = tipoDeInstalacion;
        this.largo = largo;
        this.ancho = ancho;
    }
   
    public String getNombre(){return nombre;}
    public int getTipoDeInstalacion(){return tipoDeInstalacion;} //Sobreescribir el método abstracto de la interface
    public double getLargo(){return largo;}
    public double getAncho(){return ancho;}
   
    public double getSuperficieEdificio(){ //Sobreescribir el método abrastracto de la interface
        double area = 0;
        area = largo*ancho;
        return area;
    }
   
    public String toString(){ //Sobreescribimos el método "toStirng" de la superclase "Object"
        Integer tmp01 = tipoDeInstalacion;
        Double tmp02 = getSuperficieEdificio();
        return "El polideportivo: "+nombre+" es de tipo de instalacion: "+tmp01.toString()+" y una superficie de: "+tmp02.toString();
    }
}   

El código de la clase "EdificioOficinas":

Código: [Seleccionar]
public class EdificioOficinas implements Edificio{
    private int numeroOficinas;
    private double largo;
    private double ancho;
   
    public EdificioOficinas(int numeroOficinas){
        this.numeroOficinas = numeroOficinas;
        largo = 0;
        ancho = 0;
    }
   
    public void setLargo(double largo){
        this.largo = largo;
    }
   
    public void setAncho(double ancho){
        this.ancho = ancho;
    }
   
    public int getNumeroOficinas(){return numeroOficinas;}
   
    public double getSuperficieEdificio(){ //Implementamos el método "getSuperficieEdificio()"
        double area = 0;
        area = largo*ancho;
        return area;
    }
   
    public String toString(){ //Sobreescribimos el método "toString()"
        Double tmp = getSuperficieEdificio();
        return "El edificio tiene: "+numeroOficinas+" oficinas.";
    }
}

El código de la clase main "TestInterface":

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

public class TestInteface{
    public static void main(String []Args){
    Edificio polideportivo1 = new Polideportivo("Marbella",2,250,125);
    Edificio polideportivo2 = new Polideportivo("Sant Josep",1,200,90);
    Edificio polideportivo3 = new Polideportivo("Argentina",4,370,190);
    Edificio edificioOficinas1 = new EdificioOficinas(10);
    Edificio edificioOficinas2 = new EdificioOficinas(420);
    ArrayList<Edificio> listaEdificios = new ArrayList<Edificio>();
    listaEdificios.add(polideportivo1);
    listaEdificios.add(polideportivo2);
    listaEdificios.add(polideportivo3);
    listaEdificios.add(edificioOficinas1);
    listaEdificios.add(edificioOficinas2);
    Iterator<Edificio> it = listaEdificios.iterator();
    while(it.hasNext()){
        System.out.println(it.next().toString());
    }
}
}

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

Entre la clase "Polideportivo" con las interfeces "InstalacionDeport" y "Edificio".

Tenía una duda, por qué no puedo acceder desde la clase "TestInterface" a los métodos de los objetos creados? Es decir, añadiendo esta línea en la clase "TestInterface":

Código: [Seleccionar]
edificioOficinas1.setLargo(29);
y el código se quedaría así:

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

public class TestInteface{
    public static void main(String []Args){
    Edificio polideportivo1 = new Polideportivo("Marbella",2,250,125);
    Edificio polideportivo2 = new Polideportivo("Sant Josep",1,200,90);
    Edificio polideportivo3 = new Polideportivo("Argentina",4,370,190);
    Edificio edificioOficinas1 = new EdificioOficinas(10);
    edificioOficinas1.setLargo(29);
    Edificio edificioOficinas2 = new EdificioOficinas(420);
    ArrayList<Edificio> listaEdificios = new ArrayList<Edificio>();
    listaEdificios.add(polideportivo1);
    listaEdificios.add(polideportivo2);
    listaEdificios.add(polideportivo3);
    listaEdificios.add(edificioOficinas1);
    listaEdificios.add(edificioOficinas2);
    Iterator<Edificio> it = listaEdificios.iterator();
    while(it.hasNext()){
        System.out.println(it.next().toString());
    }
}
}

no me reconoce el método. Será porque el método main es "static" y por eso?

Gracias.
« Última modificación: 20 de Marzo 2016, 11:22 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días el código está correcto

El método toString() de la clase Polideportivo (y en general) lo puedes escribir más simple:

Código: [Seleccionar]
    public String toString(){ //Sobreescribimos el método "toStirng" de la superclase "Object"
        return "El polideportivo: "+nombre+" es de tipo de instalacion: "+tipoDeInstalacion+" y una superficie de: "+getSuperficieEdificio();
    }

El problema que tienes con edificioOficinas1.setLargo(29); es que el compilador conoce el tipo estático pero no va tan allá como para conocer el tipo dinámico. Es decir, el compilador solo llega a saber que edificioOficinas1 es de tipo Edificio, pero nada más. Como el tipo Edificio no tiene definido el método setLargo salta un error.

Esto se puede resolver incluyendo el método como declarado en la interface, o haciendo un casting que le indique específicamente al compilador el tipo que trae la referencia:

((EdificioOficinas)edificioOficinas1).setLargo(29);

Saludos.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola, Mario.

Gracias por corregirme el ejercicio y ayudarme sobre el método "setLargo()" en la subclase "EdificioOficinas". Ahora sí que el compilador reconoce el método.

También he corregido el método "toString()" según tus indicaciones. Lo había hecho así, porque pensaba que obligatoriamente las variables tenían que salir con tipo "String" para una futura utilización en una base de datos o lo que fuere.

Un saludo.

 

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