Café y Código

Herencia y polimorfismo

Desafíos de Herencia

20 jerarquías base + 3 hijas (incluyendo arquitectura de 3 niveles: Interfaz → Padre Abstracto → Clases Hijas) para practicar herencia, sobrescritura y colecciones polimórficas. Cada ejercicio trae su diagrama de clases interactivo.

Ruta canónica: /challenges/inheritance · Progreso guardado como aprende_poo_challenges_v1 en este navegador.

Modal con tarjetas — misma presentación que los ejercicios.

20 jerarquías · clic para expandir diagrama y checklist

1. Personas en un Entorno Educativo

Persona → Estudiante · Docente · Administrativo

Un campus digital necesita un modelo único de persona, con roles que especializan el acceso.

Qué hacer: Implementa la jerarquía. Instancia un estudiante, un docente y un administrativo, y llama al menos un método heredado y uno propio.

UMLJerarquía Persona
Persona
-rut: StringString rutrutrut
-nombre: StringString nombrenombrenombre
-email: StringString emailemailemail
+iniciar_sesion()iniciar_sesion()iniciar_sesion()iniciar_sesion()
extends (herencia)
Estudiante
-matricula: StringString matriculamatriculamatricula
-promedio_notas: doubledouble promedio_notaspromedio_notaspromedio_notas
+inscribir_ramo()inscribir_ramo()inscribir_ramo()inscribir_ramo()
Docente
-codigo_profesor: StringString codigo_profesorcodigo_profesorcodigo_profesor
-departamento: StringString departamentodepartamentodepartamento
+subir_nota()subir_nota()subir_nota()subir_nota()
Administrativo
-cargo: StringString cargocargocargo
-horario_turno: StringString horario_turnohorario_turnohorario_turno
🔍 Clic para ampliar y hacer zoom

2. Envíos y Logística de Paquetes

Envio → EnvioEstandar · EnvioExpress · EnvioInternacional

Una empresa de courier comparte el ciclo de vida del envío, pero cada modalidad tiene reglas distintas.

Qué hacer: Modela la herencia. Crea un arreglo (o lista) de tipo Envio con las tres hijas y recórrelo llamando actualizar_estado().

UMLJerarquía Envio
Envio
-codigo_seguimiento: StringString codigo_seguimientocodigo_seguimientocodigo_seguimiento
-remitente: StringString remitenteremitenteremitente
-destinatario: StringString destinatariodestinatariodestinatario
+actualizar_estado()actualizar_estado()actualizar_estado()actualizar_estado()
extends (herencia)
EnvioEstandar
-dias_habiles_entrega: intint dias_habiles_entregadias_habiles_entregadias_habiles_entrega
EnvioExpress
-garantia_mismo_dia: booleanboolean garantia_mismo_diagarantia_mismo_diagarantia_mismo_dia
-recargo_urgencia: doubledouble recargo_urgenciarecargo_urgenciarecargo_urgencia
EnvioInternacional
-pais_destino: StringString pais_destinopais_destinopais_destino
-impuesto_aduanero: doubledouble impuesto_aduaneroimpuesto_aduaneroimpuesto_aduanero
🔍 Clic para ampliar y hacer zoom

3. Tipos de Cuentas de Usuario / Roles

Usuario → UsuarioInvitado · UsuarioRegistrado · UsuarioAdministrador

El sistema de autenticación comparte credenciales, pero cada rol tiene privilegios distintos.

Qué hacer: Implementa las tres cuentas. El administrador debe poder bloquear a un usuario registrado (simúlalo con un método).

UMLJerarquía Usuario
Usuario
-username: StringString usernameusernameusername
-password: StringString passwordpasswordpassword
-ultimo_acceso: StringString ultimo_accesoultimo_accesoultimo_acceso
+autenticar()autenticar()autenticar()autenticar()
extends (herencia)
UsuarioInvitado
-tiempo_expiracion_sesion: intint tiempo_expiracion_sesiontiempo_expiracion_sesiontiempo_expiracion_sesion
UsuarioRegistrado
-historial_actividad: StringString historial_actividadhistorial_actividadhistorial_actividad
-avatar_url: StringString avatar_urlavatar_urlavatar_url
UsuarioAdministrador
-nivel_acceso: intint nivel_accesonivel_accesonivel_acceso
+bloquear_usuario()bloquear_usuario()bloquear_usuario()bloquear_usuario()
🔍 Clic para ampliar y hacer zoom

4. Bebidas de Cafetería

Bebida → Cafe · Te · JugoNatural

En la barra todas las bebidas se preparan, pero cada receta tiene insumos y pasos extra.

Qué hacer: Sobrescribe preparar() en cada hija (polimorfismo). En Cafe agrega agregar_shot_espresso().

UMLJerarquía Bebida
Bebida
-nombre: StringString nombrenombrenombre
-tamano_ml: intint tamano_mltamano_mltamano_ml
-temperatura: StringString temperaturatemperaturatemperatura
+preparar()preparar()preparar()preparar()
extends (herencia)
Cafe
-tipo_grano: StringString tipo_granotipo_granotipo_grano
-nivel_tueste: StringString nivel_tuestenivel_tuestenivel_tueste
+agregar_shot_espresso()agregar_shot_espresso()agregar_shot_espresso()agregar_shot_espresso()
Te
-variedad_hoja: StringString variedad_hojavariedad_hojavariedad_hoja
-tiempo_infusion: intint tiempo_infusiontiempo_infusiontiempo_infusion
JugoNatural
-fruta_principal: StringString fruta_principalfruta_principalfruta_principal
-tiene_azucar_anadida: booleanboolean tiene_azucar_anadidatiene_azucar_anadidatiene_azucar_anadida
🔍 Clic para ampliar y hacer zoom

5. Planes de Suscripción

Suscripcion → PlanGratuito · PlanIndividual · PlanFamiliar

Una plataforma de streaming cobra distinto según el plan, pero todos se renuevan.

Qué hacer: Implementa renovar() en la base. Cada plan debe imprimir un resumen de beneficios al renovar.

UMLJerarquía Suscripcion
Suscripcion
-id_cliente: StringString id_clienteid_clienteid_cliente
-costo_mensual: doubledouble costo_mensualcosto_mensualcosto_mensual
-estado: StringString estadoestadoestado
+renovar()renovar()renovar()renovar()
extends (herencia)
PlanGratuito
-limite_anuncios_por_hora: intint limite_anuncios_por_horalimite_anuncios_por_horalimite_anuncios_por_hora
PlanIndividual
-calidad_streaming_hd: booleanboolean calidad_streaming_hdcalidad_streaming_hdcalidad_streaming_hd
PlanFamiliar
-max_perfiles_simultaneos: intint max_perfiles_simultaneosmax_perfiles_simultaneosmax_perfiles_simultaneos
-control_parental: booleanboolean control_parentalcontrol_parentalcontrol_parental
🔍 Clic para ampliar y hacer zoom

6. Herramientas de Taller / Construcción

Herramienta → HerramientaManual · HerramientaElectrica · HerramientaMedicion

El inventario del taller comparte nombre y peso, pero el uso cambia si es manual, eléctrica o de medición.

Qué hacer: Llama utilizar() de forma polimórfica. Las hijas con métodos extra (aplicar_fuerza, cambiar_velocidad) deben usarlos al menos una vez.

UMLJerarquía Herramienta
Herramienta
-nombre: StringString nombrenombrenombre
-material: StringString materialmaterialmaterial
-peso_gramos: doubledouble peso_gramospeso_gramospeso_gramos
+utilizar()utilizar()utilizar()utilizar()
extends (herencia)
HerramientaManual
-tipo_mango: StringString tipo_mangotipo_mangotipo_mango
+aplicar_fuerza()aplicar_fuerza()aplicar_fuerza()aplicar_fuerza()
HerramientaElectrica
-voltaje: intint voltajevoltajevoltaje
-consumo_watts: intint consumo_wattsconsumo_wattsconsumo_watts
+cambiar_velocidad()cambiar_velocidad()cambiar_velocidad()cambiar_velocidad()
HerramientaMedicion
-unidad_medida: StringString unidad_medidaunidad_medidaunidad_medida
-margen_error: doubledouble margen_errormargen_errormargen_error
🔍 Clic para ampliar y hacer zoom

7. Animales de un Zoológico / Clínica Veterinaria

Animal → Mamifero · Ave · Reptil

La ficha clínica es común; la biología (pelo, alas, escamas) especializa el cuidado.

Qué hacer: Crea un zoológico (colección de Animal) con un mamífero, un ave y un reptil. Alimenta a todos recorriendo la colección.

UMLJerarquía Animal
Animal
-chip_id: StringString chip_idchip_idchip_id
-especie: StringString especieespecieespecie
-edad: intint edadedadedad
-peso: doubledouble pesopesopeso
+alimentar()alimentar()alimentar()alimentar()
extends (herencia)
Mamifero
-tipo_pelaje: StringString tipo_pelajetipo_pelajetipo_pelaje
-periodo_gestacion: intint periodo_gestacionperiodo_gestacionperiodo_gestacion
Ave
-envergadura_alas: doubledouble envergadura_alasenvergadura_alasenvergadura_alas
-puede_volar: booleanboolean puede_volarpuede_volarpuede_volar
Reptil
-temperatura_corporal_optima: doubledouble temperatura_corporal_optimatemperatura_corporal_optimatemperatura_corporal_optima
-tipo_escama: StringString tipo_escamatipo_escamatipo_escama
🔍 Clic para ampliar y hacer zoom

8. Medios de Comunicación / Canales de Soporte

CanalAtencion → TicketWeb · LlamadaTelefonica · ChatBot

Todos los tickets se cierran igual, pero el origen del caso cambia los datos que se guardan.

Qué hacer: Implementa cerrar_caso() en la base. Instancia un ticket de cada canal y ciérralos.

UMLJerarquía CanalAtencion
CanalAtencion
-id_ticket: StringString id_ticketid_ticketid_ticket
-fecha_creacion: StringString fecha_creacionfecha_creacionfecha_creacion
+cerrar_caso()cerrar_caso()cerrar_caso()cerrar_caso()
extends (herencia)
TicketWeb
-ip_usuario: StringString ip_usuarioip_usuarioip_usuario
-navegador: StringString navegadornavegadornavegador
LlamadaTelefonica
-numero_origen: StringString numero_origennumero_origennumero_origen
-grabacion_llamada_url: StringString grabacion_llamada_urlgrabacion_llamada_urlgrabacion_llamada_url
ChatBot
-intencion_detectada: StringString intencion_detectadaintencion_detectadaintencion_detectada
-transferido_a_humano: booleanboolean transferido_a_humanotransferido_a_humanotransferido_a_humano
🔍 Clic para ampliar y hacer zoom

9. Tipos de Armas en un Videojuego

Arma → ArmaCuerpoACuerpo · ArmaFuego · ArmaMagica

El combate comparte atacar(), pero cada familia de arma tiene mecánicas extra.

Qué hacer: Sobrescribe atacar() en cada hija. Usa bloquear() y recargar() desde el tipo concreto (no solo desde Arma).

UMLJerarquía Arma
Arma
-nombre: StringString nombrenombrenombre
-peso: doubledouble pesopesopeso
-durabilidad: intint durabilidaddurabilidaddurabilidad
+atacar()atacar()atacar()atacar()
extends (herencia)
ArmaCuerpoACuerpo
-filo_ataque: intint filo_ataquefilo_ataquefilo_ataque
+bloquear()bloquear()bloquear()bloquear()
ArmaFuego
-calibre: StringString calibrecalibrecalibre
-capacidad_cargador: intint capacidad_cargadorcapacidad_cargadorcapacidad_cargador
+recargar()recargar()recargar()recargar()
ArmaMagica
-costo_mana: intint costo_manacosto_manacosto_mana
-tipo_elemento: StringString tipo_elementotipo_elementotipo_elemento
🔍 Clic para ampliar y hacer zoom

10. Sensores IoT

Sensor → SensorTemperatura · SensorMovimiento · SensorHumo

Una red de sensores comparte identidad y batería; cada tipo lee un fenómeno distinto.

Qué hacer: Implementa leer_dato() (puedes devolver un número simulado). El de movimiento y el de humo deben usar sus métodos de alerta.

UMLJerarquía Sensor
Sensor
-id_dispositivo: StringString id_dispositivoid_dispositivoid_dispositivo
-ubicacion: StringString ubicacionubicacionubicacion
-bateria_porcentaje: intint bateria_porcentajebateria_porcentajebateria_porcentaje
+leer_dato()leer_dato()leer_dato()leer_dato()
extends (herencia)
SensorTemperatura
-escala_celsius: booleanboolean escala_celsiusescala_celsiusescala_celsius
-rango_maximo: doubledouble rango_maximorango_maximorango_maximo
SensorMovimiento
-rango_vision_metros: doubledouble rango_vision_metrosrango_vision_metrosrango_vision_metros
+detectar_presencia()detectar_presencia()detectar_presencia()detectar_presencia()
SensorHumo
-umbral_alarma_ppm: intint umbral_alarma_ppmumbral_alarma_ppmumbral_alarma_ppm
+activar_sirena()activar_sirena()activar_sirena()activar_sirena()
🔍 Clic para ampliar y hacer zoom

12. Vehículos de Emergencia

VehiculoEmergencia → Ambulancia · CarroBomba · PatrullaPolicial

Patrullas, ambulancias y carros bomba salen de una misma flota operativa.

Qué hacer: Enciende la sirena de los tres vehículos desde una lista de VehiculoEmergencia (polimorfismo).

UMLJerarquía VehiculoEmergencia
VehiculoEmergencia
-patente: StringString patentepatentepatente
-base_operativa: StringString base_operativabase_operativabase_operativa
+encender_sirena()encender_sirena()encender_sirena()encender_sirena()
extends (herencia)
Ambulancia
-equipamiento_uci: booleanboolean equipamiento_uciequipamiento_uciequipamiento_uci
-personal_medico_a_bordo: intint personal_medico_a_bordopersonal_medico_a_bordopersonal_medico_a_bordo
CarroBomba
-capacidad_estanque_agua: doubledouble capacidad_estanque_aguacapacidad_estanque_aguacapacidad_estanque_agua
-largo_escala: doubledouble largo_escalalargo_escalalargo_escala
PatrullaPolicial
-camara_abordo: booleanboolean camara_abordocamara_abordocamara_abordo
-blindaje_nivel: intint blindaje_nivelblindaje_nivelblindaje_nivel
🔍 Clic para ampliar y hacer zoom

13. Tareas en un Gestor de Proyectos

Tarea → BugReport · NuevaCaracteristica · TareaMantenimiento

Un tablero Kanban trata todo como Tarea, pero bugs, features y mantenimiento no se estiman igual.

Qué hacer: Completa una tarea de cada tipo. Imprime título, estado y el dato específico de la hija.

UMLJerarquía Tarea
Tarea
-titulo: StringString titulotitulotitulo
-fecha_limite: StringString fecha_limitefecha_limitefecha_limite
-estado: StringString estadoestadoestado
+completar()completar()completar()completar()
extends (herencia)
BugReport
-severidad: StringString severidadseveridadseveridad
-pasos_para_reproducir: StringString pasos_para_reproducirpasos_para_reproducirpasos_para_reproducir
NuevaCaracteristica
-criterios_aceptacion: StringString criterios_aceptacioncriterios_aceptacioncriterios_aceptacion
-puntos_historia: intint puntos_historiapuntos_historiapuntos_historia
TareaMantenimiento
-sistema_afectado: StringString sistema_afectadosistema_afectadosistema_afectado
-ventana_horaria: StringString ventana_horariaventana_horariaventana_horaria
🔍 Clic para ampliar y hacer zoom

14. Documentos Legales y Comerciales

DocumentoComercial → Factura · Boleta · GuiaDespacho

Factura, boleta y guía de despacho comparten folio y emisor, con campos tributarios distintos.

Qué hacer: Emite un documento de cada tipo y luego anula la factura (el método vive en la clase base).

UMLJerarquía DocumentoComercial
DocumentoComercial
-numero_folio: intint numero_folionumero_folionumero_folio
-fecha_emision: StringString fecha_emisionfecha_emisionfecha_emision
-rut_emisor: StringString rut_emisorrut_emisorrut_emisor
+anular()anular()anular()anular()
extends (herencia)
Factura
-monto_neto: doubledouble monto_netomonto_netomonto_neto
-iva: doubledouble ivaivaiva
-rut_receptor: StringString rut_receptorrut_receptorrut_receptor
Boleta
-monto_total_bruto: doubledouble monto_total_brutomonto_total_brutomonto_total_bruto
GuiaDespacho
-direccion_entrega: StringString direccion_entregadireccion_entregadireccion_entrega
-patente_transportista: StringString patente_transportistapatente_transportistapatente_transportista
🔍 Clic para ampliar y hacer zoom

15. Tipos de Exámenes Médicos

ExamenMedico → ExamenSangre · Radiografia · ResonanciaMagnetica

El laboratorio genera informes con el mismo flujo; cada examen tiene preparación y parámetros propios.

Qué hacer: Genera el informe de los tres exámenes. En sangre y resonancia considera los flags de ayuno/contraste en el texto del informe.

UMLJerarquía ExamenMedico
ExamenMedico
-codigo_fonasa: StringString codigo_fonasacodigo_fonasacodigo_fonasa
-paciente_rut: StringString paciente_rutpaciente_rutpaciente_rut
-fecha_toma: StringString fecha_tomafecha_tomafecha_toma
+generar_informe()generar_informe()generar_informe()generar_informe()
extends (herencia)
ExamenSangre
-requiere_ayuno_horas: intint requiere_ayuno_horasrequiere_ayuno_horasrequiere_ayuno_horas
-tubos_muestra: intint tubos_muestratubos_muestratubos_muestra
Radiografia
-zona_cuerpo: StringString zona_cuerpozona_cuerpozona_cuerpo
-dosis_radiacion: doubledouble dosis_radiaciondosis_radiaciondosis_radiacion
ResonanciaMagnetica
-duracion_minutos: intint duracion_minutosduracion_minutosduracion_minutos
-requiere_contraste: booleanboolean requiere_contrasterequiere_contrasterequiere_contraste
🔍 Clic para ampliar y hacer zoom

16. Entidades de Tablero en Juegos de Mesa

3 nivelesMovible ◁┈ PiezaJuego ▷ PeonAjedrez · CaballoAjedrez · FichaDamas

Las piezas se mueven en una grilla; la interfaz define la capacidad de movimiento, la clase abstracta guarda las coordenadas comunes y peón, caballo o dama definen su cinemática.

Qué hacer: Implementa la interfaz Movible con mover() y estaEnTablero(). La clase abstracta PiezaJuego implementa Movible y guarda color y posición. PeonAjedrez, CaballoAjedrez y FichaDamas heredan de PiezaJuego.

UMLJerarquía «interface» Movible
<<interface>>Movible
+mover()mover()mover()mover()
+estaEnTablero()estaEnTablero()estaEnTablero()estaEnTablero()
implements (interfaz)
<<abstract>>PiezaJuego
-color: StringString color
-posicion_fila: intint posicion_fila
-posicion_columna: intint posicion_columna
+mover()mover()
+estaEnTablero()estaEnTablero()
extends (herencia)
PeonAjedrez
-es_primer_movimiento: booleanboolean es_primer_movimientoes_primer_movimientoes_primer_movimiento
+promover()promover()promover()promover()
CaballoAjedrez
-puede_saltar: booleanboolean puede_saltarpuede_saltarpuede_saltar
FichaDamas
-es_reina: booleanboolean es_reinaes_reinaes_reina
🔍 Clic para ampliar y hacer zoom

17. Publicaciones en Redes Sociales

3 nivelesInteractuable ◁┈ Publicacion ▷ PostTexto · PostVideo · HistoriaTemporal

Todo post recibe interacción; la interfaz define el contrato social, la clase abstracta centraliza el autor y fecha, y las publicaciones especializan su contenido.

Qué hacer: Implementa la interfaz Interactuable con dar_like() y compartir(). La clase abstracta Publicacion implementa el contrato y comparte metadatos. PostTexto, PostVideo e HistoriaTemporal heredan y especializan.

UMLJerarquía «interface» Interactuable
<<interface>>Interactuable
+dar_like()dar_like()dar_like()dar_like()
+compartir()compartir()compartir()compartir()
+getContadorLikes()getContadorLikes()getContadorLikes()getContadorLikes()
implements (interfaz)
<<abstract>>Publicacion
-id_post: StringString id_post
-autor: StringString autor
-fecha_hora: StringString fecha_hora
-contador_likes: intint contador_likes
+dar_like()dar_like()
+compartir()compartir()
+getContadorLikes()getContadorLikes()
extends (herencia)
PostTexto
-contenido_caracteres: StringString contenido_caracterescontenido_caracterescontenido_caracteres
PostVideo
-resolucion_video: StringString resolucion_videoresolucion_videoresolucion_video
-duracion_segundos: intint duracion_segundosduracion_segundosduracion_segundos
HistoriaTemporal
-duracion_horas_activa: intint duracion_horas_activaduracion_horas_activaduracion_horas_activa
+verificar_expiracion()verificar_expiracion()verificar_expiracion()verificar_expiracion()
🔍 Clic para ampliar y hacer zoom

18. Habitaciones de un Hotel

3 nivelesReservable ◁┈ Habitacion ▷ HabitacionSimple · HabitacionDoble · SuitePresidencial

El PMS reserva cualquier estancia igual; la interfaz define el contrato de reserva, la abstracta almacena tarifa y limpieza, y cada tipo de habitación añade sus comodidades.

Qué hacer: Define el contrato Reservable con reservar() y getPrecioNoche(). La clase abstracta Habitacion gestiona número, precio y estado. HabitacionSimple, HabitacionDoble y SuitePresidencial heredan de Habitacion.

UMLJerarquía «interface» Reservable
<<interface>>Reservable
+reservar()reservar()reservar()reservar()
+cancelarReserva()cancelarReserva()cancelarReserva()cancelarReserva()
+getPrecioNoche()getPrecioNoche()getPrecioNoche()getPrecioNoche()
implements (interfaz)
<<abstract>>Habitacion
-numero_habitacion: intint numero_habitacion
-precio_noche: doubledouble precio_noche
-estado_limpieza: StringString estado_limpieza
+reservar()reservar()
+cancelarReserva()cancelarReserva()
+getPrecioNoche()getPrecioNoche()
extends (herencia)
HabitacionSimple
-tamano_cama: StringString tamano_camatamano_camatamano_cama
HabitacionDoble
-cantidad_camas: intint cantidad_camascantidad_camascantidad_camas
-tiene_vista_al_mar: booleanboolean tiene_vista_al_martiene_vista_al_martiene_vista_al_mar
SuitePresidencial
-incluye_jacuzzi: booleanboolean incluye_jacuzziincluye_jacuzziincluye_jacuzzi
-servicio_habitacion_24h: booleanboolean servicio_habitacion_24hservicio_habitacion_24hservicio_habitacion_24h
🔍 Clic para ampliar y hacer zoom

19. Trabajos / Conexiones en Base de Datos

3 nivelesConectable ◁┈ MotorBaseDatos ▷ ConexionMySQL · ConexionPostgreSQL · ConexionMongoDB

Los drivers hablan protocolos distintos pero comparten el contrato de conectividad; la interfaz define conectar/ejecutar, la abstracta almacena credenciales y las clases concretas operan.

Qué hacer: Define la interfaz Conectable con conectar() y ejecutar_consulta(). La abstracta MotorBaseDatos guarda host/puerto/usuario. ConexionMySQL, ConexionPostgreSQL y ConexionMongoDB implementan la conexión.

UMLJerarquía «interface» Conectable
<<interface>>Conectable
+conectar()conectar()conectar()conectar()
+desconectar()desconectar()desconectar()desconectar()
+ejecutar_consulta(sql: String)ejecutar_consulta(sql: String)ejecutar_consulta(sql)ejecutar_consulta(sql)
implements (interfaz)
<<abstract>>MotorBaseDatos
-host: StringString host
-puerto: intint puerto
-usuario: StringString usuario
+conectar()conectar()
+desconectar()desconectar()
+ejecutar_consulta(sql: String)ejecutar_consulta(sql: String)
extends (herencia)
ConexionMySQL
-charset: StringString charsetcharsetcharset
-autocommit: booleanboolean autocommitautocommitautocommit
ConexionPostgreSQL
-schema_default: StringString schema_defaultschema_defaultschema_default
-ssl_mode: StringString ssl_modessl_modessl_mode
ConexionMongoDB
-nombre_cluster: StringString nombre_clusternombre_clusternombre_cluster
-write_concern: StringString write_concernwrite_concernwrite_concern
🔍 Clic para ampliar y hacer zoom

20. Plantas y Vegetación

3 nivelesCultivable ◁┈ Planta ▷ Cactus · ArbolFrutal · PlantaInterior

El invernadero gestiona el cuidado botánico; la interfaz define el ciclo de cultivo, la clase abstracta modela nombre y humedad base, y cactus o frutales aplican cuidados específicos.

Qué hacer: Define la interfaz Cultivable con regar() y podar(). La clase abstracta Planta define las propiedades botánicas base. Cactus, ArbolFrutal y PlantaInterior heredan y personalizan su rutina.

UMLJerarquía «interface» Cultivable
<<interface>>Cultivable
+regar()regar()regar()regar()
+podar()podar()podar()podar()
+getHumedad()getHumedad()getHumedad()getHumedad()
implements (interfaz)
<<abstract>>Planta
-nombre_cientifico: StringString nombre_cientifico
-altura_cm: doubledouble altura_cm
-nivel_humedad: intint nivel_humedad
+regar()regar()
+podar()podar()
+getHumedad()getHumedad()
extends (herencia)
Cactus
-frecuencia_riego_dias: intint frecuencia_riego_diasfrecuencia_riego_diasfrecuencia_riego_dias
-tiene_espinas: booleanboolean tiene_espinastiene_espinastiene_espinas
ArbolFrutal
-estacion_cosecha: StringString estacion_cosechaestacion_cosechaestacion_cosecha
-kilos_produccion: doubledouble kilos_produccionkilos_produccionkilos_produccion
PlantaInterior
-requiere_luz_directa: booleanboolean requiere_luz_directarequiere_luz_directarequiere_luz_directa
-toxicidad_mascotas: booleanboolean toxicidad_mascotastoxicidad_mascotastoxicidad_mascotas
🔍 Clic para ampliar y hacer zoom
Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.