Semana 7 - Actividad Práctica: Implementación de Herencia
Objetivo
Implementar un sistema de herencia en Java aplicando los conceptos aprendidos en clase, utilizando control de versiones con Git y GitHub.
Instrucciones
Paso 1: Configuración del Repositorio
- Hacer Fork del Repositorio Base
- Accede al repositorio:
https://github.com/jfinfocesde/act_b1_s7.git - Haz clic en el botón "Fork" en la esquina superior derecha
- Selecciona tu cuenta personal como destino del fork
-
Espera a que se complete el proceso de fork
-
Clonar tu Fork Localmente
git clone https://github.com/TU_USUARIO/act_b1_s7.git cd act_b1_s7 -
Configurar Información Personal
- Abre el archivo
info.jsonen la raíz del proyecto - Completa la información solicitada:
{
"identificacion": "1234567890",
"nombres": "Tu Nombre Completo",
"apellidos": "Tus Apellidos Completos",
"grupo": "b1-martes"
}
Paso 2: Desarrollo de la Actividad
Implementar el Sistema de Tienda de Productos
Basándote en el ejemplo de empleados visto en clase, debes crear un sistema de tienda con las siguientes características:
🏪 Lógica de Negocio Detallada
Clase Padre: Producto
Atributos protegidos:
String nombre- Nombre del productodouble precioBase- Precio base sin impuestos ni descuentosString codigo- Código único del producto (formato: "PROD-XXXX")int cantidadStock- Cantidad disponible en inventarioString categoria- Categoría general del productoboolean activo- Si el producto está activo para venta
Constructor:
public Producto(String nombre, double precioBase, String codigo,
int cantidadStock, String categoria)
Métodos obligatorios:
-
Getters y Setters con validaciones:
setPrecioBase(): Solo acepta valores > 0setCantidadStock(): Solo acepta valores >= 0setCodigo(): Debe seguir formato "PROD-XXXX"
-
Lógica de negocio base:
public double calcularPrecioFinal() { // TODO: Calcular precio base + IVA (19%) // Retornar el precio base multiplicado por 1.19 } public boolean hayStock(int cantidad) { // TODO: Verificar si hay suficiente stock disponible // Comprobar que cantidadStock >= cantidad Y que el producto esté activo // Retornar true si ambas condiciones se cumplen, false en caso contrario } public void vender(int cantidad) { // TODO: Implementar lógica de venta // 1. Verificar si hay suficiente stock usando hayStock() // 2. Si hay stock: reducir cantidadStock en la cantidad vendida // 3. Mostrar mensaje "Venta exitosa: [cantidad] unidades de [nombre]" // 4. Si no hay stock: mostrar mensaje "Error: Stock insuficiente" } public void reabastecer(int cantidad) { // TODO: Aumentar el stock del producto // 1. Sumar la cantidad al cantidadStock actual // 2. Mostrar mensaje "Reabastecimiento exitoso: +[cantidad] unidades de [nombre]" } public double calcularDescuento() { // TODO: Retornar descuento base // La clase padre no tiene descuentos, retornar 0.0 }
Clase Hija: ProductoElectronico
Atributos adicionales:
int garantiaMeses- Meses de garantíaString marca- Marca del productodouble voltaje- Voltaje de operaciónboolean esImportado- Si es producto importado
Lógica de negocio específica:
-
Método específico
calcularPrecioElectronico():public double calcularPrecioElectronico() { // TODO: Calcular precio final para productos electrónicos // 1. Obtener precio con IVA usando calcularPrecioFinal() // 2. Si esImportado es true: agregar impuesto adicional del 5% sobre precioBase // 3. Calcular descuento usando calcularDescuentoGarantia() // 4. Aplicar descuento: precio - (precio * descuento) // 5. Retornar el precio final calculado } -
Método específico
calcularDescuentoGarantia():public double calcularDescuentoGarantia() { // TODO: Calcular descuento basado en meses de garantía // Si garantiaMeses >= 24: retornar 0.10 (10% descuento) // Si garantiaMeses >= 12: retornar 0.05 (5% descuento) // En otros casos: retornar 0.0 (sin descuento) } -
Métodos específicos:
public boolean esGarantiaExtendida() { // TODO: Verificar si la garantía es extendida // Retornar true si garantiaMeses > 12, false en caso contrario } public double calcularCostoGarantia() { // TODO: Calcular costo de la garantía // Fórmula: precioBase * 0.02 * garantiaMeses // (2% del precio base por cada mes de garantía) } public boolean esCompatibleVoltaje(double voltajeLocal) { // TODO: Verificar compatibilidad de voltaje // Calcular diferencia absoluta entre voltaje y voltajeLocal // Retornar true si la diferencia es <= 10% del voltajeLocal // Usar Math.abs() para valor absoluto }
Clase Hija: ProductoAlimenticio
Atributos adicionales:
boolean refrigerado- Si requiere refrigeraciónString lote- Número de lote de producciónint diasParaVencer- Días restantes para vencimiento
Lógica de negocio específica:
-
Método específico
calcularPrecioAlimenticio():public double calcularPrecioAlimenticio() { // TODO: Calcular precio final para productos alimenticios // 1. Obtener precio con IVA usando calcularPrecioFinal() // 2. Si refrigerado es true: agregar costo adicional del 8% sobre precioBase // 3. Calcular descuento usando calcularDescuentoVencimiento() // 4. Aplicar descuento: precio - (precio * descuento) // 5. Retornar el precio final calculado } -
Método específico
calcularDescuentoVencimiento():public double calcularDescuentoVencimiento() { // TODO: Calcular descuento basado en días para vencer // Si diasParaVencer <= 3: retornar 0.50 (50% descuento) // Si diasParaVencer <= 7: retornar 0.30 (30% descuento) // Si diasParaVencer <= 15: retornar 0.15 (15% descuento) // En otros casos: retornar 0.0 (sin descuento) } -
Métodos específicos:
public boolean estaProximoAVencer() { // TODO: Verificar si el producto está próximo a vencer // Retornar true si diasParaVencer <= 7, false en caso contrario } public boolean estaVencido() { // TODO: Verificar si el producto está vencido // Retornar true si diasParaVencer <= 0, false en caso contrario } public String obtenerEstadoFrescura() { // TODO: Determinar el estado de frescura del producto // Si estaVencido(): retornar "VENCIDO" // Si diasParaVencer <= 3: retornar "URGENTE" // Si diasParaVencer <= 7: retornar "PRÓXIMO A VENCER" // Si diasParaVencer <= 15: retornar "CONSUMIR PRONTO" // En otros casos: retornar "FRESCO" } public double calcularPerdidaPorVencimiento() { // TODO: Calcular pérdida económica por vencimiento // Si estaVencido(): retornar precioBase * cantidadStock // En otros casos: retornar 0.0 }
Clase de Prueba: SistemaTienda
Funcionalidades a implementar:
- Crear inventario diverso:
// Crear productos electrónicos ProductoElectronico laptop = new ProductoElectronico(...); ProductoElectronico celular = new ProductoElectronico(...); // Crear productos alimenticios ProductoAlimenticio leche = new ProductoAlimenticio(...); ProductoAlimenticio pan = new ProductoAlimenticio(...);
📋 Casos de Prueba Obligatorios
-
Producto Electrónico:
- Laptop importada, 24 meses garantía, 110V
- Precio base: $2,500,000
- Stock: 5 unidades
-
Producto Alimenticio:
- Leche refrigerada, 5 días para vencer
- Precio base: $4,500
- Stock: 20 unidades
-
Operaciones a probar:
- Crear objetos de cada tipo por separado
- Venta exitosa y fallida por falta de stock
- Cálculo de precios usando métodos específicos de cada clase
- Reabastecimiento de inventario
- Verificación de compatibilidad de voltaje
- Comparación entre precio base y precios específicos
- Demostrar funcionalidades únicas de cada tipo