Jedną z
najważniejszych cech dobrego programowania obiektowego jest dostarczenie
użytkownikowi takiego programu, który będzie nadawał się do dalszej rozbudowy
bez poprawy tego, co już zostało napisane. Jak taki cel osiągnąć? Po prostu
poprzez zaprojektowanie klasy w taki sposób, aby zabezpieczyć ją przed
ingerencją z zewnątrz. Innymi słowy, należy ukryć wewnętrzną strukturę
definiowanej przez nas klasy. Taki mechanizm nazywamy hermetyzacją. Często
pojęcie to określane jest enkapsulacją, bądź po prostu ukrywaniem danych.
Ukrywanie
wewnętrznej struktury obiektu jest bardzo ważne z kilku powodów. Po pierwsze,
obiekt taki jest odizolowany, a więc nie jest narażony na celowe, bądź
niezamierzone działanie ze strony użytkownika. Po drugie, obiekt ten na pewno
jest chroniony od niepożądanych referencji ze strony innych obiektów. Po
trzecie, obiekt taki – jeśli jest to tylko możliwe, nie wpływa na zmiany, czy
jakieś małe korekty wprowadzone w implementacji. Po prostu obie strony nie
kolidują wówczas ze sobą. I po czwarte, dzięki ukryciu wewnętrznej struktury
obiektu, można uzyskać jego przenośność. Innymi słowy, zastosować definiującą
go klasę w innym fragmencie kodu, czy też programie.
A więc jak
widzimy, poznane przez nas pojęcie hermetyzacji odgrywa w programowaniu
obiektowych ogromne znaczenie. Przejdźmy więc od razu do przykładu, który
będzie dotyczył enkapsulacji.
public class Punkty
{
private int a;
private int b;
//definicja metod, ktore beda pobierac wartosci a i b
public int GetA()
{
return a;
}
public int GetB()
{
return b;
}
//definicja
metod, ktore beda zmieniac wartosci a i b
public void SetA(int nowyA)
{
this.a = nowyA;
}
public void SetB(int nowyB)
{
this.b = nowyB;
}
}
public class Glowna
{
static void Main()
{
//deklarujemy
obiekt p klasy Punkty
Punkty
p = new Punkty();
//przypisanie
odpowiednich wartosci zmiennym w obiekcie p
p.SetA(10);
p.SetB(20);
//pobranie
odpowiednich wartosci ze zmiennych obiektu p
int wart1 = p.GetA();
int wart2 = p.GetB();
System.Console.WriteLine("Współrzędne punktu wynoszą: {0}.{1}",
wart1, wart2);
}
}
W klasie Punkty
zadeklarowaliśmy sobie dwie zmienne składowe (a i b), które są liczbami całkowitymi i będą stanowić współrzędne
danego punktu. Zadeklarowaliśmy sobie również 2 metody (GetA() oraz GetB()),
które będą pobierać wartości, jakie są przechowywane w tych zmiennych. Klasa Punkty dostarcza nam również dwie metody
(SetA() oraz SetB()), dzięki którym będziemy przypisywać zmiennym składowym nowe
wartości.