V1#

Punto 1: Clases, Objetos y Pilares de la POO#

Objetivo: Crear una aplicación simple que ilustre los cuatro pilares de la POO: abstracción, encapsulamiento, herencia y polimorfismo. El ejemplo debe estar relacionado con una tienda de libros.

Requerimientos:

  • Crea una clase o interfaz Producto que represente los atributos básicos de un producto (nombre, precio, agrega uno más).

  • Crea tres subclases Libro, Revista, Video que hereden de Producto y agregue atributos específicos como autor, número de páginas, editorial, volumen, etc. En total cada clase debe tener 2 atributos adicionales.

  • Implementa los conceptos de encapsulamiento en ambas clases (usa private para los atributos y métodos getters y setters).

  • Usa el polimorfismo en un método mostrarInfo() que se defina en Producto y sea sobrescrito en Libro para mostrar detalles adicionales.

Indicaciones adicionales:

  • Explica cómo tu código cumple con los cuatro pilares de la POO.

  • Implementa un método main o una clase de prueba en donde crees instancias de Producto y Libro, y utilices polimorfismo para mostrar la información.

Diagrama UML: Dibuja el diagrama UML de clases que muestre la relación entre Producto, Libro, Revista. 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
abstract class Producto{
  private String nombre;
  private double precio;
  private String tipo;

  public Producto(String nombre, double precio, String tipo){
    this.nombre = nombre;
    this.precio = precio;
    this.tipo = tipo;
  }

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

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

  public void setTipo(String tipo){
    this.tipo = tipo;
  }
  public String getTipo(){return tipo;}

  public abstract void MostrarInformacion();
}

class Libro extends Producto{
  private String autor;
  private int no_paginas;

  public Libro(String nombre, double precio, String autor, int no_paginas){
    super(nombre, precio, "Libro");
    this.autor = autor;
    this.no_paginas = no_paginas;
  }

  public void setAutor(String autor){
    this.autor = autor;
  }
  public String getAutor(){
    return autor;
  }

  public void setNoPages(int no_paginas){
    this.no_paginas = no_paginas;
  }
  public int getNoPages(){
    return no_paginas;
  }

  @Override
  public void MostrarInformacion(){
    System.out.print("""
      El producto es de tipo %s, el nombre es  %s y cuesta %.1f.
      El %s es del autor es %s y el libro tiene %d páginas.
      """.formatted(getTipo(), getNombre(), getPrecio(),
                    getTipo(), autor, no_paginas));
  };
}

class Video extends Producto{
  private double duracion;
  private String formato;

  public Video(String nombre, double precio, String formato, double duracion){
    super(nombre, precio, "Video");
    this.duracion = duracion;
    this.formato = formato;
  }

  public void setDuracion(double duracion){
    this.duracion = duracion;
  }
  public double getDuracion(){
    return duracion;
  }

  public void setFormato(String formato){
    this.formato = formato;
  }
  public String getFormato(){
    return formato;
  }

  @Override
  public void MostrarInformacion(){
    System.out.print("""
      El producto es de tipo %s, el nombre es  %s y cuesta %.1f.
      El %s dura %.1f minutos y esta en formato %s
      """.formatted(getTipo(), getNombre(), getPrecio(),
                    getTipo(), duracion, formato));
  };
}

class Revista extends Producto{
  private int volumen;
  private String editorial;

  public Revista(String nombre, double precio, String editorial, int volumen){
    super(nombre, precio, "Revista");
    this.editorial = editorial;
    this.volumen = volumen;
  }

  public void setVolumen(int volumen){
    this.volumen = volumen;
  }
  public int getVolumen(){
    return volumen;
  }

  public void setEditorial(String editorial){
    this.editorial = editorial;
  }
  public String getEditorial(){
    return editorial;
  }

  @Override
  public void MostrarInformacion(){
    System.out.print("""
      El producto es de tipo %s, el nombre es  %s y cuesta %.1f.
      La %s es de la editorial %s y es el volumen %d.
      """.formatted(getTipo(), getNombre(), getPrecio(),
           getTipo(), editorial, volumen));
  };
}

Clase de Prueba#

Hide code cell content
class TestPunto1{
  public static void main(String[] args){
    Libro HarryPoter = new Libro("Harry Potter", 150000, "J. K. Rowling", 223);
    HarryPoter.MostrarInformacion();

    Video HarryPoterMovie = new Video("Harry Potter", 20000, "MP4", 152);
    HarryPoterMovie.MostrarInformacion();

    Revista Vogue = new Revista("Vogue", 30000, "Vogue", 1);
    Vogue.MostrarInformacion();
  }
}
new TestPunto1().main(null);
El producto es de tipo Libro, el nombre es  Harry Potter y cuesta 150000.0.
El Libro es del autor es J. K. Rowling y el libro tiene 223 páginas.
El producto es de tipo Video, el nombre es  Harry Potter y cuesta 20000.0.
El Video dura 152.0 minutos y esta en formato MP4
El producto es de tipo Revista, el nombre es  Vogue y cuesta 30000.0.
La Revista es de la editorial Vogue y es el volumen 1.

Diagrama UML de clases#

Diagrama UML

Punto 2: Diagramas UML y Aplicación Completa#

Objetivo: Desarrollar una solución completa para un sistema que gestione una flota de vehículos utilizando herencia e interfaces. Luego, realizar el diagrama UML de clases correspondiente.

Requerimientos:

  • Crea una clase Vehiculo con los atributos marca, modelo, y año.

  • Crea dos subclases: Auto y Moto. Auto tiene atributos adicionales como numeroDePuertas, y Moto tiene cilindrada.

  • Crea una interfaz Conducible que tenga el método conducir(). Tanto Auto como Moto deben implementar esta interfaz.

  • En el método main, crea instancias de Auto y Moto y utiliza polimorfismo para llamar al método conducir().

Diagrama UML: Dibuja el diagrama UML de clases que muestre la relación entre Vehiculo, Auto, Moto, y la interfaz Conducible. Asegúrate de incluir las clases, atributos, métodos, y las relaciones de herencia y uso de la interfaz.

Solución#

Clases e Interfaces#

Hide code cell content
class Vehiculo {
  public String marca;
  public String modelo;
  public int año;

  public static void main (String[] args){
    Auto chevrolet = new Auto();
    chevrolet.marca = "Chevrolet";
    chevrolet.modelo = "CRUZE";
    chevrolet.año = 2015;
    chevrolet.numeroDePuertas = 2;
    chevrolet.conducir();
    
    
    Moto pulsar200 = new Moto();
    pulsar200.marca = "Pulsar";
    pulsar200.modelo = "NS";
    pulsar200.año = 2020;
    pulsar200.cilindrada = 200;
    pulsar200.conducir();
  }
}

interface Conducible{
  public void conducir();
}

class Auto extends Vehiculo implements Conducible{
  public int numeroDePuertas;

  @Override
  public void conducir(){System.out.println("Conduciendo carro...");};
}

class Moto extends Vehiculo implements Conducible{
  public int cilindrada;

  @Override
  public void conducir(){System.out.println("Conduciendo moto...");};
}

Prueba de Clase#

Hide code cell content
new Vehiculo().main(null);
Conduciendo carro...
Conduciendo moto...

Diagrama UML de Clases#

Diagrama de clases 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
class Animal{
  public int age;
  public String gender;

  public boolean isMammal(){ return false;};
  public String mate(){ return "single";};
}

class Duck extends Animal{
  public String beakColr = "Yellow";

  public void Swim(){System.out.println("Swimming");};
  public void quack(){System.out.println("quack");};
} 

class Fish extends Animal{
  private int sizeInFt;
  private boolean canEat;
  
  private void Swim(){System.out.println("Swimming");};
}


class Zebra extends Animal{
  public boolean is_wild;
  
  public void run(){System.out.println("running");};
  
  @Override
  public boolean isMammal(){ return true;};

  @Override
  public String mate(){ return "divorced";};
}

Pruebla de Clase#

Hide code cell content
public class TestAnimals{
  public static void main(String[] args){
    Duck pato = new Duck();
    pato.quack();
    System.out.print("""
        Is mammal? %b
        Has a mate? %s
        Beak color: %s
        """.formatted(pato.isMammal(),pato.mate(), pato.beakColr));

    Fish pescado = new Fish();
    //pescado.Swim(); // no funciona porque es privado
    System.out.print("""
        Is mammal? %b
        Has a mate? %s
          """.formatted(pescado.isMammal(), pescado.mate()));
    //System.out.println("Can eat? "+pescado.canEat); // No funciona porque es privado, se necesitaria un get

    Zebra zebra = new Zebra();
    zebra.is_wild = true; // como es publico puedo darle un valor sin usar setter
    System.out.print("""
        Is mammal? %b
        Has a mate? %s
        Is wild? %b
          """.formatted(zebra.isMammal(), zebra.mate(), zebra.is_wild));
  }
}

new TestAnimals().main(null);
quack
Is mammal? false
Has a mate? single
Beak color: Yellow
Is mammal? false
Has a mate? single
Is mammal? true
Has a mate? divorced
Is wild? true