Strona główna » Kursy » Kurs C# » Klasa
 

Klasa

Wstęp

Klasa to sposób reprezentacji właściwości oraz zachowań pewnego obiektu. Pozwala to podczas pisania programu stworzyć wirtualny obiekt i na nim następnie operować. W poniższym artykule zostanie przedstawione jak zdeklarować prostą klasę i ją wykorzystać w programie.

Terminologia

Klasa to zbiór cech oraz zachowań pewnego obiektu. Ich odpowiednikami w programie są kolejno zmienne klasy oraz metody, które na danej klasie można wywołać. Każde wystąpienie obiektu nazywamy instancją. Charakteryzuje się ona tym, że jej wartości cech są ustalone. Domyślnie klasa to tylko szkielet obiektu bez konkretnych wartości, aż do momentu utworzenia. Klasy mogą być hierachiczne tj. dziedziczyć po sobie pewne cechy oraz zachowania.

Implementacja

Poniżej została przedstawiona schematyczna deklaracja klasy:

  1. [dostęp] class nazwa_klasy
  2. {
  3.   ...
  4. }

W miejsce dostępu należy podać modyfikator dostępu do klasy np. private (prywatny) lub public (publiczny). Potem należy dopisać słowo kluczowe class, a następnie nazwę klasy, która powinna zaczynać się z duzej litery. Następnie idzie ciało funkcji wewnątrz nawiasów klamrowych. Program ma już zdefiniowaną pewną klasę i wie, że wszystkie zmienne oraz metody zostaną umieszczone właśnie w tych klamrach.

Zmienne deklaruje się w taki sam sposób jak zmienne. Należy jednak pamiętać, że tu też należy pamiętać, aby zastosować odpowiedni modyfikator dostępu. Zmienne oznaczone jako private będą dostępne tylko przez metody wewnątrz klasy, ale nie poza nią (np. poprzez odwołanie gdzieś w kodzie). Z kolei public pozwoli zmodyfikować wartość zmiennej z dowolnego miejsc w programie.

  1. [dostęp] typ nazwa [= wyrażenie]

Z kolei metody definiuje się jak każdą funkcję w programie.

  1. [dostęp] co_zwraca_typ nazwa_metody([argumenty])
  2. {
  3.   ...
  4. }

Dla metod też można ustawić modyfikator dostępu. Jest to bardzo ważne, ponieważ niektóre metody nigdy nie powinny zostać wywołane bezpośrednio przez programistę, a powinny przez sama klasę!

Każda instancja klasy zostaje utworzona poprzez inicjalizację. Ta odbywa się poprzez wywołanie konstruktora klasy. Konstruktor jest to metoda, która może przyjmować argumenty i jest wywoływany podczas tworzenia klasy.

  1. [dostęp] nazwa_klasy([argumenty])

Istnieje wiele różnych typów konstruktora, ale zazwyczaj jest on public (publiczny) i przyjmuje pewne argumenty początkowe obiektu.

Przykład

Obiekt

Przed przystąpieniem do napisania klasy warto zastanowić się co dany obiekt ma za właściwości i jak się zachowuje. Weźmy przykładowo pudełko. Taki obiekt ma pewien kolor oraz wymiary. Ponadto można go otworzyć/zamknąć, albo obliczyć objętość. Oczywiście w dwóch zdaniach ciężko wyczerpać ideę pudełka. Z tego powodu często tworzy się szkic klasy, a potem dopisuje się kolejne cechy i zachowania wraz z rozwojem oprogramowania.

Kod

Poniżej została przedstawiona przykładowa klasa Pudełko.

  1. class Pudełko {
  2.   public string opis;
  3.   private bool czyOtwarte;
  4.   private int objętość;
  5.   public Pudełko(int a, int b, int c) {
  6.     objętość = a * b * c;
  7.     czyOtwarte = false;
  8.   }
  9.   public void Otwórz() {
  10.     if (czyOtwarte) {
  11.       Console.WriteLine("Pudełko nie jest zamknięte!");
  12.     } else {
  13.       Console.WriteLine("Pudełko zostało otwarte");
  14.       czyOtwarte = true;
  15.     }
  16.   }
  17.   public void Zamknij() {
  18.     if (czyOtwarte) {
  19.       Console.WriteLine("Pudełko zostało zamknięte");
  20.       czyOtwarte = false;
  21.     } else {
  22.       Console.WriteLine("Pudełko nie jest otwarte!");
  23.     }
  24.   }
  25.   public int PodajObjętość() {
  26.     return objętość;
  27.   }
  28. }

Klasa ta ma trzy zmienne (2. - 4.) opis, czyOtwarta oraz objętość, ale tylko opis może być modyfikowany spoza klasy, ale wszystkie mogą być modyfikowane przez metody klasy. Klasa posiada (6. - 9.) konstruktor, który wymaga podania rozmiarów pudełka. Nastepnie (7.) na tej podstawie obliczana jest objętość oraz (8.) zostaje ustalone, że pudełko jest zamknięte. Metody Otwórz() oraz Zamknij() symulują otworzenie/zamknięcie pudełka. Jesli akcja jest niemożliwa to zostnie wypisany odpowiedni komunikat. Ostatnia metoda PodajObjętość() zwraca obliczoną objętosć.

Test klasy

Poniższy fragment kodu tworzy nową instację klasy Pudełko, a następnie wykonuje na nim pewne operacje.

  1. Pudełko p = new Pudełko(10, 10, 10);
  2. p.opis = "Skrytka";
  3. Console.WriteLine("{0} ma objętość {1} j^3", p.opis, p.PodajObjętość());
  4. p.Otwórz();
  5. p.Zamknij();
  6. p.Zamknij();

(1.) Zostaje utworzona nowa instancja klasy. Jedyny konstruktor wymaga podania rozmiarów, więc zostały one określone. Następnie (2.) został ustawiony opis pudełka. Należy tu zauważyć, że próba modyfikacji np. zmiennej objętość się nie powiedzie. Tak samo będzie z (3.) jej odczytaniem, dlatego wywoływana jest odpowiednia metoda. Taki sposób przekazywania danych chroni zmienną przed modyfikacją z zewnątrz, ale pozwala na dostęp do niej. Następnie (4. - 6.) pudełko zostaje otwarte i dwa razy zamknięte. Przy drugim zamknięciu zostanie wyświetlony komunikat, że pudełko nie jest otwarte.

Zadania

Zadanie 1

Napisz klasę Lampka w której będą przechowywane:

Kolor ramki powinien zostać ustalony podczas tworzenia klasy. Z kolei moc żarówki można zmienić poprzez metodę ZmieńŻarówkę(), a aktualną moc można odczytać poprzez wywołanie PodajMocŻarówki(). Status lampki poprzez metody Włącz() i Wyłącz(). Przetestuj działanie klasy.

Zadanie 2

Zmień sposób działania klasy Lampka nastepująco. Poczatkowo moc żarówki wynosi 0 co oznacza, że nie wkręcono żadnej żarówki. Przed zmianą żarówki lampka musi zostać wyłączona, a po zmianie włączona jeśli taka była przed zmianą żarówki. Lampka nie może być włączona jeśli nie ma żarówki. Przetestuj działanie zmodyfikowanej klasy.