Café y Código

Contratos e interfaces

Desafíos de Interfaces

20 contratos «interface» + 3 implementaciones (incluyendo arquitectura de 3 niveles: Interfaz → Padre Abstracto → Clases Hijas) para practicar interfaces, desacoplamiento y polimorfismo por contrato. Cada ejercicio trae su diagrama UML interactivo con línea discontinua <|.. (implements).

Ruta canónica: /challenges/interface · Progreso guardado como aprende_interface_challenges_v1.

Modal con tarjetas — mismo estilo que herencia.

20 contratos · clic para expandir diagrama y checklist

1. Pagos — Interfaz Pagable

Pagable ◁┈ PagoTarjeta · PagoTransferencia · PagoEfectivo

Checkout con múltiples medios de pago. El contrato es el mismo, la implementación cambia.

Qué hacer: Define la interfaz Pagable con pagar(monto) y generarComprobante(). Implementa PagoTarjeta, PagoTransferencia y PagoEfectivo con validaciones propias.

UMLContrato Pagable
<<interface>>Pagable
+pagar(monto: double)pagar(monto: double)pagar(monto)pagar(monto)
+generarComprobante()generarComprobante()generarComprobante()generarComprobante()
implements (interfaz)
PagoTarjeta
-numero_tarjeta: StringString numero_tarjetanumero_tarjetanumero_tarjeta
-cvv: StringString cvvcvvcvv
-fecha_expiracion: StringString fecha_expiracionfecha_expiracionfecha_expiracion
+validar_tarjeta()validar_tarjeta()validar_tarjeta()validar_tarjeta()
PagoTransferencia
-banco: StringString bancobancobanco
-cuenta_destino: StringString cuenta_destinocuenta_destinocuenta_destino
+verificar_transferencia()verificar_transferencia()verificar_transferencia()verificar_transferencia()
PagoEfectivo
-monto_recibido: doubledouble monto_recibidomonto_recibidomonto_recibido
-caja_id: StringString caja_idcaja_idcaja_id
+calcular_vuelto()calcular_vuelto()calcular_vuelto()calcular_vuelto()
🔍 Clic para ampliar y hacer zoom

2. Notificaciones — Interfaz Notificable

Notificable ◁┈ NotificacionEmail · NotificacionSMS · NotificacionPush

Sistema omnichannel: email, SMS y push comparten el envío pero validan distinto.

Qué hacer: Implementa Notificable con enviar(mensaje) y validarDestino(). Cada implementación debe validar su destino antes de enviar.

UMLContrato Notificable
<<interface>>Notificable
+enviar(mensaje: String)enviar(mensaje: String)enviar(mensaje)enviar(mensaje)
+validarDestino()validarDestino()validarDestino()validarDestino()
implements (interfaz)
NotificacionEmail
-email: StringString emailemailemail
-asunto: StringString asuntoasuntoasunto
+validar_email()validar_email()validar_email()validar_email()
NotificacionSMS
-telefono: StringString telefonotelefonotelefono
-operador: StringString operadoroperadoroperador
NotificacionPush
-device_token: StringString device_tokendevice_tokendevice_token
-plataforma: StringString plataformaplataformaplataforma
🔍 Clic para ampliar y hacer zoom

3. Vuelo — Interfaz Volador

Volador ◁┈ Avion · Dron · Pajaro

Torre de control que opera cualquier cosa que vuele con el mismo contrato.

Qué hacer: Define Volador con despegar(), aterrizar() y obtenerAltitud(). Avion, Dron y Pajaro implementan distinto.

UMLContrato Volador
<<interface>>Volador
+despegar()despegar()despegar()despegar()
+aterrizar()aterrizar()aterrizar()aterrizar()
+obtenerAltitud()obtenerAltitud()obtenerAltitud()obtenerAltitud()
implements (interfaz)
Avion
-aerolinea: StringString aerolineaaerolineaaerolinea
-capacidad_pasajeros: intint capacidad_pasajeroscapacidad_pasajeroscapacidad_pasajeros
Dron
-bateria_porcentaje: intint bateria_porcentajebateria_porcentajebateria_porcentaje
-alcance_metros: doubledouble alcance_metrosalcance_metrosalcance_metros
+calibrar_gps()calibrar_gps()calibrar_gps()calibrar_gps()
Pajaro
-especie: StringString especieespecieespecie
-envergadura_alas: doubledouble envergadura_alasenvergadura_alasenvergadura_alas
🔍 Clic para ampliar y hacer zoom

4. Media — Interfaz Reproducible

Reproducible ◁┈ Audio · Video · Podcast

Player que reproduce audio, video o podcast con controles idénticos.

Qué hacer: Contrato Reproducible con reproducir(), pausar() y detener(). Cada media maneja buffering distinto.

UMLContrato Reproducible
<<interface>>Reproducible
+reproducir()reproducir()reproducir()reproducir()
+pausar()pausar()pausar()pausar()
+detener()detener()detener()detener()
implements (interfaz)
Audio
-duracion_segundos: intint duracion_segundosduracion_segundosduracion_segundos
-bitrate: intint bitratebitratebitrate
Video
-resolucion: StringString resolucionresolucionresolucion
-fps: intint fpsfpsfps
+cambiar_calidad(res: String)cambiar_calidad(res: String)cambiar_calidad(res)cambiar_calidad(res)
Podcast
-episodio: intint episodioepisodioepisodio
-anfitrion: StringString anfitrionanfitrionanfitrion
🔍 Clic para ampliar y hacer zoom

5. Auth — Interfaz Autenticable

Autenticable ◁┈ LoginEmail · LoginBiometrico · LoginSSO

Login con email, biometría y SSO comparten el mismo flujo de autenticación.

Qué hacer: Define Autenticable con autenticar(credenciales) y cerrarSesion(). Implementa las 3 variantes con validación propia.

UMLContrato Autenticable
<<interface>>Autenticable
+autenticar(credenciales: String)autenticar(credenciales: String)autenticar(credenciales)autenticar(credenciales)
+cerrarSesion()cerrarSesion()cerrarSesion()cerrarSesion()
implements (interfaz)
LoginEmail
-email: StringString emailemailemail
-password_hash: StringString password_hashpassword_hashpassword_hash
+validar_formato_email()validar_formato_email()validar_formato_email()validar_formato_email()
LoginBiometrico
-huella_id: StringString huella_idhuella_idhuella_id
-dispositivo: StringString dispositivodispositivodispositivo
LoginSSO
-proveedor: StringString proveedorproveedorproveedor
-token_oauth: StringString token_oauthtoken_oauthtoken_oauth
🔍 Clic para ampliar y hacer zoom

6. Alquiler — Interfaz Alquilable

Alquilable ◁┈ AutoAlquiler · Departamento · Bicicleta

Marketplace que alquila autos, deptos y bicis con cálculo de costo distinto.

Qué hacer: Contrato Alquilable con calcularCosto(dias) y reservar(fecha). Cada implementación aplica tarifa propia.

UMLContrato Alquilable
<<interface>>Alquilable
+calcularCosto(dias: int)calcularCosto(dias: int)calcularCosto(dias)calcularCosto(dias)
+reservar(fecha: String)reservar(fecha: String)reservar(fecha)reservar(fecha)
implements (interfaz)
AutoAlquiler
-patente: StringString patentepatentepatente
-categoria: StringString categoriacategoriacategoria
Departamento
-direccion: StringString direcciondirecciondireccion
-capacidad_personas: intint capacidad_personascapacidad_personascapacidad_personas
Bicicleta
-rodado: intint rodadorodadorodado
-tipo: StringString tipotipotipo
🔍 Clic para ampliar y hacer zoom

7. Reportes — Interfaz Exportable

Exportable ◁┈ ReportePDF · ReporteExcel · ReporteCSV

Módulo de reportes que exporta a PDF, Excel o CSV validando datos igual.

Qué hacer: Define Exportable con exportar(formato) y validarDatos(). Cada formato serializa distinto.

UMLContrato Exportable
<<interface>>Exportable
+exportar(formato: String)exportar(formato: String)exportar(formato)exportar(formato)
+validarDatos()validarDatos()validarDatos()validarDatos()
implements (interfaz)
ReportePDF
-orientacion: StringString orientacionorientacionorientacion
-incluye_graficos: booleanboolean incluye_graficosincluye_graficosincluye_graficos
ReporteExcel
-hoja: StringString hojahojahoja
-incluye_formulas: booleanboolean incluye_formulasincluye_formulasincluye_formulas
ReporteCSV
-delimitador: StringString delimitadordelimitadordelimitador
-encoding: StringString encodingencodingencoding
🔍 Clic para ampliar y hacer zoom

8. Tracking — Interfaz Rastreable

Rastreable ◁┈ Paquete · VehiculoFlota · PersonaRastreable

Mapa en tiempo real de paquetes, vehículos y personas con el mismo contrato de ubicación.

Qué hacer: Contrato Rastreable con obtenerUbicacion() y actualizarUbicacion(lat,lng). Simula movimiento de cada tipo.

UMLContrato Rastreable
<<interface>>Rastreable
+obtenerUbicacion()obtenerUbicacion()obtenerUbicacion()obtenerUbicacion()
+actualizarUbicacion(lat: double, lng: double)actualizarUbicacion(lat: double, lng: double)actualizarUbicacion(lat, lng)actualizarUbicacion(lat, lng)
implements (interfaz)
Paquete
-codigo_seguimiento: StringString codigo_seguimientocodigo_seguimientocodigo_seguimiento
-estado: StringString estadoestadoestado
VehiculoFlota
-patente: StringString patentepatentepatente
-chofer: StringString choferchoferchofer
PersonaRastreable
-rut: StringString rutrutrut
-nombre: StringString nombrenombrenombre
🔍 Clic para ampliar y hacer zoom

9. E-commerce — Interfaz Descontable

Descontable ◁┈ Producto · Servicio · SuscripcionDescontable

Carrito que aplica descuentos a productos, servicios y suscripciones con reglas distintas.

Qué hacer: Define Descontable con aplicarDescuento(porcentaje) y obtenerPrecioFinal(). Cada tipo calcula distinto.

UMLContrato Descontable
<<interface>>Descontable
+aplicarDescuento(porcentaje: double)aplicarDescuento(porcentaje: double)aplicarDescuento(porcentaje)aplicarDescuento(porcentaje)
+obtenerPrecioFinal()obtenerPrecioFinal()obtenerPrecioFinal()obtenerPrecioFinal()
implements (interfaz)
Producto
-sku: StringString skuskusku
-stock: intint stockstockstock
Servicio
-horas_estimadas: doubledouble horas_estimadashoras_estimadashoras_estimadas
-tarifa_hora: doubledouble tarifa_horatarifa_horatarifa_hora
SuscripcionDescontable
-plan: StringString planplanplan
-meses_restantes: intint meses_restantesmeses_restantesmeses_restantes
🔍 Clic para ampliar y hacer zoom

10. Validación — Interfaz Validador

Validador ◁┈ ValidadorEmail · ValidadorRut · ValidadorTelefono

Formularios que validan email, RUT y teléfono con el mismo contrato pero regex distintas.

Qué hacer: Contrato Validador con validar(dato) y obtenerMensajeError(). Implementa ValidadorEmail, ValidadorRut y ValidadorTelefono.

UMLContrato Validador
<<interface>>Validador
+validar(dato: String)validar(dato: String)validar(dato)validar(dato)
+obtenerMensajeError()obtenerMensajeError()obtenerMensajeError()obtenerMensajeError()
implements (interfaz)
ValidadorEmail
-regex_email: StringString regex_emailregex_emailregex_email
ValidadorRut
-digito_verificador: StringString digito_verificadordigito_verificadordigito_verificador
+calcular_dv()calcular_dv()calcular_dv()calcular_dv()
ValidadorTelefono
-codigo_pais: StringString codigo_paiscodigo_paiscodigo_pais
-largo_minimo: intint largo_minimolargo_minimolargo_minimo
🔍 Clic para ampliar y hacer zoom

11. IoT — Interfaz Conectable

Conectable ◁┈ SensorWifi · BluetoothDevice · ApiRest

Hub IoT que conecta sensores WiFi, Bluetooth y APIs REST con el mismo ciclo de vida.

Qué hacer: Define Conectable con conectar(), desconectar() y enviarDatos(payload). Simula conexión de cada dispositivo.

UMLContrato Conectable
<<interface>>Conectable
+conectar()conectar()conectar()conectar()
+desconectar()desconectar()desconectar()desconectar()
+enviarDatos(payload: String)enviarDatos(payload: String)enviarDatos(payload)enviarDatos(payload)
implements (interfaz)
SensorWifi
-ssid: StringString ssidssidssid
-rssi: intint rssirssirssi
BluetoothDevice
-mac_address: StringString mac_addressmac_addressmac_address
-version_bt: StringString version_btversion_btversion_bt
ApiRest
-endpoint: StringString endpointendpointendpoint
-api_key: StringString api_keyapi_keyapi_key
🔍 Clic para ampliar y hacer zoom

12. Impresión — Interfaz Imprimible

Imprimible ◁┈ FacturaImprimible · Ticket · Etiqueta

Punto de venta que imprime facturas, tickets y etiquetas con vista previa idéntica.

Qué hacer: Contrato Imprimible con imprimir() y vistaPrevia(). Cada documento renderiza distinto.

UMLContrato Imprimible
<<interface>>Imprimible
+imprimir()imprimir()imprimir()imprimir()
+vistaPrevia()vistaPrevia()vistaPrevia()vistaPrevia()
implements (interfaz)
FacturaImprimible
-folio: intint foliofoliofolio
-iva: doubledouble ivaivaiva
Ticket
-numero: intint numeronumeronumero
-caja: StringString cajacajacaja
Etiqueta
-codigo_barras: StringString codigo_barrascodigo_barrascodigo_barras
-tamano: StringString tamanotamanotamano
🔍 Clic para ampliar y hacer zoom

13. Búsqueda — Interfaz Buscable

Buscable ◁┈ CatalogoProductos · Biblioteca · DirectorioUsuarios

Buscador universal para catálogo, biblioteca y directorio con filtros propios.

Qué hacer: Define Buscable con buscar(query) y filtrar(criterio). Cada implementación filtra distinto.

UMLContrato Buscable
<<interface>>Buscable
+buscar(query: String)buscar(query: String)buscar(query)buscar(query)
+filtrar(criterio: String)filtrar(criterio: String)filtrar(criterio)filtrar(criterio)
implements (interfaz)
CatalogoProductos
-categoria: StringString categoriacategoriacategoria
-precio_min: doubledouble precio_minprecio_minprecio_min
Biblioteca
-isbn: StringString isbnisbnisbn
-autor: StringString autorautorautor
DirectorioUsuarios
-rol: StringString rolrolrol
-activo: booleanboolean activoactivoactivo
🔍 Clic para ampliar y hacer zoom

14. Cache — Interfaz Cacheable

Cacheable ◁┈ CacheMemoria · CacheRedis · CacheDisco

Capa de caché con memoria, Redis y disco compartiendo get/set/expire.

Qué hacer: Contrato Cacheable con guardar(clave,valor), obtener(clave) y expirar(clave). Simula TTL distinto por backend.

UMLContrato Cacheable
<<interface>>Cacheable
+guardar(clave: String, valor: String)guardar(clave: String, valor: String)guardar(clave, valor)guardar(clave, valor)
+obtener(clave: String)obtener(clave: String)obtener(clave)obtener(clave)
+expirar(clave: String)expirar(clave: String)expirar(clave)expirar(clave)
implements (interfaz)
CacheMemoria
-max_items: intint max_itemsmax_itemsmax_items
-politica_eviction: StringString politica_evictionpolitica_evictionpolitica_eviction
CacheRedis
-host: StringString hosthosthost
-puerto: intint puertopuertopuerto
CacheDisco
-ruta: StringString rutarutaruta
-compresion: booleanboolean compresioncompresioncompresion
🔍 Clic para ampliar y hacer zoom

15. Testing — Interfaz Testeable

Testeable ◁┈ TestUnitario · TestIntegracion · TestE2E

Runner que ejecuta tests unitarios, de integración y E2E con el mismo ciclo.

Qué hacer: Define Testeable con ejecutarTest() y generarReporte(). Cada tipo de test reporta distinto.

UMLContrato Testeable
<<interface>>Testeable
+ejecutarTest()ejecutarTest()ejecutarTest()ejecutarTest()
+generarReporte()generarReporte()generarReporte()generarReporte()
implements (interfaz)
TestUnitario
-clase_objetivo: StringString clase_objetivoclase_objetivoclase_objetivo
-mocks: intint mocksmocksmocks
TestIntegracion
-base_datos: StringString base_datosbase_datosbase_datos
-fixtures: StringString fixturesfixturesfixtures
TestE2E
-url: StringString urlurlurl
-navegador: StringString navegadornavegadornavegador
🔍 Clic para ampliar y hacer zoom

16. Serialización — Interfaz + Clase Abstracta

3 nivelesSerializable ◁┈ AnimalSerializable ▷ PerroSerializable · GatoSerializable · AveSerializable

Sistema que serializa animales a JSON/XML/Binary. La interfaz define el contrato, una clase abstracta comparte lógica común (guardar/cargar), y los hijos especializan.

Qué hacer: Crea la interfaz Serializable con serialize() y deserialize(). Crea la clase abstracta AnimalSerializable que implementa Serializable y guarda nombre/edad. Crea PerroSerializable, GatoSerializable y AveSerializable que heredan de AnimalSerializable y añaden atributos propios.

UMLContrato Serializable
<<interface>>Serializable
+serialize()serialize()serialize()serialize()
+deserialize(data: String)deserialize(data: String)deserialize(data)deserialize(data)
+getFormat()getFormat()getFormat()getFormat()
implements (interfaz)
<<abstract>>AnimalSerializable
-nombre: StringString nombre
-edad: intint edad
+serialize()serialize()
+deserialize(data: String)deserialize(data: String)
+getFormat()getFormat()
extends (herencia)
PerroSerializable
-raza: StringString razarazaraza
-nivelEntrenado: intint nivelEntrenadonivelEntrenadonivelEntrenado
+getFormat()getFormat()getFormat()getFormat()
GatoSerializable
-indoor: booleanboolean indoorindoorindoor
-vidasRestantes: intint vidasRestantesvidasRestantesvidasRestantes
+getFormat()getFormat()getFormat()getFormat()
AveSerializable
-especie: StringString especieespecieespecie
-puedeVolar: booleanboolean puedeVolarpuedeVolarpuedeVolar
+getFormat()getFormat()getFormat()getFormat()
🔍 Clic para ampliar y hacer zoom

17. Facturación — Interfaz + Clase Abstracta

3 nivelesCobrable ◁┈ CuentaCobrable ▷ CobroMensual · CobroAnual · CobroPorUso

Portal de facturación con cobros recurrentes, anuales y por uso. La interfaz define cobrar(), la abstracta calcula impuestos, y los hijos aplican tarifa.

Qué hacer: Define la interfaz Cobrable con cobrar(monto) y generarBoleta(). Crea la abstracta CuentaCobrable que implementa Cobrable, guarda rut y nombre, y calcula IVA. Implementa CobroMensual, CobroAnual y CobroPorUso.

UMLContrato Cobrable
<<interface>>Cobrable
+cobrar(monto: double)cobrar(monto: double)cobrar(monto)cobrar(monto)
+generarBoleta()generarBoleta()generarBoleta()generarBoleta()
+getTipoCobro()getTipoCobro()getTipoCobro()getTipoCobro()
implements (interfaz)
<<abstract>>CuentaCobrable
-rut: StringString rut
-nombre: StringString nombre
-montoBase: doubledouble montoBase
+cobrar(monto: double)cobrar(monto: double)
+generarBoleta()generarBoleta()
+calcularIVA(monto: double)calcularIVA(monto: double)
extends (herencia)
CobroMensual
-mes: intint mesmesmes
-anio: intint anioanioanio
+getTipoCobro()getTipoCobro()getTipoCobro()getTipoCobro()
CobroAnual
-anio: intint anioanioanio
-bonificacion: doubledouble bonificacionbonificacionbonificacion
+getTipoCobro()getTipoCobro()getTipoCobro()getTipoCobro()
CobroPorUso
-unidadesConsumidas: intint unidadesConsumidasunidadesConsumidasunidadesConsumidas
-tarifaUnidad: doubledouble tarifaUnidadtarifaUnidadtarifaUnidad
+getTipoCobro()getTipoCobro()getTipoCobro()getTipoCobro()
🔍 Clic para ampliar y hacer zoom

19. Almacenamiento — Interfaz + Clase Abstracta

3 nivelesAlmacenable ◁┈ Almacenamiento ▷ AlmacenDisco · AlmacenNube · AlmacenMemoria

Capa de persistencia multi-backend. La interfaz define operaciones CRUD, la abstracta valida claves, y los hijos ejecutan en distinto storage.

Qué hacer: Define la interfaz Almacenable con guardar(clave,valor), obtener(clave) y eliminar(clave). Crea la abstracta Almacenamiento que valida formato de clave y registralogs. Implementa AlmacenDisco, AlmacenNube y AlmacenMemoria.

UMLContrato Almacenable
<<interface>>Almacenable
+guardar(clave: String, valor: String)guardar(clave: String, valor: String)guardar(clave, valor)guardar(clave, valor)
+obtener(clave: String)obtener(clave: String)obtener(clave)obtener(clave)
+eliminar(clave: String)eliminar(clave: String)eliminar(clave)eliminar(clave)
+listar()listar()listar()listar()
implements (interfaz)
<<abstract>>Almacenamiento
-nombre: StringString nombre
-capacidadMax: longlong capacidadMax
+guardar(clave: String, valor: String)guardar(clave: String, valor: String)
+obtener(clave: String)obtener(clave: String)
+eliminar(clave: String)eliminar(clave: String)
+validarClave(clave: String)validarClave(clave: String)
extends (herencia)
AlmacenDisco
-ruta: StringString rutarutaruta
-usoBytes: longlong usoBytesusoBytesusoBytes
+listar()listar()listar()listar()
AlmacenNube
-bucket: StringString bucketbucketbucket
-region: StringString regionregionregion
+listar()listar()listar()listar()
AlmacenMemoria
-maxItems: intint maxItemsmaxItemsmaxItems
-evictionPolicy: StringString evictionPolicyevictionPolicyevictionPolicy
+listar()listar()listar()listar()
🔍 Clic para ampliar y hacer zoom

20. Reportes — Interfaz + Clase Abstracta

3 nivelesReportable ◁┈ ReporteBase ▷ ReporteVentas · ReporteUsuarios · ReporteSistema

Sistema de reportes con plantilla compartida. La interfaz define el ciclo, la abstracta genera header/footer, y los hijos renderizan contenido.

Qué hacer: Define la interfaz Reportable con generar(), mostrar() y exportar(formato). Crea la abstracta ReporteBase que implementa Reportable, genera header con fecha/título, y calcula duración. Implementa ReporteVentas, ReporteUsuarios y ReporteSistema.

UMLContrato Reportable
<<interface>>Reportable
+generar()generar()generar()generar()
+mostrar()mostrar()mostrar()mostrar()
+exportar(formato: String)exportar(formato: String)exportar(formato)exportar(formato)
implements (interfaz)
<<abstract>>ReporteBase
-titulo: StringString titulo
-fechaGeneracion: StringString fechaGeneracion
-duracionMs: longlong duracionMs
+generar()generar()
+mostrar()mostrar()
+exportar(formato: String)exportar(formato: String)
+generarHeader()generarHeader()
extends (herencia)
ReporteVentas
-totalVentas: doubledouble totalVentastotalVentastotalVentas
-itemsCount: intint itemsCountitemsCountitemsCount
+generar()generar()generar()generar()
ReporteUsuarios
-totalUsuarios: intint totalUsuariostotalUsuariostotalUsuarios
-nuevosEsteMes: intint nuevosEsteMesnuevosEsteMesnuevosEsteMes
+generar()generar()generar()generar()
ReporteSistema
-cpuUsage: doubledouble cpuUsagecpuUsagecpuUsage
-memoriaGB: doubledouble memoriaGBmemoriaGBmemoriaGB
+generar()generar()generar()generar()
🔍 Clic para ampliar y hacer zoom
Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.