Es la propiedad que adquiere un objeto cuando este controla sus estados de manera interna y solo por medio de los accesos controlados, evitando que factores externos puedan modificar estos valores de manera deliberada y por fuera de los procedimientos establecidos.
En el siguiente ejemplo veremos como un semaforo afecta al transito de una calle tomando en cuenta que:
using System; using System.Timers; namespace Capacitacion.Encapsulamiento { public enum ColorSemaforo { Rojo = 0, Amarillo = 1, Verde = 2 } public class Semaforo { private Timer timer; private Timer timerAlerta; private ColorSemaforo color; public ColorSemaforo Color { get { return color; } } public Semaforo() { timer = new Timer(); timer.Interval = TimeSpan.FromSeconds(40).TotalMilliseconds; timer.Elapsed += Timer_Elapsed; timerAlerta = new Timer(); timerAlerta.Interval = TimeSpan.FromSeconds(35).TotalMilliseconds; timerAlerta.Elapsed += TimerAlerta_Elapsed; color = ColorSemaforo.Verde; Console.WriteLine($"El semaforo ha cambiado a {color}"); timer.Start(); timerAlerta.Start(); } private void TimerAlerta_Elapsed(object sender, ElapsedEventArgs e) { timerAlerta.Stop(); color = ColorSemaforo.Amarillo; Console.WriteLine($"El semaforo ha cambiado a {color}"); } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { timer.Stop(); color = Color == ColorSemaforo.Amarillo ? ColorSemaforo.Rojo : ColorSemaforo.Verde; Console.WriteLine($"El semaforo ha cambiado a {color}"); timer.Start(); if (color == ColorSemaforo.Verde) timerAlerta.Start(); } } public class Calle { Semaforo semaforo; Timer timer; public Calle(Semaforo semaforo) { this.semaforo = semaforo; timer = new Timer(); timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds; timer.Elapsed += Timer_Elapsed; timer.Start(); } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { var estatus = semaforo.Color == ColorSemaforo.Verde ? "avanza" : semaforo.Color == ColorSemaforo.Amarillo ? "disminuye su velocidad" : "se detiene"; Console.WriteLine($"el carro {estatus}"); } } public class Program { public static void Main(string[] args) { var semaforo = new Semaforo(); var calle = new Calle(semaforo); Console.ReadKey(); } } }