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.