Autor Tema: Ejercicio! entrega CU00697B Ventajas de usar una interface en java  (Leído 6055 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Diagrama con interfaces y clases concretas.


Pregunta:
Citar
¿Entre qué clases existe una relación que se asemeja a la herencia múltiple?
Respuesta:
La clase PoliDeportivo implementa a las clases InstalacionDeportiva y Edificio a su vez, por tanto la clase concreta PoliDeportivo implementa (hereda) las constantes, y métodos abstractos que contenga cada una de las interfaces, esto es lo que podríamos llamar "herencia múltiple".

A continuación el código del ejercicio:

public interface InstalacionDeportiva
Código: [Seleccionar]
public interface InstalacionDeportiva
{
    String tipoDeInstalacion = "Recinto delimitado";// Por defecto public static final (constante).
    String getTipoDeInstalacion();// Por defecto abstract public.
}
public interface Edificio
Código: [Seleccionar]
public interface Edificio
{
   String tipoDeConstruccion = "Construccion cubierta";// Por defecto public static final (constante).
   float getSuperficieEdificio();// Por defecto abstract public.
}
public class PoliDeportivo implements InstalacionDeportiva, Edificio
Código: [Seleccionar]
public class PoliDeportivo implements InstalacionDeportiva, Edificio
{
    private String nombre, tipoDeDeporte;
    private float largo, hancho, altura;
    //Constructor geeral
    public PoliDeportivo()
    {
      nombre = "Desconocido";
      tipoDeDeporte = "Desconocido";
      largo = 0F;
      hancho = 0F;
      altura = 0F;
    }
    //Constructor con parametros
    public PoliDeportivo(String nombre, String tipoDeDeporte, float largo, float hancho, float altura)
    {
      this.nombre = nombre;
      this.tipoDeDeporte = tipoDeDeporte;
      this.largo = largo;
      this.hancho = hancho;
      this.altura = altura; 
    }
    //Setters
    public void setNombre(String nombre)
    {
      this.nombre = nombre;
    }
    public void setTipoDeDeporte(String tipoDeDeporte)
    {
      this.tipoDeDeporte = tipoDeDeporte;
    }
    public void setLargo(float largo)
    {
      this.largo = largo;
    }
    public void setHancho(float hancho)
    {
      this.hancho = hancho;
    }
    public void setAltura(float altura)
    {
      this.altura = altura;
    }
    //Getters
    public String getNombre()
    {
      return nombre;
    }
    public String getTipoDeDeporte()
    {
      return tipoDeDeporte;
    }
    @Override
    public String getTipoDeInstalacion()
    {
      return this.tipoDeInstalacion;
    }
    public float getLargo()
    {
      return largo;
    }
    public float getHancho()
    {
      return hancho;
    }
    public float getAltura()
    {
      return altura;
    }
    //Otros metodos
    @Override
    public float getSuperficieEdificio()
    {
      return (largo * hancho * altura) * 6;
    }
   
    @Override
    public String toString()
    {
      return "Tipo de instalacion: " + tipoDeInstalacion + "\nInstalacion para el deporte de: " + tipoDeDeporte +"\nNombre: " + nombre + "\nLargo : " + largo + " mts\nHancho: " +
      hancho + " mts\nAltura: " + altura + " mts\nSuperficie total: " + getSuperficieEdificio() + " m²";     
    }
}
public class EdificioDeOficinas implements Edificio
Código: [Seleccionar]
public class EdificioDeOficinas implements Edificio
{
    private int cantidadDeOfics;
    private float largo, hancho, altura;
    public EdificioDeOficinas()
    {
      cantidadDeOfics = 0;
      largo = 0F;
      hancho = 0F;
      altura = 0F;
    }
    //Cnstructor con parametros
    public EdificioDeOficinas(int cantidadDeOfics, float largo, float hancho, float altura)
    {
      this.cantidadDeOfics = cantidadDeOfics;
      this.largo = largo;
      this.hancho = hancho;
      this.altura = altura;
    }
    //Setters
    public void setCantidadDeOfics(int cantidadDeOfics)
    {
      this.cantidadDeOfics = cantidadDeOfics;
    }
    public void setLargo(float largo)
    {
      this.largo = largo;
    }
    public void setHancho(float hancho)
    {
      this.hancho = hancho;
    }
    public void setAltura(float altura)
    {
      this.altura = altura;
    }
    //Getters
    public int getCantidadDeOfics()
    {
      return cantidadDeOfics;
    }
    public float getLargo()
    {
      return largo;
    }
    public float getHancho()
    {
      return hancho;
    }
    public float getAltura()
    {
      return altura;
    }
    //Otros metodos
    public String getTipoDeConstruccion()
    {
      return tipoDeConstruccion;
    }
   
    @Override
    public float getSuperficieEdificio()
    {
      return (largo * hancho * altura) * 6;
    }
   
    @Override
    public String toString()
    {
      return "Tipo de construccion: " + tipoDeConstruccion + "\nCantidad de oficinas: " + cantidadDeOfics + "\nLargo : " + largo + " mts\nHancho: " + hancho +
      " mts\nAltura: " + altura + " mts\nSuperficie total: " + getSuperficieEdificio() + " m²";
    }
}
public class TestSemejansaHerenciaMult
Código: [Seleccionar]
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class TestSemejansaHerenciaMult
{
    private static List<Edificio> listaEdificios = new ArrayList<Edificio>();
    public static void main(String []args)
    {
       System.out.println("    *****Lista de construcciones en proyecto*****\n\n");
       //Creacion de objetos
       InstalacionDeportiva poliDeportivo1 = new PoliDeportivo("Felix Sanchez", "100 mts con ballas", 48F, 28F, 50F);
       Edificio poliDeportivo2 = new PoliDeportivo("Estadio Quisqueya", "Baseball", 57F, 32.7F, 60F);
       PoliDeportivo poliDeportivo3 = new PoliDeportivo("Club san carlos", "Basketball", 46F, 33F, 50.4F);
       Edificio edificioDeOficinas1 = new EdificioDeOficinas(20, 39.5F, 31F, 55F);
       EdificioDeOficinas edificioDeOficinas2 = new EdificioDeOficinas(35, 56F, 37.3F, 57.9F);
       //Agregando objetos a la listaEdificios
       listaEdificios.add((Edificio)poliDeportivo1);/*Los objetos tipo PoliDeportivo, son a su vez tipo InstalacionDeportiva  y tipo Edificio, el ArrayList
       listaEdificios esta definido para contener objetos de tipo definido Edificio, u objetos de una clase que implemente o herede de forma indirecta de 
       la interface Edificio. Al declarar el objeto poliDeportivo1 como tipo dinámico InstalacionDeportiva, no es posible agregarlo al ArrayList listaEdificios porque
       este admite solo tipos definidos por la interface Edificio o tipos definidos por una clase que implemente esta interface o bien tipos definidos por una clase que
       herede de otra clase que implemente la interface Edificio. Para poder agregar al objeto poliDeportivo1 al ArrayList listaEdificios, se le indica al
       compilador que este objeto tambien implementa a la interface Edificio, mediante la declaracion: listaEdificios.add((Edificio)poliDeportivo1);*/
       listaEdificios.add(poliDeportivo2);
       listaEdificios.add(poliDeportivo3);
       listaEdificios.add(edificioDeOficinas1);
       listaEdificios.add(edificioDeOficinas2);
       
       Iterator<Edificio> it = listaEdificios.iterator();
       String linea = "____________________________________________________";
       String tipoEdific = "";
       float superficieGlobal = 0F;
       while(it.hasNext())
       {
         Edificio tmpObjEdif = it.next();
         if(tmpObjEdif instanceof PoliDeportivo)
         {
           tipoEdific = "\t\tTipo: Polideportivo";
         }
         if(tmpObjEdif instanceof EdificioDeOficinas)
         {
           tipoEdific = "\t     Tipo: Edificio de oficinas";
         }
         superficieGlobal = superficieGlobal + tmpObjEdif.getSuperficieEdificio();
         System.out.println(tipoEdific + "\n" + linea + "\n" + tmpObjEdif.toString() + "\n" + linea);
       }
       System.out.println("Total de construcciones en la lista: " + listaEdificios.size() + "\nSuperficie global de las " + listaEdificios.size() + " construcciones: " +
       superficieGlobal + " m²" + "\nFin de la lista.");
    }
}

También adjunto un archivo.rar con este ejercicio.

Gracias por observar este ejercicio.

Saludos!
« Última modificación: 22 de Septiembre 2014, 21:56 por Sniper »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio! entrega CU00697B Ventajas de usar una interface en java
« Respuesta #1 en: 23 de Septiembre 2014, 10:22 »
Hola Sniper, creo que llegas al final del curso Java por lo que más abajo te haré algunos comentarios además de los propios del ejercicio en sí. Este ejercicio en líneas generales lo veo bien, sólo te haré comentarios por si te pueden ser útiles para reflexionar y mejorar.

En la respuesta a la pregunta, donde indicas "esto es lo que podríamos llamar "herencia múltiple", la respuesta la veo correcta pero para expresarlo más claramente veo preferible escribir: "esto es un tipo de relación que se asemeja a la herencia múltiple" (para dejar claro que en Java no existe la herencia múltiple como tal, pero sí algo que se asemeja a la herencia múltiple).

La interface InstalacionDeportiva: código conforme.

La interface Edificio: código conforme.

La clase polideportivo: querrás decir ancho, setAncho, etc. porque hancho, setHancho ¿?

En el método getSuperficieEdificio has escrito return (largo * ancho * altura) * 6; ... supongo que esto lo pones como ejemplo de fórmula que podría aplicarse, pero sin haberle prestado atención, ya que un largo por ancho por altura devuelve un volumen, no una superficie. Más lógico hubiera sido largo * ancho (superficie de un rectángulo), pero esto no era el objetivo del ejercicio...

La clase de test:

Donde has escrito

       InstalacionDeportiva poliDeportivo1 = new PoliDeportivo("Felix Sanchez", "100 mts con ballas", 48F, 28F, 50F);
       Edificio poliDeportivo2 = new PoliDeportivo("Estadio Quisqueya", "Baseball", 57F, 32.7F, 60F);
       PoliDeportivo poliDeportivo3 = new PoliDeportivo("Club san carlos", "Basketball", 46F, 33F, 50.4F);
       Edificio edificioDeOficinas1 = new EdificioDeOficinas(20, 39.5F, 31F, 55F);
       EdificioDeOficinas edificioDeOficinas2 = new EdificioDeOficinas(35, 56F, 37.3F, 57.9F);

Lo más adecuado hubiera sido:

       Edificio poliDeportivo1 = new PoliDeportivo("Felix Sanchez", "100 mts con ballas", 48F, 28F, 50F);
       Edificio poliDeportivo2 = new PoliDeportivo("Estadio Quisqueya", "Baseball", 57F, 32.7F, 60F);
       Edificio poliDeportivo3 = new PoliDeportivo("Club san carlos", "Basketball", 46F, 33F, 50.4F);
       Edificio edificioDeOficinas1 = new EdificioDeOficinas(20, 39.5F, 31F, 55F);
       Edificio edificioDeOficinas2 = new EdificioDeOficinas(35, 56F, 37.3F, 57.9F);

Así es como le sacas partido al polimorfismo. Por los comentarios creo que lo tienes claro, pero conviene aclararlo por si hay personas que lean o revisen el ejercicio y esto les lleve a dudas.

El resto del código poco más que comentar.

En relación al final del curso, creo que puedes estar orgulloso de haber mantenido la constancia para llevar adelante un curso de estas características. También has tenido la suerte de tener moderadores y compañeros que te han dado su apoyo, pero el trabajo y el mérito es tuyo, así que enhorabuena. Por otro lado, por parte de los responsables de la web tenemos que agradecer tu actitud de colaboración, por ejemplo este mensaje de hace un par de meses: https://www.aprenderaprogramar.com/foros/index.php?topic=952.0

También tu algoritmo while(estesVivo) nos ha parecido de lo más acertado... esperamos que tú nos recuerdes al equipo de la web y al resto de personas que han colaborado dándote apoyo conforme dice este algoritmo tuyo. De la misma forma que le hemos planteado a otras personas desde el equipo de moderadores, te planteamos que continúes participando del foro ahora como profesor o tutor de apoyo para personas que se están iniciando, o simplemente para seguir hablando de programación y formación en programación. Con esta línea de trabajo por parte del equipo de la web tratamos de dejar puertas abiertas con vistas al futuro a las personas que destacan por su actitud de colaboración, cosa que sin duda has hecho. Saludos cordiales.

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00697B Ventajas de usar una interface en java
« Respuesta #2 en: 23 de Septiembre 2014, 23:03 »
 Hola Mario!
Gracias por verificar y comentar este ejercicio como de costumbre al igual que los demás moderadores y compañeros del foro.

En cuanto a tus comentarios sobre el ejercicio:

Citar
La clase polideportivo: querrás decir ancho, setAncho, etc. porque hancho, setHancho ¿?
Por si acaso no hay algún foro sobre la buena ortografía en esta web?? creo que me vendría muy bien  ;D  ;D (reforzare ese punto  ;)).

Citar
En el método getSuperficieEdificio has escrito return (largo * ancho * altura) * 6; ... supongo que esto lo pones como ejemplo de fórmula que podría aplicarse, pero sin haberle prestado atención, ya que un largo por ancho por altura devuelve un volumen, no una superficie. Más lógico hubiera sido largo * ancho (superficie de un rectángulo), pero esto no era el objetivo del ejercicio...
En realidad es como dices, es un ejemplo de formula.

Citar
La clase de test:

Donde has escrito

       InstalacionDeportiva poliDeportivo1 = new PoliDeportivo("Felix Sanchez", "100 mts con ballas", 48F, 28F, 50F);
       Edificio poliDeportivo2 = new PoliDeportivo("Estadio Quisqueya", "Baseball", 57F, 32.7F, 60F);
       PoliDeportivo poliDeportivo3 = new PoliDeportivo("Club san carlos", "Basketball", 46F, 33F, 50.4F);
       Edificio edificioDeOficinas1 = new EdificioDeOficinas(20, 39.5F, 31F, 55F);
       EdificioDeOficinas edificioDeOficinas2 = new EdificioDeOficinas(35, 56F, 37.3F, 57.9F);

Citar
Lo más adecuado hubiera sido:

       Edificio poliDeportivo1 = new PoliDeportivo("Felix Sanchez", "100 mts con ballas", 48F, 28F, 50F);
       Edificio poliDeportivo2 = new PoliDeportivo("Estadio Quisqueya", "Baseball", 57F, 32.7F, 60F);
       Edificio poliDeportivo3 = new PoliDeportivo("Club san carlos", "Basketball", 46F, 33F, 50.4F);
       Edificio edificioDeOficinas1 = new EdificioDeOficinas(20, 39.5F, 31F, 55F);
       Edificio edificioDeOficinas2 = new EdificioDeOficinas(35, 56F, 37.3F, 57.9F);

Totalmente de acuerdo! Creo que me falto detallar en el comentario el porque use varios tipos dinámicos en vez de usar solo el tipo Edificio para cada objeto, aun estando conciente de que la forma mas correcta era como bien dices, aprovechando las ventajas del polimorfismo. Mi intención fue mostrar que cada instancia de clase puede ser declarada del tipo de su super clase, o del tipo de una interface implementada por su super clase, o bien de su propio tipo.

En cuanto a tu comentario a parte de lo que es la observación del ejercicio:
Citar
En relación al final del curso, creo que puedes estar orgulloso de haber mantenido la constancia para llevar adelante un curso de estas características. También has tenido la suerte de tener moderadores y compañeros que te han dado su apoyo, pero el trabajo y el mérito es tuyo, así que enhorabuena. Por otro lado, por parte de los responsables de la web tenemos que agradecer tu actitud de colaboración, por ejemplo este mensaje de hace un par de meses: https://www.aprenderaprogramar.com/foros/index.php?topic=952.0

También tu algoritmo while(estesVivo) nos ha parecido de lo más acertado... esperamos que tú nos recuerdes al equipo de la web y al resto de personas que han colaborado dándote apoyo conforme dice este algoritmo tuyo. De la misma forma que le hemos planteado a otras personas desde el equipo de moderadores, te planteamos que continúes participando del foro ahora como profesor o tutor de apoyo para personas que se están iniciando, o simplemente para seguir hablando de programación y formación en programación. Con esta línea de trabajo por parte del equipo de la web tratamos de dejar puertas abiertas con vistas al futuro a las personas que destacan por su actitud de colaboración, cosa que sin duda has hecho. Saludos cordiales.

Mas que estar orgulloso de mi, me siento orgulloso de pertenecer y formar parte de esta familia, que para mi somos todos los que de una forma u otra estamos involucrados en que aprendiendoaprogramar.com sea posible.

Muy de acuerdo en que el trabajo es mio, puesto que si yo como persona, no trabajo en superarme, nadie lo hará por mi, nadie lo hará por TI. Cada persona debe de progresar por su propia determinación y esfuerzo. En cuanto al merito yo diría que lo puedo dividir en dos, 50% para mi por echarle ganas y llegar asta el "final"  y 50% para ti y todos los demás moderadores y compañeros alumnos que me apoyaron hasta este punto, para todos 1000 gracias :) .

Aun estoy vivo! por tanto continuare con la filosofía de mi algoritmo de aprender, ayudar y enseñar, para mi sera un privilegio continuar colaborando en el foro dando apoyo en base a mi nivel de conocimiento a los que estén comenzando, de la misma forma que yo lo recibí (o aun recibo, porque esto continua...)

Sin nada mas que comentar, muchas gracias a todos y aquí continuamos.

Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Hugo_Rod

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Ejercicio! entrega CU00697B Ventajas de usar una interface en java
« Respuesta #3 en: 09 de Octubre 2014, 03:46 »
Saludos Amigos, quiero salir de una duda, en el ejercicio planteado dice textualmente "Definir dos interfaces y una clase que implemente ambas interfaces" y tal como veo la solución propuesta por Sniper existen dos clases que implementan una o ambas, ¿es un problema de interpretación del requerimiento?
los felicito por su sitio, muy bien estructurado.

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00697B Ventajas de usar una interface en java
« Respuesta #4 en: 09 de Octubre 2014, 17:27 »
 Hola Hugo_Rod!

Creo que es como dices, el problema para interpretar cuantas clases se requieren usar para realzar este ejercicio podría surgir dependiendo de como interpretes lo que requiere el enunciado de este ejercicio. Al leer esto:
Citar
Definir dos interfaces y una clase que implemente ambas interfaces para representar la situación
anterior.
se interpreta que el ejercicio requiere solo de 2 interfaces + una clase concreta = 3 clases
(+ una clase con el método main = 4 clases).

Si analizamos el enunciado del ejercicio completo, se pueden identificar las siguientes clases
(resaltadas en color rojo) de las que debe disponer este ejercicio:
Citar
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.

Si a estas 4 le sumamos otra clase mas (que seria la del método main) obtendríamos las 5 clases que encuentras en la solución que eh propuesto.

Detalles sobre el esquema de clases: Por una parte tenemos la interface InstalacionDeportiva y la interface Edificio y por otra parte tenemos las clases concretas PoliDeportivo, EdificioDeOficinas y la clase concreta con el metodo main TestSemejansaHerenciaMult.

La clase poliDeportivo implementa las dos interfaces, por tanto, toda instancia de la clase poliDeportivo sera a su vez de tres tipos (PoliDeportivo, InstalacionDeportiva y Edificio)

La clase EdificioDeOficinas solo implementa a la interface Edificio, por tanto, toda instancia de la clase EdificioDeOficinas sera a su vez de dos tipos (EdificioDeOficinas y Edificio). Esta clase no puede ser del tipo InstalacionDeportiva, puesto que entre estas no hay una relación directa o indirecta.

Otra cosa fuera si la clase EdificioDeOficinas heredara (extends) de la clase PoliDeportivo, de ser así esta clase "heredaría" de forma directa el tipo de PoliDeportivo y de forma indirecta el tipo de InstalacionDeportiva.

No se si me he explicado correctamente referente a tu duda, de no ser así me gustaría que me detalles mas sobre esta para poder ayudarte.

Nota: Toda instancia de clase es a su vez del tipo "Object" puesto que todas las clases heredan de la clase del api de java Object.

while(true)
{
  System.out.println("Saludos!  :)");
}
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Hugo_Rod

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Ejercicio! entrega CU00697B Ventajas de usar una interface en java
« Respuesta #5 en: 09 de Octubre 2014, 18:11 »
Hola Sniper, inicialmente intenté una solución apegada al enunciado, sin embargo la restricción de tener una sola clase que implementara las interfaces y a la vez incluyera los tipos polideportivos y oficinas no resultaba factible, de manera que al ver tu solución concluí que es lo correcto. Muy buena descripción por cierto, 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".