Hermetyzacja jest jedną z metodologii programowania obiektowego, która uniemożliwia dostęp do szczegółów impelemtacji naszego kodu. Innymi słowy, enkapsulacja, tj. hermetyzacja to termin oznaczający ukrywanie w obiektach tego do czego użytkownik nie powinien mieć dostępu. Idea nowoczesnego programowania obiektowego to idea pisania kodu jak najbardziej zamkniętego. Dzięki takiemu podejściu ograniczamy dostęp do części zmiennych, metod, które są wykonywane wewnątrz konkretnej klasy. Dostęp do tych elementów jest ograniczony „z zewnątrz”.

Aby wykorzystać hermetyzację należy zapoznać się z pojęciem modyfikatorów dostępu. Określają one dostępność do wskazanego elementu w naszym kodzie źródłowym.

Modyfikatory dostępu w C#:
  • Public – brak ograniczeń. Składowe oznaczone tym słowem kluczowym są dostępne dla wszystkich metod wszystkich klas;
  • Private – składowe te dostępne są tylko dla metod klas w której się znajdują;
  • Protected – składowe chronione są dostępne dla klasy, w której się znajdują oraz dla klas dziedziczących po klasie bazowej;
  • Internal – składowe wewnętrze są dostępne dla klasy znajdującej się w danej bibliotece;
  • Protected Internal – składowe chronione są dostępne dla klasy, w której się znajdują oraz dla klas dziedziczących po klasie bazowej tylko w obręcie danej biblioteki.
Przejdźmy do dokładnego omówienia powyższych modyfikatorów dostępu.

Public

Nie ma żadnych ograniczeń. Zmienne składowe, metody danej klasy są widoczne dla innych metod i obiektów. Każda zmienna czy metoda opatrzona modyfikatorem dostępu public jest dostępna z zewnątrz klasy.
Przykład:
using System;
namespace ModyfikatoryDostepu
{
    class Program
    {
        // Tutaj dojdzie do wykonania kodu naszej klasy
        static void Main(string[] args)
        {
            Prostokat pr = new Prostokat();
            pr.wysokosc = 4.5;
            pr.szerokosc = 3.5;
            pr.WyswietlInformacje();
            Console.ReadKey();
            // Wykonanie programu
            //Szerokosc: 3.5
            //Wysokosc: 4.5
            //Powierzchnia: 15.75
        }
    }
    class Prostokat
    {
        // pola klasy
        public double szerokosc;
        public double wysokosc;
        public double ObliczPowierzchnie()
        {
            return szerokosc * wysokosc;
        }
        public void WyswietlInformacje()
        {
            Console.WriteLine("Szerokość: {0}", szerokosc);
            Console.WriteLine("Wysokość: {0}", wysokosc);
            Console.WriteLine("Powierzchnia: {0}", ObliczPowierzchnie());
        }
    }
}

W powyższym przykładzie pola klasy: szerokosc oraz wysokosc zdefiniowane są jako publicznie. Dlatego też mamy do nich dostęp z wnętrza metody Main() używając instancji klasy Prostokat o nazwie pr.

Metody naszej klasy: ObliczPowierzchnie() oraz WyswietlInformacje() są również zdefiniowane jako publiczne dlatego mamy do nich dostęp z wnętrza metody Main() używając instancji klasy Prostokat o nazwie pr.

Private

Modifikator dostępu private pozwala nam na ukrycie pól oraz metod danej klasy. Składowe takie dostępne są tylko z wnętrza danej klasy. Co równie istotne, instancja klasy prywatnej również nie ma dostępu do jej prywatnych składników.
Przykład:
using System;
namespace ModyfikatoryDostepu
{
    class Program
    {
        // Tutaj dojdzie do wykonania kodu naszej klasy
        static void Main(string[] args)
        {
            Prostokat pr = new Prostokat();
            pr.PobierzDane();
            pr.WyswietlInformacje();
            Console.ReadKey();
        }
    }
    class Prostokat
    {
        // pola klasy
        private double szerokosc;
        private double wysokosc;
        public double ObliczPowierzchnie()
        {
            return szerokosc * wysokosc;
        }
        public void PobierzDane()
        {
            Console.WriteLine("Podaj szerokość: ");
            szerokosc = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Podaj wysokość: ");
            wysokosc = Convert.ToDouble(Console.ReadLine());
        }
        public void WyswietlInformacje()
        {
            Console.WriteLine("Szerokość: {0}", szerokosc);
            Console.WriteLine("Wysokość: {0}", wysokosc);
            Console.WriteLine("Powierzchnia: {0}", ObliczPowierzchnie());
        }
    }
}

W powyższym przykładzie pola klasy: szerokosc oraz wysokosc zdefiniowane są jako prywatne. Przygotowana została specjalnie metoda PobierzDane(), która ma dostęp do tych pól. Dopóki metody ObliczPowierzchnie() oraz WyswietlInformacje() są zdefiniowane jako publiczne dlatego mamy do nich dostęp z wnętrza metody Main() używając instancji klasy Prostokat o nazwie pr.

Protected

Modifikator dostępu protected pozwala klasie pochodnej uzyskać dostęp do pól i metody klasy bazowej. Takie zachowania pozwala na implementacje dziedziczenia. Temat ten zostanie omówiony bardziej szczegółowo w rozdziale dotyczącym wspomnianego wcześniej dziedziczenia.

Internal

Modifikator dostępu internal pozwala na wystawienie klasy, tj. jej pól oraz metod dla innych metod i obiektów, które znajadują się w danej bibliotece. Innymi słowy, każda składowa klasy z modyfikatorem dostęp internal może być dostępna z dowolnej klasy czy metody zdefniowanej w naszej aplikacji.
Przykład:
using System;
namespace ModyfikatoryDostepu
{
    class Program
    {
        // Tutaj dojdzie do wykonania kodu naszej klasy
        static void Main(string[] args)
        {
            Prostokat pr = new Prostokat();
            pr.szerokosc = 4.5;
            pr.wysokosc = 3.5;
            pr.WyswietlInformacje();
            Console.ReadKey();
        }
    }
    class Prostokat
    {
        // pola klasy
        internal double szerokosc;
        internal double wysokosc;
        double ObliczPowierzchnie()
        {
            return szerokosc * wysokosc;
        }
        public void WyswietlInformacje()
        {
            Console.WriteLine("Szerokość: {0}", szerokosc);
            Console.WriteLine("Wysokość: {0}", wysokosc);
            Console.WriteLine("Powierzchnia: {0}", ObliczPowierzchnie());
        }
    }
}

W powyższym przykładzie, możemy zauważyć, że metoda ObliczPowierzchnie() nie ma zdefiniowanego żadnego modyfikatora dostępu. W takim wypadku pojawia się pytanie: jaki będzie domyślny modyfikator dostępu dla takiej metody? Domyślnie jest to private.

Protected Internal

Modifikator dostępu protected internal pozwala klasie na ukrycie pól oraz metod przed innymi klasami lub metodami z wyjątkiem klas pochodnych w tej samej aplikacji. Modyfikator ten jest również używany przy wspomnianej wcześniej implementacji dziedziczenia.