Термін «інкапсуляція», він же перший принцип ООП, означає наступне:
Інкапсуляція потрібна, щоб забезпечити цілісність об’єкта та дати можливість користуватися ним, не заглиблюючись у подробиці його реалізації.
Як виглядає приховання реалізації у C#-програмі?
Все як у реальному житті: користувачу надано інтерфейс (методи). Якщо йому потрібно, щоб об’єкт у програмі виконав дію, достатньо викликати потрібний метод. А що там відбувається всередині цих методів — інформація зайва, головне, щоб усе працювало як слід.
Окрім приховання реалізації в C# є ще приховання даних. З прихованням даних нам допомагають модифікатори доступу (private, protected), геттери і сеттери. Але про них пізніше.
Потрібно написати клас самозарядної гармати. Якщо вона заряджена — можна вистрілити, тобто розрядити. Якщо вона незаряджена, зарядити її, підготувати до пострілу. У класі єдине закрите логічне поле, яке показує, чи заряджена гармата чи ні.
private bool isLoaded;
internal class Gun
{
private bool isLoaded;
private void Reload()
{
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Заряджаємо...");
isLoaded = true;
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Заряджено! Готово до стрільби!");
}
public void Shoot()
{
if(!isLoaded)
{
Console.BackgroundColor = ConsoleColor.Yellow;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Попередження: зброя не заряджена!");
Reload();
}
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Бах---Бах---Бабах---");
isLoaded = false;
// Повернення стандартних кольорів
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
}
}
Напишемо метод без параметрів Reload, який буде перевіряти поле isLoaded, доступне в ньому, і якщо його значення false, гармата заряджається.
isLoaded встановлюється в true.
Перевіряється поле isLoaded, яке доступне в ньому теж, і якщо його значення false, гармата заряджається, викликається метод Reload, якщо true — виконується постріл і isLoaded встановлюється в false.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Gun
{
internal class Program
{
static void Main(string[] args)
{
Gun gun = new Gun();
Console.WriteLine("Стріляй!!!");
gun.Shoot();
Console.WriteLine("Стріляй!!!");
gun.Shoot();
Console.ReadKey();
}
}
}

Потім відкриваємо isLoaded! Зламали логіку класу... Результат виконання програми:
static void Main(string[] args)
{
Gun gun = new Gun();
gun.isLoaded = true;
Console.WriteLine("Стріляй!!!");
gun.Shoot();
gun.isLoaded = true;
Console.WriteLine("Стріляй!!!");
gun.Shoot();
Console.ReadKey();
}
Тепер у нас стріляє незаряджена гармата!!!