V2#

Instrucciones#

El parcial consta de 3 puntos donde deben resolver solo 2 de los 3, el tercero es obligatorio y eligen entre el primer y segundo punto, en ambos deben crear el diagrama UML. Responde a cada uno de manera detallada, implementando la solución solicitada en el lenguaje de programación Java. Asegúrate de utilizar los conceptos solicitados en cada pregunta. En el punto 3, incluye un diagrama UML de la solución que propongas.

Punto 1: Herencia, Clases Abstractas e Interfaces#

Objetivo: Implementar un sistema que simule una biblioteca con diferentes tipos de recursos (libros, revistas, y videos) utilizando herencia, clases abstractas e interfaces.

Requerimientos:

  • Crea una clase abstracta Recurso con atributos titulo y añoPublicacion, y métodos abstractos prestar() y devolver().

  • Implementa tres subclases: Libro, Revista y Video, cada una con atributos y comportamiento específicos (ej: Libro tiene autor, Revista tiene editor, Video tiene duracion).

  • Crea una interfaz Digitalizable con un método descargar(). Implementa esta interfaz en la clase Video.

  • En el método main, crea un arreglo de diferentes recursos y recorre el arreglo usando polimorfismo para prestar y devolver cada recurso.

Indicaciones adicionales:

  • En tu implementación, debes manejar correctamente el uso de clases abstractas e interfaces.

  • Explica cómo el uso de la interfaz Digitalizable permite a Video tener comportamientos adicionales que no tienen las otras subclases.

Diagrama UML: Dibuja el diagrama UML de clases que muestre la relación entre Recurso, Libro, Revista, y Video. Asegúrate de incluir las clases, atributos, métodos, y las relaciones de herencia y uso de la interfaz.

Solución#

Clases#

Hide code cell content
interface Digitalizable{
  public void descargar();
}

abstract class Recurso{
  String titulo;
  int añoPublicacion;
  String tipo;

  public Recurso(String titulo, int añoPublicacion, String tipo){
    this.titulo = titulo;
    this.añoPublicacion = añoPublicacion;
    this.tipo = tipo;
  }

  abstract public void prestar();
  abstract public void devolver(); 
}

class Libro extends Recurso{
  public String autor;
  
  public Libro(String titulo, int añoPublicacion, String autor){
    super(titulo, añoPublicacion, "Libro");
    this.autor = autor;
  }

  @Override
  public void prestar(){
    System.out.print("Prestando %s %s.".formatted(tipo, titulo));
  };
  
  @Override
  public void devolver(){
    System.out.print("Devolviendo %s %s.".formatted(tipo, titulo));
  };
}

class Revista extends Recurso{
  public String editorial;
  
  public Revista(String titulo, int añoPublicacion, String editorial){
    super(titulo, añoPublicacion, "Revista");
    this.editorial = editorial;
  }

  @Override
  public void prestar(){
    System.out.print("Prestando %s %s de la editorial %s.".formatted(tipo, titulo, editorial));
  };
  
  @Override
  public void devolver(){
    System.out.print("Devolviendo %s %s de la editorial %s.".formatted(tipo, titulo, editorial));
  };
}

class Video extends Recurso implements Digitalizable{
  public double duracion;
  
  public Video(String titulo, int añoPublicacion, double duracion){
    super(titulo, añoPublicacion, "Video");
    this.duracion = duracion;
  }

  @Override
  public void prestar(){
    System.out.print("Prestando %s %s con duración %.1f.".formatted(tipo, titulo, duracion));
  };
  
  @Override
  public void devolver(){
    System.out.print("Devolviendo %s %s con duración %.1f.".formatted(tipo, titulo, duracion));
  };

  @Override
  public void descargar(){
    System.out.print("Descargando ".formatted(tipo));
  }
}

Clase de Prueba#

Hide code cell content
public class TestPunto1{
  public static void main(String[] args){
    Libro HarryPotter = new Libro("Harry Potter and the Philosopher's Stone", 1997, "J. K. Rowling");
    HarryPotter.prestar();
    HarryPotter.devolver();
    // System.out.println("");

    Revista SOHO = new Revista("SOHO version 1", 2024, "SOHO");
    SOHO.prestar();
    SOHO.devolver();
    // System.out.println("");

    Video HarryPotterMovie = new Video("Harry Potter and the Sorcerer's Stone.", 2001, 152);
    HarryPotterMovie.prestar();
    HarryPotterMovie.devolver();
    HarryPotterMovie.descargar();
  } 
}

new TestPunto1.main(null);
|   new TestPunto1.main(null);
cannot find symbol
  symbol:   class main

Diagrama UML#

Punto 2: Diagramas UML y Aplicación Completa#

Objetivo:

Desarrollar una solución completa para un sistema que gestione diferentes tipos de electrodomésticos utilizando herencia e interfaces. Luego, realizar el diagrama UML de clases correspondiente.

Requerimientos:

  • Crea una clase Electrodomestico con los atributos marca, modelo y consumoEnergetico.

  • Crea dos subclases: Lavadora y Refrigerador. Lavadora tiene un atributo adicional capacidadCarga, y Refrigerador tiene el atributo volumen.

  • Crea una interfaz Operable que tenga el método encender(). Tanto Lavadora como Refrigerador deben implementar esta interfaz.

  • En el método main, crea instancias de Lavadora y Refrigerador, y utiliza polimorfismo para invocar el método encender().

Diagrama UML:

Dibuja el diagrama UML de clases que muestre la relación entre Electrodomestico, Lavadora, Refrigerador y la interfaz Operable. Asegúrate de incluir las clases, atributos, métodos, y las relaciones de herencia e implementación de la interfaz.

Solución#

Clases e Interfaces#

Hide code cell content
interface Operable{
  public void encender();
}

class Electrodomestico implements Operable{
  String marca;
  String modelo;
  double consumoEnergetico;

  public Electrodomestico(){};
  public Electrodomestico(String marca, String modelo, double consumoEnergetico){
    this.marca = marca;
    this.modelo = modelo;
    this.consumoEnergetico = consumoEnergetico;
  }

  public void encender(){
    System.out.print("El electrodomestico de marca %s, modelo %s, esta ENCENDIDO y tiene un consumo energético de %.0f W.".formatted(marca, modelo, consumoEnergetico));
  };

  public static void main(String[] args){
    Electrodomestico microondas = new Electrodomestico("Electrolux", "EMDO17S3GSLUW", 700);
    microondas.encender();
  
    Refrigerador nevera = new Refrigerador("LG", "334 LT Door", 27.9, 334);
    nevera.encender();
  
    Lavadora lavadora = new Lavadora("Samsung", "WF22R6270AW/CO", 1.5, 22);
    lavadora.encender();
  }
}

class Lavadora extends Electrodomestico{
  int capacidadCarga;

  public Lavadora(String marca, String modelo, double consumoEnergetico, int capacidadCarga){
    super(marca, modelo, consumoEnergetico);
    this.capacidadCarga = capacidadCarga;
  }

  public void encender(){
    System.out.print("La lavadora de marca %s, modelo %s, esta ENCENDIDO. Tiene un consumo energético de %.0f KWh/mes y una capacidad de caga de %d Kg.".formatted(marca, modelo, consumoEnergetico, capacidadCarga));
  };
}

class Refrigerador extends Electrodomestico{
  int volumen;

  public Refrigerador(String marca, String modelo, double consumoEnergetico, int volumen){
    super(marca, modelo, consumoEnergetico);
    this.volumen = volumen;
  }

  public void encender(){
    System.out.print("El refrigerador de marca %s, modelo %s, esta ENCENDIDO. Tiene un consumo energético de %.0f y un volumen de %d m^3.".formatted(marca, modelo, consumoEnergetico, volumen));
  };
}

Prueba#

Hide code cell content
Electrodomestico pruebaElectrodomestico = new Electrodomestico();
pruebaElectrodomestico.main(null);
El electrodomestico de marca Electrolux, modelo EMDO17S3GSLUW, esta ENCENDIDO y tiene un consumo energético de 700 W.
El refrigerador de marca LG, modelo 334 LT Door, esta ENCENDIDO. Tiene un consumo energético de 28 y un volumen de 334 m^3.
La lavadora de marca Samsung, modelo WF22R6270AW/CO, esta ENCENDIDO. Tiene un consumo energético de 2 KWh/mes y una capacidad de caga de 22 Kg.

Diagrama UML#

Punto 3: De Diagrama UML a Código#

Implementen el código del siguiente diagrama UML de clases

Solución#

Clases#

Hide code cell content
import java.util.Date;

class Employee{
  private String name;
  private Date started;

  public Employee(String name, String started){
    this.name = name;
    this.started = new Date(started);
  }

  public void setName(String name){
    this.name = name;
  }

  public void setStarted(String started){
    this.started = new Date(started);
  }
}

class FullTimeEmployee extends Employee{
  private int pensiontier;

  public FullTimeEmployee(String name, String started, int pensiontier){
    super(name, started);
    this.pensiontier = pensiontier;
  };

  public void setPensionTier(int pensiontier){
    this.pensiontier = pensiontier;
  }
}

class PartTimeEmployee extends Employee{
  private int hoursworked;

  public PartTimeEmployee(String name, String started, int hoursworked){
    super(name, started);
    this.hoursworked = hoursworked;
  };

  public void setHoursWorked(int hoursworked){
    this.hoursworked = hoursworked;
  }
}

Clases de Prueba#

Hide code cell content
// probando clases
Employee sebas = new Employee("Sebastian", "05/05/2024");
FullTimeEmployee sebas = new FullTimeEmployee("Sebastian", "05/05/2024", 1);
PartTimeEmployee sebas = new PartTimeEmployee("Sebastian", "05/05/2024", 20);