Назад Вперед Зміст


Поняття інкапсуляції. Вступ.

Термін «інкапсуляція», він же перший принцип ООП, означає наступне:

  1. по-перше – в один об’єкт або клас об’єднуються і дані, і методи, які працюють з цими даними.
  2. по-друге - інкапсуляція це приховання внутрішньої структури об’єкта від зовнішніх впливів.
    Всі зміни стану об’єкта відбуваються лише за допомогою звернень до методів самого об’єкта.

Основні принципи інкапсуляції.

Інкапсуляція потрібна, щоб забезпечити цілісність об’єкта та дати можливість користуватися ним, не заглиблюючись у подробиці його реалізації.

Як виглядає приховання реалізації у 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

Напишемо метод без параметрів Reload, який буде перевіряти поле isLoaded, доступне в ньому, і якщо його значення false, гармата заряджається.
isLoaded встановлюється в true.

Метод Shoot

Перевіряється поле 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();
}

Тепер у нас стріляє незаряджена гармата!!!


Назад Вперед Зміст