Strona główna » Kursy » Kurs C# » Właściwości Klasy
 

Właściwości Klasy

Wstęp

Hermetyzacja klasy pozwala na zapewnienie działalności klasy poprzez eliminację możliwości ingerencji w nieodpowiednie fragmenty kodu. W celu uproszczenia dostępu do prywatnych zmiennych w języku C# można znaleźć właściwości.

Definicja

Właściwości deklaruje się bardzo podobnie do funkcji. Ich zaletą jest jednak fakt, że w bardzo prosty sposób można dopisać co ma się stać kiedy wartości zostanie pobrana oraz co ma się stać kiedy wartość zostanie ustawiona. Co więcej można modyfikować czy zmienna jest do odczytu/zapisu.

Oto przykładowy schemat zapisu właściwości:

  1. [dostęp] class nazwa_klasy
  2. {
  3.   ...
  4.  
  5.   [dostęp] typ właściwość {
  6.     get {
  7.       ...
  8.       return zm1;
  9.     }
  10.     set {
  11.       ...
  12.       zm2 = value;
  13.     }
  14.   }
  15.  
  16.   ...
  17. }

Właściwość deklaruje się wewnątrz klasy. (5.) Dostęp do niej można ograniczyć poprzez ustawienie prywatności (np. private lub public). Wewnątrz znajdują się dwie klauzule get oraz set. Co najmniej jedna z nich musi zostać zadeklarowana. W get należy (8.) zwrócić pewną wartość, która jest typu takiego samego jak typ właściwości. Z kolei w set wartość do przypisania (9.) odczytuje się słowem kluczowym value.

Zaletą takiego rozwiązania jest fakt, że dzięki temu pomija się pisanie dwóch dodatkowych funkcji w klasie, a ponadto do właściwości nie trzeba odwoływać się jak do funkcji poprzez nawiasy okrągłe na końcu.

  1. obiekt.właściwość
  2. obiekt.właściwość = coś

Implementacja

Licznik

Przypuśćmy, że potrzebna jest klasa Licznik, która będzie przechowywała pewną wartość całkowitą i będzie umożliwiała odczytanie stanu licznika oraz jego zwiększenie, ale osoba korzystająca z klasy nie będzie miała dostępu do zmiennej nr w klasie. Wtedy klasa będzie wyglądać następująco:

  1. class Licznik {
  2.   private int nr = 0;
  3.   public int Wartość {
  4.     get { return nr; }
  5.     set { nr = value; }
  6.   }
  7.   public void Zwiększ() {
  8.     nr++;
  9.   }
  10. }

(2.) Zmienna nr jest ustawiona na prywatną, więc nie mam do niej dostępu z zewnątrz. Dostęp do tej zmiennej (4. - 7.) możliwy jest poprzez właściwość Wartość, która pozwala na odczytanie i ustawienie tej zmiennej. Dodatkowo została napisana metoda (9. - 11.) Zwiększ(), która pozwala na zwiększenie licznika.

Klasę Licznik można wykorzystać w następujący sposób:

  1. Licznik licznik = new Licznik();
  2. Console.WriteLine(licznik.Wartość);
  3. licznik.Zwiększ();
  4. Console.WriteLine(licznik.Wartość);
  5. licznik.Wartość = 10;
  6. Console.WriteLine(licznik.Wartość);

Na konsolę zostanie kolejno wypisanie (2.) 0, (4.) 1 oraz (6.) 10. Dla prostych klas właściwości wydają się dość sztuczne, ale przy większych projektach są one powszechnie stosowane, ponieważ zmiana pewnej zmiennej może wywołać potrzebę odświeżenia wyników zwracanych przez klasę.

Odległość

Właściwości mogą mieć jednak praktyczne zastosowanie już podczas tworzenia klasy do przechowywania odległości. Jak wiadomo istnieje różnych jednostek, którymi można opisywać odległość. Wykorzystanie zwykłej zmiennej zmusza do pamiętania w jakiej jednostce została podana miara. Co jednak, gdyby to klasa nadzorowała zmianę jednostki?

Przypuśćmy, że chcemy napisać program w którym istnieje potrzeba pobrania odległości raz w milach, a raz w metrach. Opisują one tą samą długość w rzeczywistym świecie, więc nie istnieje przechowywania ich równocześnie. Możemy ustalić, że dane będą przechowywane w metrach i jeśli zajdzie potrzeba odpowiednio przeliczone. Przyjmujemy, że 1 mila to 8534,3 metra.

  1. class Odległość {
  2.   private const double mn_mila = 8554.3;
  3.   private double odl = 0;
  4.   public double WartośćMetr {
  5.     get { return odl; }
  6.     set { odl = value; }
  7.   }
  8.   public double WartośćMila {
  9.     get { return odl / mn_mila; }
  10.     set { odl = mn_mila * value; }
  11.   }
  12. }

Na początku deklarujemy dwie zmienne: (2.) stałą zmienną używaną do przeliczania metrów na mile i odwrotnie oraz (3.) aktualnie zapisaną odległość. Podczas odczytywania wartości (5. - 8.) wystarczy jedynie odczytać/zapisać wartość. Jednak, gdy chcemy przypisać wartość z jednostce mila to (10. - 13.) odpowiednia przeliczamy wartość zwracaną/wczytaną. Dzięki temu odległość w zmiennej odl zawsze jest w metrach.

Klasę Odległość można wykorzystać w następujący sposób:

  1. licznik.Zwiększ();
  2. Console.WriteLine(licznik.Wartość);
  3. licznik.Wartość = 10;
  1. 1 mila = 8554,3 m

Zadania

Zadanie 1

Napisz klase Pudełko, która pozwoli na Wkładanie i Wyjmowanie dowolnej liczby elementów. Podczas wyjmowania nie wolno wyjąć więcej elementów niż to możliwe! W każdej chwili powinna istnieć możliwość sprawdzenia ile elementów jest w pudełku. Zmienna przechowująca elementy ma być prywatna! Przetestuj działanie napisanego kodu.