01

Qué es y qué problema resuelve

Programación orientada a objetos organiza estado y comportamiento mediante contratos. Encapsular consiste en controlar cómo cambia un objeto, no en agregar getters y setters a cada campo.

Un servicio que cualquiera puede modificar después de construirse pierde las garantías que pretendía proteger.

02

Ejemplo paso a paso

POO: encapsulación, composición y polimorfismo · caso de reservasC#

Punto de partida Implementación didáctica: escribe en consola, no envía correo. El consumidor conoce IAvisoReserva y la raíz de composición elige el canal.

Antes de ejecutar

Ejemplo de consola .NET 10. Integra el fragmento en Program.cs o en sus tipos auxiliares según corresponda; no mezcles declaraciones de tipos antes de instrucciones de nivel superior. No requiere una API ni una base.

public interface IAvisoReserva
{
    Task NotificarAsync(Guid reservaId, CancellationToken ct);
}
public sealed class AvisoConsola : IAvisoReserva
{
    public Task NotificarAsync(Guid reservaId, CancellationToken ct)
    {
        ct.ThrowIfCancellationRequested();
        Console.WriteLine($"Aviso ficticio para {reservaId}");
        return Task.CompletedTask;
    }
}

Cómo funciona

  1. IAvisoReserva define la operación que necesita el consumidor.
  2. AvisoConsola implementa ese contrato sin añadir una dependencia de correo real.
  3. La composición elige la implementación; el consumidor sigue trabajando con la interfaz.

Resultado esperado: Una llamada escribe un aviso; un token cancelado impide escribirlo.

03

Cuándo usarlo y qué debes evitar

El polimorfismo permite tratar implementaciones diferentes a través de un contrato. Usa composición cuando una reserva necesita una política de aviso; heredar ReservaUrgente puede mezclar identidad, reglas y canal de comunicación.

Una implementación sustituta debe cumplir el mismo significado del resultado. Si un canal devuelve éxito antes de aceptar el envío, documenta esa garantía o cambia el contrato.

Ampliación opcional · contexto y variantes del tema

Aplicar los cinco principios SOLID con criterio

S: responsabilidad única significa una razón coherente de cambio. Reserva cambia por reglas del negocio; un serializador cambia por el formato HTTP. O: abierto/cerrado propone extender comportamiento estable mediante puntos de variación útiles; agrega un segundo canal de aviso sin reescribir CancelarReserva. L: sustitución exige respetar precondiciones, resultados y efectos del contrato; un repositorio alternativo no puede devolver éxito antes de guardar si el contrato promete persistencia.

I: segregación de interfaces evita que una consulta de disponibilidad dependa de métodos para borrar reservas. D: inversión de dependencias hace que el caso de uso conozca un contrato IReservas y que el adaptador de almacenamiento lo implemente. Inyección de dependencias es el mecanismo que entrega el objeto; inversión es la dirección de la dependencia. Se puede inyectar una dependencia concreta y seguir teniendo un acoplamiento incorrecto.

Usa composición para sumar capacidades independientes. Una jerarquía Sala → SalaVirtual puede ser problemática si su contrato exige aforo físico o dirección postal. Una colección de atributos o políticas expresaría mejor diferencias reales. No introduzcas fábricas, interfaces genéricas y herencia para anticipar variantes que todavía no existen. Explica qué cambio previsto justifica cada frontera.

Un contrato acotado al caso de usoC#

Punto de partida La aplicación pide dos capacidades. La implementación puede usar una base de datos; el dominio no importa ese detalle. GuardarAsync representa la confirmación del trabajo pendiente en el ámbito.

Antes de ejecutar

Contrato compilado en el laboratorio

public interface IReservas
{
    Task<Reserva?> BuscarAsync(Guid id, CancellationToken ct);
    Task GuardarAsync(CancellationToken ct);
}

Resultado esperado: CancelarReserva se prueba con MemoriaReservas sin levantar HTTP.

04 · Práctica guiada · opcional

Practica lo aprendido

Agrega un canal que conserve identificadores en memoria e inyéctalo a un consumidor sin modificar el contrato.

  1. 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
  2. 02Agrega un canal que conserve identificadores en memoria e inyéctalo a un consumidor sin modificar el contrato.
  3. 03Comprueba y registra el resultado: Una llamada escribe un aviso; un token cancelado impide escribirlo.
Ver solución orientativa

Ambos canales implementan NotificarAsync. El test verifica el identificador observado, no el tipo interno del canal.

05

Comprueba lo aprendido

Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.

01¿Una interfaz asegura por sí sola bajo acoplamiento?

No. Puede exponer detalles del proveedor o un contrato demasiado grande; revisa significado y consumidores.

02¿Cómo sustituirías la consola por un canal de memoria sin cambiar al consumidor?

Implementa IAvisoReserva en el canal de memoria e inyéctalo al consumidor. La prueba compara el identificador recibido, no la clase concreta ni su almacenamiento interno.

Cómo demostrar el objetivo

Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.

  • El canal de memoria implementa el mismo contrato de notificación.
  • El consumidor recibe el canal por constructor y la prueba observa el identificador enviado.

Qué debes recordar

  • Encapsular protege comportamiento y estado.
  • La composición permite cambiar colaboradores sin cambiar al consumidor.
Tu cuaderno · notas personales

Cuaderno local

Tus notas del contenido

Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.

Guardado local automático
Material de apoyo · descarga, glosario y referencias
Libro de trabajo · POO: encapsulación, composición y polimorfismoLaboratorio C# · núcleo y 15 comprobaciones

Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.