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.
Interfaces
Lecciones de Interfaces enlazadas
Elige tu lenguaje y vuelve a implementar el contrato.
20 contratos · clic para expandir diagrama y checklist
011. Pagos — Interfaz Pagable
Pagable ◁┈ PagoTarjeta · PagoTransferencia · PagoEfectivo
1. Pagos — Interfaz Pagable
Pagable ◁┈ PagoTarjeta · PagoTransferencia · PagoEfectivoCheckout 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.
💡 Solución en Código Java: Pagos — Interfaz Pagable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Pagable {
public pagar(monto: double): boolean;
public generarComprobante(): String;
}
// 3. Clases Implementadoras
public class PagoTarjeta implements Pagable {
private numero_tarjeta: String;
private cvv: String;
private fecha_expiracion: String;
@Override
public pagar(monto: double): boolean {
System.out.println("Ejecutando PagoTarjeta...");
}
}
public class PagoTransferencia implements Pagable {
private banco: String;
private cuenta_destino: String;
@Override
public pagar(monto: double): boolean {
System.out.println("Ejecutando PagoTransferencia...");
}
}
public class PagoEfectivo implements Pagable {
private monto_recibido: double;
private caja_id: String;
@Override
public pagar(monto: double): boolean {
System.out.println("Ejecutando PagoEfectivo...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Pagable[] objetos = {
new PagoTarjeta(),
new PagoTransferencia(),
new PagoEfectivo()
};
for (Pagable obj : objetos) {
System.out.println(obj.toString());
}
}
}022. Notificaciones — Interfaz Notificable
Notificable ◁┈ NotificacionEmail · NotificacionSMS · NotificacionPush
2. Notificaciones — Interfaz Notificable
Notificable ◁┈ NotificacionEmail · NotificacionSMS · NotificacionPushSistema 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.
💡 Solución en Código Java: Notificaciones — Interfaz Notificable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Notificable {
public enviar(mensaje: String): boolean;
public validarDestino(): boolean;
}
// 3. Clases Implementadoras
public class NotificacionEmail implements Notificable {
private email: String;
private asunto: String;
@Override
public enviar(mensaje: String): boolean {
System.out.println("Ejecutando NotificacionEmail...");
}
}
public class NotificacionSMS implements Notificable {
private telefono: String;
private operador: String;
@Override
public enviar(mensaje: String): boolean {
System.out.println("Ejecutando NotificacionSMS...");
}
}
public class NotificacionPush implements Notificable {
private device_token: String;
private plataforma: String;
@Override
public enviar(mensaje: String): boolean {
System.out.println("Ejecutando NotificacionPush...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Notificable[] objetos = {
new NotificacionEmail(),
new NotificacionSMS(),
new NotificacionPush()
};
for (Notificable obj : objetos) {
System.out.println(obj.toString());
}
}
}033. Vuelo — Interfaz Volador
Volador ◁┈ Avion · Dron · Pajaro
3. Vuelo — Interfaz Volador
Volador ◁┈ Avion · Dron · PajaroTorre 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.
💡 Solución en Código Java: Vuelo — Interfaz Volador
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Volador {
public despegar(): void;
public aterrizar(): void;
public obtenerAltitud(): double;
}
// 3. Clases Implementadoras
public class Avion implements Volador {
private aerolinea: String;
private capacidad_pasajeros: int;
@Override
public despegar(): void {
System.out.println("Ejecutando Avion...");
}
}
public class Dron implements Volador {
private bateria_porcentaje: int;
private alcance_metros: double;
@Override
public despegar(): void {
System.out.println("Ejecutando Dron...");
}
}
public class Pajaro implements Volador {
private especie: String;
private envergadura_alas: double;
@Override
public despegar(): void {
System.out.println("Ejecutando Pajaro...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Volador[] objetos = {
new Avion(),
new Dron(),
new Pajaro()
};
for (Volador obj : objetos) {
System.out.println(obj.toString());
}
}
}044. Media — Interfaz Reproducible
Reproducible ◁┈ Audio · Video · Podcast
4. Media — Interfaz Reproducible
Reproducible ◁┈ Audio · Video · PodcastPlayer que reproduce audio, video o podcast con controles idénticos.
Qué hacer: Contrato Reproducible con reproducir(), pausar() y detener(). Cada media maneja buffering distinto.
💡 Solución en Código Java: Media — Interfaz Reproducible
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Reproducible {
public reproducir(): void;
public pausar(): void;
public detener(): void;
}
// 3. Clases Implementadoras
public class Audio implements Reproducible {
private duracion_segundos: int;
private bitrate: int;
@Override
public reproducir(): void {
System.out.println("Ejecutando Audio...");
}
}
public class Video implements Reproducible {
private resolucion: String;
private fps: int;
@Override
public reproducir(): void {
System.out.println("Ejecutando Video...");
}
}
public class Podcast implements Reproducible {
private episodio: int;
private anfitrion: String;
@Override
public reproducir(): void {
System.out.println("Ejecutando Podcast...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Reproducible[] objetos = {
new Audio(),
new Video(),
new Podcast()
};
for (Reproducible obj : objetos) {
System.out.println(obj.toString());
}
}
}055. Auth — Interfaz Autenticable
Autenticable ◁┈ LoginEmail · LoginBiometrico · LoginSSO
5. Auth — Interfaz Autenticable
Autenticable ◁┈ LoginEmail · LoginBiometrico · LoginSSOLogin 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.
💡 Solución en Código Java: Auth — Interfaz Autenticable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Autenticable {
public autenticar(credenciales: String): boolean;
public cerrarSesion(): void;
}
// 3. Clases Implementadoras
public class LoginEmail implements Autenticable {
private email: String;
private password_hash: String;
@Override
public autenticar(credenciales: String): boolean {
System.out.println("Ejecutando LoginEmail...");
}
}
public class LoginBiometrico implements Autenticable {
private huella_id: String;
private dispositivo: String;
@Override
public autenticar(credenciales: String): boolean {
System.out.println("Ejecutando LoginBiometrico...");
}
}
public class LoginSSO implements Autenticable {
private proveedor: String;
private token_oauth: String;
@Override
public autenticar(credenciales: String): boolean {
System.out.println("Ejecutando LoginSSO...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Autenticable[] objetos = {
new LoginEmail(),
new LoginBiometrico(),
new LoginSSO()
};
for (Autenticable obj : objetos) {
System.out.println(obj.toString());
}
}
}066. Alquiler — Interfaz Alquilable
Alquilable ◁┈ AutoAlquiler · Departamento · Bicicleta
6. Alquiler — Interfaz Alquilable
Alquilable ◁┈ AutoAlquiler · Departamento · BicicletaMarketplace 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.
💡 Solución en Código Java: Alquiler — Interfaz Alquilable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Alquilable {
public calcularCosto(dias: int): double;
public reservar(fecha: String): boolean;
}
// 3. Clases Implementadoras
public class AutoAlquiler implements Alquilable {
private patente: String;
private categoria: String;
@Override
public calcularCosto(dias: int): double {
System.out.println("Ejecutando AutoAlquiler...");
}
}
public class Departamento implements Alquilable {
private direccion: String;
private capacidad_personas: int;
@Override
public calcularCosto(dias: int): double {
System.out.println("Ejecutando Departamento...");
}
}
public class Bicicleta implements Alquilable {
private rodado: int;
private tipo: String;
@Override
public calcularCosto(dias: int): double {
System.out.println("Ejecutando Bicicleta...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Alquilable[] objetos = {
new AutoAlquiler(),
new Departamento(),
new Bicicleta()
};
for (Alquilable obj : objetos) {
System.out.println(obj.toString());
}
}
}077. Reportes — Interfaz Exportable
Exportable ◁┈ ReportePDF · ReporteExcel · ReporteCSV
7. Reportes — Interfaz Exportable
Exportable ◁┈ ReportePDF · ReporteExcel · ReporteCSVMó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.
💡 Solución en Código Java: Reportes — Interfaz Exportable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Exportable {
public exportar(formato: String): String;
public validarDatos(): boolean;
}
// 3. Clases Implementadoras
public class ReportePDF implements Exportable {
private orientacion: String;
private incluye_graficos: boolean;
@Override
public exportar(formato: String): String {
System.out.println("Ejecutando ReportePDF...");
}
}
public class ReporteExcel implements Exportable {
private hoja: String;
private incluye_formulas: boolean;
@Override
public exportar(formato: String): String {
System.out.println("Ejecutando ReporteExcel...");
}
}
public class ReporteCSV implements Exportable {
private delimitador: String;
private encoding: String;
@Override
public exportar(formato: String): String {
System.out.println("Ejecutando ReporteCSV...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Exportable[] objetos = {
new ReportePDF(),
new ReporteExcel(),
new ReporteCSV()
};
for (Exportable obj : objetos) {
System.out.println(obj.toString());
}
}
}088. Tracking — Interfaz Rastreable
Rastreable ◁┈ Paquete · VehiculoFlota · PersonaRastreable
8. Tracking — Interfaz Rastreable
Rastreable ◁┈ Paquete · VehiculoFlota · PersonaRastreableMapa 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.
💡 Solución en Código Java: Tracking — Interfaz Rastreable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Rastreable {
public obtenerUbicacion(): String;
public actualizarUbicacion(lat: double, lng: double): void;
}
// 3. Clases Implementadoras
public class Paquete implements Rastreable {
private codigo_seguimiento: String;
private estado: String;
@Override
public obtenerUbicacion(): String {
System.out.println("Ejecutando Paquete...");
}
}
public class VehiculoFlota implements Rastreable {
private patente: String;
private chofer: String;
@Override
public obtenerUbicacion(): String {
System.out.println("Ejecutando VehiculoFlota...");
}
}
public class PersonaRastreable implements Rastreable {
private rut: String;
private nombre: String;
@Override
public obtenerUbicacion(): String {
System.out.println("Ejecutando PersonaRastreable...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Rastreable[] objetos = {
new Paquete(),
new VehiculoFlota(),
new PersonaRastreable()
};
for (Rastreable obj : objetos) {
System.out.println(obj.toString());
}
}
}099. E-commerce — Interfaz Descontable
Descontable ◁┈ Producto · Servicio · SuscripcionDescontable
9. E-commerce — Interfaz Descontable
Descontable ◁┈ Producto · Servicio · SuscripcionDescontableCarrito que aplica descuentos a productos, servicios y suscripciones con reglas distintas.
Qué hacer: Define Descontable con aplicarDescuento(porcentaje) y obtenerPrecioFinal(). Cada tipo calcula distinto.
💡 Solución en Código Java: E-commerce — Interfaz Descontable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Descontable {
public aplicarDescuento(porcentaje: double): void;
public obtenerPrecioFinal(): double;
}
// 3. Clases Implementadoras
public class Producto implements Descontable {
private sku: String;
private stock: int;
@Override
public aplicarDescuento(porcentaje: double): void {
System.out.println("Ejecutando Producto...");
}
}
public class Servicio implements Descontable {
private horas_estimadas: double;
private tarifa_hora: double;
@Override
public aplicarDescuento(porcentaje: double): void {
System.out.println("Ejecutando Servicio...");
}
}
public class SuscripcionDescontable implements Descontable {
private plan: String;
private meses_restantes: int;
@Override
public aplicarDescuento(porcentaje: double): void {
System.out.println("Ejecutando SuscripcionDescontable...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Descontable[] objetos = {
new Producto(),
new Servicio(),
new SuscripcionDescontable()
};
for (Descontable obj : objetos) {
System.out.println(obj.toString());
}
}
}1010. Validación — Interfaz Validador
Validador ◁┈ ValidadorEmail · ValidadorRut · ValidadorTelefono
10. Validación — Interfaz Validador
Validador ◁┈ ValidadorEmail · ValidadorRut · ValidadorTelefonoFormularios 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.
💡 Solución en Código Java: Validación — Interfaz Validador
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Validador {
public validar(dato: String): boolean;
public obtenerMensajeError(): String;
}
// 3. Clases Implementadoras
public class ValidadorEmail implements Validador {
private regex_email: String;
@Override
public validar(dato: String): boolean {
System.out.println("Ejecutando ValidadorEmail...");
}
}
public class ValidadorRut implements Validador {
private digito_verificador: String;
@Override
public validar(dato: String): boolean {
System.out.println("Ejecutando ValidadorRut...");
}
}
public class ValidadorTelefono implements Validador {
private codigo_pais: String;
private largo_minimo: int;
@Override
public validar(dato: String): boolean {
System.out.println("Ejecutando ValidadorTelefono...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Validador[] objetos = {
new ValidadorEmail(),
new ValidadorRut(),
new ValidadorTelefono()
};
for (Validador obj : objetos) {
System.out.println(obj.toString());
}
}
}1111. IoT — Interfaz Conectable
Conectable ◁┈ SensorWifi · BluetoothDevice · ApiRest
11. IoT — Interfaz Conectable
Conectable ◁┈ SensorWifi · BluetoothDevice · ApiRestHub 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.
💡 Solución en Código Java: IoT — Interfaz Conectable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Conectable {
public conectar(): boolean;
public desconectar(): void;
public enviarDatos(payload: String): boolean;
}
// 3. Clases Implementadoras
public class SensorWifi implements Conectable {
private ssid: String;
private rssi: int;
@Override
public conectar(): boolean {
System.out.println("Ejecutando SensorWifi...");
}
}
public class BluetoothDevice implements Conectable {
private mac_address: String;
private version_bt: String;
@Override
public conectar(): boolean {
System.out.println("Ejecutando BluetoothDevice...");
}
}
public class ApiRest implements Conectable {
private endpoint: String;
private api_key: String;
@Override
public conectar(): boolean {
System.out.println("Ejecutando ApiRest...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Conectable[] objetos = {
new SensorWifi(),
new BluetoothDevice(),
new ApiRest()
};
for (Conectable obj : objetos) {
System.out.println(obj.toString());
}
}
}1212. Impresión — Interfaz Imprimible
Imprimible ◁┈ FacturaImprimible · Ticket · Etiqueta
12. Impresión — Interfaz Imprimible
Imprimible ◁┈ FacturaImprimible · Ticket · EtiquetaPunto 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.
💡 Solución en Código Java: Impresión — Interfaz Imprimible
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Imprimible {
public imprimir(): boolean;
public vistaPrevia(): String;
}
// 3. Clases Implementadoras
public class FacturaImprimible implements Imprimible {
private folio: int;
private iva: double;
@Override
public imprimir(): boolean {
System.out.println("Ejecutando FacturaImprimible...");
}
}
public class Ticket implements Imprimible {
private numero: int;
private caja: String;
@Override
public imprimir(): boolean {
System.out.println("Ejecutando Ticket...");
}
}
public class Etiqueta implements Imprimible {
private codigo_barras: String;
private tamano: String;
@Override
public imprimir(): boolean {
System.out.println("Ejecutando Etiqueta...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Imprimible[] objetos = {
new FacturaImprimible(),
new Ticket(),
new Etiqueta()
};
for (Imprimible obj : objetos) {
System.out.println(obj.toString());
}
}
}1313. Búsqueda — Interfaz Buscable
Buscable ◁┈ CatalogoProductos · Biblioteca · DirectorioUsuarios
13. Búsqueda — Interfaz Buscable
Buscable ◁┈ CatalogoProductos · Biblioteca · DirectorioUsuariosBuscador 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.
💡 Solución en Código Java: Búsqueda — Interfaz Buscable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Buscable {
public buscar(query: String): List;
public filtrar(criterio: String): List;
}
// 3. Clases Implementadoras
public class CatalogoProductos implements Buscable {
private categoria: String;
private precio_min: double;
@Override
public buscar(query: String): List {
System.out.println("Ejecutando CatalogoProductos...");
}
}
public class Biblioteca implements Buscable {
private isbn: String;
private autor: String;
@Override
public buscar(query: String): List {
System.out.println("Ejecutando Biblioteca...");
}
}
public class DirectorioUsuarios implements Buscable {
private rol: String;
private activo: boolean;
@Override
public buscar(query: String): List {
System.out.println("Ejecutando DirectorioUsuarios...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Buscable[] objetos = {
new CatalogoProductos(),
new Biblioteca(),
new DirectorioUsuarios()
};
for (Buscable obj : objetos) {
System.out.println(obj.toString());
}
}
}1414. Cache — Interfaz Cacheable
Cacheable ◁┈ CacheMemoria · CacheRedis · CacheDisco
14. Cache — Interfaz Cacheable
Cacheable ◁┈ CacheMemoria · CacheRedis · CacheDiscoCapa 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.
💡 Solución en Código Java: Cache — Interfaz Cacheable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Cacheable {
public guardar(clave: String, valor: String): boolean;
public obtener(clave: String): String;
public expirar(clave: String): boolean;
}
// 3. Clases Implementadoras
public class CacheMemoria implements Cacheable {
private max_items: int;
private politica_eviction: String;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando CacheMemoria...");
}
}
public class CacheRedis implements Cacheable {
private host: String;
private puerto: int;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando CacheRedis...");
}
}
public class CacheDisco implements Cacheable {
private ruta: String;
private compresion: boolean;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando CacheDisco...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Cacheable[] objetos = {
new CacheMemoria(),
new CacheRedis(),
new CacheDisco()
};
for (Cacheable obj : objetos) {
System.out.println(obj.toString());
}
}
}1515. Testing — Interfaz Testeable
Testeable ◁┈ TestUnitario · TestIntegracion · TestE2E
15. Testing — Interfaz Testeable
Testeable ◁┈ TestUnitario · TestIntegracion · TestE2ERunner 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.
💡 Solución en Código Java: Testing — Interfaz Testeable
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Testeable {
public ejecutarTest(): boolean;
public generarReporte(): String;
}
// 3. Clases Implementadoras
public class TestUnitario implements Testeable {
private clase_objetivo: String;
private mocks: int;
@Override
public ejecutarTest(): boolean {
System.out.println("Ejecutando TestUnitario...");
}
}
public class TestIntegracion implements Testeable {
private base_datos: String;
private fixtures: String;
@Override
public ejecutarTest(): boolean {
System.out.println("Ejecutando TestIntegracion...");
}
}
public class TestE2E implements Testeable {
private url: String;
private navegador: String;
@Override
public ejecutarTest(): boolean {
System.out.println("Ejecutando TestE2E...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Testeable[] objetos = {
new TestUnitario(),
new TestIntegracion(),
new TestE2E()
};
for (Testeable obj : objetos) {
System.out.println(obj.toString());
}
}
}1616. Serialización — Interfaz + Clase Abstracta
3 nivelesSerializable ◁┈ AnimalSerializable ▷ PerroSerializable · GatoSerializable · AveSerializable
16. Serialización — Interfaz + Clase Abstracta
3 nivelesSerializable ◁┈ AnimalSerializable ▷ PerroSerializable · GatoSerializable · AveSerializableSistema 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.
💡 Solución en Código Java: Serialización — Interfaz + Clase Abstracta
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Serializable {
public serialize(): String;
public deserialize(data: String): boolean;
public getFormat(): String;
}
// 2. Clase Abstracta Intermedia
public abstract class AnimalSerializable implements Serializable {
private nombre: String;
private edad: int;
}
// 3. Clases Implementadoras
public class PerroSerializable extends AnimalSerializable {
private raza: String;
private nivelEntrenado: int;
@Override
public serialize(): String {
System.out.println("Ejecutando PerroSerializable...");
}
}
public class GatoSerializable extends AnimalSerializable {
private indoor: boolean;
private vidasRestantes: int;
@Override
public serialize(): String {
System.out.println("Ejecutando GatoSerializable...");
}
}
public class AveSerializable extends AnimalSerializable {
private especie: String;
private puedeVolar: boolean;
@Override
public serialize(): String {
System.out.println("Ejecutando AveSerializable...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Serializable[] objetos = {
new PerroSerializable(),
new GatoSerializable(),
new AveSerializable()
};
for (Serializable obj : objetos) {
System.out.println(obj.toString());
}
}
}1717. Facturación — Interfaz + Clase Abstracta
3 nivelesCobrable ◁┈ CuentaCobrable ▷ CobroMensual · CobroAnual · CobroPorUso
17. Facturación — Interfaz + Clase Abstracta
3 nivelesCobrable ◁┈ CuentaCobrable ▷ CobroMensual · CobroAnual · CobroPorUsoPortal 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.
💡 Solución en Código Java: Facturación — Interfaz + Clase Abstracta
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Cobrable {
public cobrar(monto: double): boolean;
public generarBoleta(): String;
public getTipoCobro(): String;
}
// 2. Clase Abstracta Intermedia
public abstract class CuentaCobrable implements Cobrable {
private rut: String;
private nombre: String;
private montoBase: double;
}
// 3. Clases Implementadoras
public class CobroMensual extends CuentaCobrable {
private mes: int;
private anio: int;
@Override
public cobrar(monto: double): boolean {
System.out.println("Ejecutando CobroMensual...");
}
}
public class CobroAnual extends CuentaCobrable {
private anio: int;
private bonificacion: double;
@Override
public cobrar(monto: double): boolean {
System.out.println("Ejecutando CobroAnual...");
}
}
public class CobroPorUso extends CuentaCobrable {
private unidadesConsumidas: int;
private tarifaUnidad: double;
@Override
public cobrar(monto: double): boolean {
System.out.println("Ejecutando CobroPorUso...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Cobrable[] objetos = {
new CobroMensual(),
new CobroAnual(),
new CobroPorUso()
};
for (Cobrable obj : objetos) {
System.out.println(obj.toString());
}
}
}1818. GPS — Interfaz + Clase Abstracta
3 nivelesNavegable ◁┈ VehiculoNavegable ▷ NaveAuto · NaveMoto · NaveBici
18. GPS — Interfaz + Clase Abstracta
3 nivelesNavegable ◁┈ VehiculoNavegable ▷ NaveAuto · NaveMoto · NaveBiciFlota de transporte con GPS compartido. La interfaz Navegable define movimiento, la abstracta VehiculoNavegable guarda ubicación actual, y los hijos calculan velocidad distinta.
Qué hacer: Define la interfaz Navegable con mover(destino) y getPosicionActual(). Crea la abstracta VehiculoNavegable que guarda lat/lng y calcula distancia. Implementa NaveAuto, NaveMoto y NaveBici con velocidades máximas distintas.
💡 Solución en Código Java: GPS — Interfaz + Clase Abstracta
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Navegable {
public mover(destino: String): void;
public getPosicionActual(): String;
public getVelocidadMax(): double;
}
// 2. Clase Abstracta Intermedia
public abstract class VehiculoNavegable implements Navegable {
private lat: double;
private lng: double;
private velocidadActual: double;
}
// 3. Clases Implementadoras
public class NaveAuto extends VehiculoNavegable {
private patente: String;
private combustible: int;
@Override
public mover(destino: String): void {
System.out.println("Ejecutando NaveAuto...");
}
}
public class NaveMoto extends VehiculoNavegable {
private cilindrada: int;
private cascoObligatorio: boolean;
@Override
public mover(destino: String): void {
System.out.println("Ejecutando NaveMoto...");
}
}
public class NaveBici extends VehiculoNavegable {
private electrica: boolean;
private nivelBateria: int;
@Override
public mover(destino: String): void {
System.out.println("Ejecutando NaveBici...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Navegable[] objetos = {
new NaveAuto(),
new NaveMoto(),
new NaveBici()
};
for (Navegable obj : objetos) {
System.out.println(obj.toString());
}
}
}1919. Almacenamiento — Interfaz + Clase Abstracta
3 nivelesAlmacenable ◁┈ Almacenamiento ▷ AlmacenDisco · AlmacenNube · AlmacenMemoria
19. Almacenamiento — Interfaz + Clase Abstracta
3 nivelesAlmacenable ◁┈ Almacenamiento ▷ AlmacenDisco · AlmacenNube · AlmacenMemoriaCapa 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.
💡 Solución en Código Java: Almacenamiento — Interfaz + Clase Abstracta
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Almacenable {
public guardar(clave: String, valor: String): boolean;
public obtener(clave: String): String;
public eliminar(clave: String): boolean;
public listar(): List;
}
// 2. Clase Abstracta Intermedia
public abstract class Almacenamiento implements Almacenable {
private nombre: String;
private capacidadMax: long;
}
// 3. Clases Implementadoras
public class AlmacenDisco extends Almacenamiento {
private ruta: String;
private usoBytes: long;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando AlmacenDisco...");
}
}
public class AlmacenNube extends Almacenamiento {
private bucket: String;
private region: String;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando AlmacenNube...");
}
}
public class AlmacenMemoria extends Almacenamiento {
private maxItems: int;
private evictionPolicy: String;
@Override
public guardar(clave: String, valor: String): boolean {
System.out.println("Ejecutando AlmacenMemoria...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Almacenable[] objetos = {
new AlmacenDisco(),
new AlmacenNube(),
new AlmacenMemoria()
};
for (Almacenable obj : objetos) {
System.out.println(obj.toString());
}
}
}2020. Reportes — Interfaz + Clase Abstracta
3 nivelesReportable ◁┈ ReporteBase ▷ ReporteVentas · ReporteUsuarios · ReporteSistema
20. Reportes — Interfaz + Clase Abstracta
3 nivelesReportable ◁┈ ReporteBase ▷ ReporteVentas · ReporteUsuarios · ReporteSistemaSistema 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.
💡 Solución en Código Java: Reportes — Interfaz + Clase Abstracta
Implementación completa del contrato con sus clases correspondientes:
// 1. Declaración de la Interfaz
public interface Reportable {
public generar(): boolean;
public mostrar(): String;
public exportar(formato: String): String;
}
// 2. Clase Abstracta Intermedia
public abstract class ReporteBase implements Reportable {
private titulo: String;
private fechaGeneracion: String;
private duracionMs: long;
}
// 3. Clases Implementadoras
public class ReporteVentas extends ReporteBase {
private totalVentas: double;
private itemsCount: int;
@Override
public generar(): boolean {
System.out.println("Ejecutando ReporteVentas...");
}
}
public class ReporteUsuarios extends ReporteBase {
private totalUsuarios: int;
private nuevosEsteMes: int;
@Override
public generar(): boolean {
System.out.println("Ejecutando ReporteUsuarios...");
}
}
public class ReporteSistema extends ReporteBase {
private cpuUsage: double;
private memoriaGB: double;
@Override
public generar(): boolean {
System.out.println("Ejecutando ReporteSistema...");
}
}
// 4. Ejemplo de prueba en Main
public class Main {
public static void main(String[] args) {
Reportable[] objetos = {
new ReporteVentas(),
new ReporteUsuarios(),
new ReporteSistema()
};
for (Reportable obj : objetos) {
System.out.println(obj.toString());
}
}
}Acceso Privado a Resultados
Ingresa la clave para ver los resultados


