Skip to content

01 - Ejercicio 1. Figuras de Superhéroes.

Práctica con clases básicas y composición de clases

Figuras de Superhéroes

Se pide realizar una aplicación para una empresa que vende figuras de superhéroes. Para ello, tendrá que modelar todos los datos relativos a estas figuras. Así pues, se pide que programe las siguientes clases:

UML

Clase Superhéroe

Esta clase definirá las características de un superhéroe.

Propiedades

Sus propiedades serán:

  • Nombre (nombre del superhéroe)
  • Descripción (cadena para describir brevemente su aspecto)
  • Capa (booleano que indica si el superhéroe lleva o no capa)

Constructores

Haga un constructor con parámetros que reciba solo el nombre del superhéroe. La descripción se inicializará a vacío (cadena vacía) y la capa se inicializará al valor false (sin capa)

Métodos get y set

Programe los get y set para cada propiedad de la clase.

Método toString

Programe el método toString de forma que devuelva una cadena con todas sus propiedades.

Clase Dimensión

Define un grupo de medidas de un objeto.

Propiedades

Contiene las siguientes propiedades (todas ellas double):

  • Alto. Medida correspondiente al alto del objeto.
  • Ancho. Medida correspondiente al ancho del objeto.
  • Profundidad. Medida correspondiente a la profundidad del objeto.

Constructores

Haga un constructor sin parámetros que inicialice todas las propiedades a 0.

Haga un constructor que reciba como parámetro un alto, un ancho y una profundidad y asigne los valores a sus respectivas propiedades.

Métodos get y set

Programe los get y set para cada propiedad.

Métodos de cálculo

Programe un método llamado getVolumen() que devuelva el volumen máximo que ocuparía el objeto (alto x ancho x profundidad)

Método toString

Programe el método toString de forma que devuelva una cadena con el alto, ancho, profundidad y volumen máximo del objeto.

Clase Figura

Esta clase representará una figura de un superhéroe.

Propiedades

  • Código. Cada figura tiene un código identificativo formado por letras y números. Dos figuras distintas no tendrán el mismo código.
  • Precio. Un double con el precio de la figura.

Además, puesto que la figura representa a un superhéroe, será necesario que la clase figura contenga un objeto de la clase Superhéroe que describa las características de este.

Por otro lado, para definir las dimensiones de la figura, la clase Figura contendrá un objeto de la clase Dimensión

  • Un objeto dimensiones de la clase Dimensión que defina las dimensiones del figura.
  • Un objeto superhéroe de la clase Superhéroe que defina las características del superhéroe representado.

Constructores

Programe un constructor que reciba como parámetro el código identificativo de la figura, su precio, un objeto Dimensión, un objeto Superhéroe. Estos valores se asignarán a cada propiedad.

Métodos set y get

Programe un set para cada propiedad (código, precio, superhéroe y dimensiones). Igualmente un get para cada propiedad.

Método toString

Programe el método toString de forma que devuelva una cadena con todas las características de la figura.

Método modificador adicional

Programe un método subirPrecio(double cantidad) que reciba una cantidad de dinero. Este método subirá el precio actual de la figura en la cantidad indicada como parámetro.

Clase Colección

La empresa vende a veces colecciones de figuras, que básicamente son conjuntos de figuras con una temática relacionada. Por ejemplo una colección “El Hombre Murciélago” que consta de una serie de figuras relacionadas con Batman, o una colección “Marvel”, con figuras de superhéroes de Marvel, etc...

Propiedades

Las colecciones estarán descritas por la clase Colección, que tiene las siguientes propiedades:

  • nombreColeccion , que será el nombre de la colección (“El Hombre Murciélago”, “Marvel”, etc.)
  • Un objeto listaFiguras , que será un ArrayList que contendrá las distintas figuras que forman la colección.

Constructor

Programe un constructor que reciba como parámetro el nombre de la colección. Este constructor construirá el ArrayList listaFiguras, (que estará vacío inicialmente)

Metodos get y set

Programe un get y set para la propiedad nombreColeccion.

Métodos modificadores

Programe un método añadirFigura(Figura fig), que reciba como parámetro una figura y la añada al listado de figuras de la colección.

Programe un método subirPrecio(double cantidad, String id) que reciba una cantidad de dinero y el identificador de una de las figuras de la colección. El método subirá el precio de dicha figura en la cantidad pasada como parámetro.

Método toString y similares

Programe el método toString, de forma que devuelva una cadena con el listado de todas las figuras de la colección con todas las características de cada uno.

Programe un método conCapa() que devuelva una cadena con el listado de aquellas figuras de la colección que tengan capa.

Otros métodos observadores

Programe un método masValioso() que devuelva la figura que tenga el precio mayor de la colección.

Programe un método getValorColeccion(), que devuelva un double con el precio total de la colección (es la suma de los precios de cada figura de la colección)

Programe un método getVolumenColeccion(), que devuelva un double con el volumen aproximado que ocuparía toda la colección de figuras. Para hacer este cálculo se deben sumar los volúmenes de cada figura, y añadirle al resultado el valor 200.

Programa de prueba

Compruebe el funcionamiento de todas estas clases a través de un programa principal de prueba.

Diagrama UML de Clases en mermaid:

  • Figura → Superheroe (composición 1 a 1)
  • Figura → Dimension (composición 1 a 1)
  • Coleccion → Figura (agregación 1 a muchos, listaFiguras).
classDiagram
    class Superheroe {
        - nombre: String
        - descripcion: String
        - capa: boolean
        + Superheroe(nombre: String)
        + getNombre() String
        + setNombre(nombre: String) void
        + getDescripcion() String
        + setDescripcion(descripcion: String) void
        + isCapa() boolean
        + setCapa(capa: boolean) void
        + toString() String
    }

    class Dimension {
        - alto: double
        - ancho: double
        - profundidad: double
        + Dimension()
        + Dimension(alto: double, ancho: double, profundidad: double)
        + getAlto() double
        + setAlto(alto: double) void
        + getAncho() double
        + setAncho(ancho: double) void
        + getProfundidad() double
        + setProfundidad(profundidad: double) void
        + getVolumen() double
        + toString() String
    }

    class Figura {
        - codigo: String
        - precio: double
        - dimensiones: Dimension
        - superheroe: Superheroe
        + Figura(codigo: String, precio: double, dimensiones: Dimension, superheroe: Superheroe)
        + getCodigo() String
        + setCodigo(codigo: String) void
        + getPrecio() double
        + setPrecio(precio: double) void
        + getDimensiones() Dimension
        + setDimensiones(dimensiones: Dimension) void
        + getSuperheroe() Superheroe
        + setSuperheroe(superheroe: Superheroe) void
        + subirPrecio(cantidad: double) void
        + toString() String
    }

    class Coleccion {
        - nombreColeccion: String
        - listaFiguras: ArrayList~Figura~
        + Coleccion(nombreColeccion: String)
        + getNombreColeccion() String
        + setNombreColeccion(nombre: String) void
        + anadirFigura(fig: Figura) void
        + subirPrecio(cantidad: double, id: String) void
        + toString() String
        + conCapa() String
        + masValioso() Figura
        + getValorColeccion() double
        + getVolumenColeccion() double
    }

    Figura "1" *--> "1" Superheroe : contiene
    Figura "1" *--> "1" Dimension : contiene
    Coleccion "1" o--> "*" Figura : agrupa

Solución propuesta

A continuiación se muestran las clases en Java:

Clase Superhéroe en Java

java
public class Superheroe {
    private String nombre;
    private String descripcion;
    private boolean capa;

    public Superheroe(String nombre) {
        this.nombre = nombre;
        this.descripcion = "";
        this.capa = false;
    }
    
    //Métodos set

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public void setCapa(boolean capa) {
        this.capa = capa;
    }
    
    //Métodos get

    public String getNombre() {
        return nombre;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public boolean isCapa() {
        return capa;
    }

    @Override
    public String toString() {
        return "Superheroe{" + "nombre=" + nombre + ", descripcion=" + descripcion + ", capa=" + capa + '}';
    } 
}

Clase Dimensión en Java

java
public class Dimension {
    private double alto;
    private double ancho;
    private double profundidad;

    public Dimension() {
        this.alto = 0;
        this.ancho = 0;
        this.profundidad = 0;
    }
    
    public Dimension(double alto, double ancho, double profundidad) {
        this.alto = alto;
        this.ancho = ancho;
        this.profundidad = profundidad;
    }
    

    public double getAlto() {
        return alto;
    }

    public void setAlto(double alto) {
        this.alto = alto;
    }

    public double getAncho() {
        return ancho;
    }

    public void setAncho(double ancho) {
        this.ancho = ancho;
    }

    public double getProfundidad() {
        return profundidad;
    }

    public void setProfundidad(double profundidad) {
        this.profundidad = profundidad;
    }

    @Override
    public String toString() {
        return "Dimension{" + "alto=" + alto + ", ancho=" + ancho + ", profundidad=" + profundidad +
                ", volumen=" + getVolumen() + '}';
    }

    
    public double getVolumen() {
        return alto*ancho*profundidad;
    }
}

Clase Figura en Java

java
public class Figura {
    private String codigo;
    private double precio;
    private Superheroe superheroe;
    private Dimension dimensiones;

    public Figura(String codigo, double precio, Superheroe superheroe, Dimension dimensiones) {
        this.codigo = codigo;
        this.precio = precio;
        this.superheroe = superheroe;
        this.dimensiones = dimensiones;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public double getPrecio() {
        return precio;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }

    public Superheroe getSuperheroe() {
        return superheroe;
    }

    public void setSuperheroe(Superheroe superheroe) {
        this.superheroe = superheroe;
    }

    public Dimension getDimensiones() {
        return dimensiones;
    }

    public void setDimensiones(Dimension dimensiones) {
        this.dimensiones = dimensiones;
    }

    @Override
    public String toString() {
        return "Figura:\n" + "codigo=" + codigo + ", precio=" + precio + "\n" + superheroe + "\n" + dimensiones;
    }
    
    public void subirPrecio(double cantidad) {
        precio += cantidad;
    } 
}

Clase Colección en Java

java
import java.util.ArrayList;

public class Coleccion {
    private String nombreColeccion;
    private ArrayList<Figura> listaFiguras = new ArrayList<>();

    public Coleccion(String nombreColeccion) {
        this.nombreColeccion = nombreColeccion;
    }

    public String getNombreColeccion() {
        return nombreColeccion;
    }

    public void setNombreColeccion(String nombreColeccion) {
        this.nombreColeccion = nombreColeccion;
    }
    
    public void añadirFigura(Figura fig){
        listaFiguras.add(fig);
    }
    
    public void subirPrecio(double cantidad, String id) {
        for(Figura f:listaFiguras) {  //for each
            if(f.getCodigo().equals(id)) {
                f.subirPrecio(cantidad);
            }
        }
    }

    @Override
    public String toString() {
        String cadena = "Colección "+nombreColeccion+"\n---------------\n";
        
        for(Figura f:listaFiguras) {
            cadena += f+"\n";
        }
        
        return cadena;
    }
    
    
    public String conCapa() {
        String cadena = "Figuras de superhéroes con capa\n---------------\n";
        for(Figura f:listaFiguras) {
            if(f.getSuperheroe().isCapa()) {
                cadena += f+"\n";
            }
        }
        
        return cadena;
    }
    
    public Figura masValioso() {
        double precioMayor = 0.0;
        Figura fMayor = null;
        
        for(Figura f:listaFiguras) {
            if(f.getPrecio()>precioMayor) {
                precioMayor = f.getPrecio();
                fMayor = f;
            }
        }
        
        return fMayor;
    }
    
    public double getValorColeccion() {
        double valor = 0;
        for(Figura f:listaFiguras) {
            valor += f.getPrecio();
        }
        return valor;
    }
    
    public double getVolumenColeccion() {
        double vol = 0;
        for(Figura f:listaFiguras) {
            vol += f.getDimensiones().getVolumen();
        }
        return vol+200;
    }
}

Clase Principal en Java

java
public class Principal {

    public static void main(String[] args) {
        // TODO code application logic here
        
        Superheroe sup1 = new Superheroe("Spiderman");
        sup1.setNombre("Hombre Araña");
        sup1.setDescripcion("Lanza tela de araña y viste de rojo.");
        
        System.out.println(sup1.getNombre());
        System.out.println(sup1.getDescripcion());
        
        System.out.println(sup1.toString());
        
        Superheroe sup2 = new Superheroe("Batman");
        sup2.setDescripcion("Tiene los poderes de un murciélago.");
        sup2.setCapa(true);
        
        System.out.println(sup2.toString());
        
        Dimension dimPeq = new Dimension();  // alto = 0, ancho = 0, prof = 0
        Dimension dimGra = new Dimension(70,20,20); 
        
        dimPeq.setAlto(20);
        dimPeq.setAncho(5);
        dimPeq.setProfundidad(6);  
        //ahora dimPeq es:   alto = 20, ancho = 5, prof = 6
        
        System.out.println(dimPeq);
        System.out.println(dimGra);
        System.out.println("Volumen de la dimension pequeña: "+dimPeq.getVolumen());
        
        Figura figSpi = new Figura("spid-01",30,sup1,dimPeq);
        
        System.out.println(figSpi.toString());
        figSpi.subirPrecio(10);
        System.out.println(figSpi.toString());
        
        Coleccion col = new Coleccion("Super");
        
        col.añadirFigura(figSpi);
        
        Figura figBat = new Figura("bat-02",50,sup2,dimPeq);
        col.añadirFigura(figBat);
        
        Superheroe sup3 = new Superheroe("Ironman");
        sup3.setDescripcion("Superhéroe con traje de metal capaz de volar");
        Figura figIron = new Figura("iron-03",20,sup3,new Dimension(6,3,4));
        col.añadirFigura(figIron);
        
        System.out.println(col);
        
        System.out.println(col.conCapa());
     
        Figura fMasValiosa = col.masValioso();
        System.out.println("Figura de más valor: "+fMasValiosa);
        
        System.out.println("Valor de la coleccion: "+col.getValorColeccion());
        
        System.out.println("Volumen de la coleccion: "+col.getVolumenColeccion());
    }
}

Publicado bajo la licencia MIT.