Klasy
Przegląd zagadnień
Na zajęciach tego modułu studenci nauczą się tworzyć klasy, wraz ze zmiennymi składowymi i metodami, w języku C#. Na początku powtórzone zostaną pojęcia klasy i instancji, wprowadzone na poprzednich laboratoriach, aby mieć pewność, że te absolutnie fundamentalne pojęcia są dobrze rozumiane i rozróżniane.
Obok kodu w języku C# pojawią się schematy UML odpowiadające definiowanym i wykorzystywanym w przykładach klasom, które stosuje się w inżynierii programowania w diagramach klas.
Celem zajęć będzie zdobycie umiejętności tworzenia instancji klas, wykorzystanie konstruktorów oraz poznanie składowych statycznych.
Zajęcia kończą się podsumowaniem i pytaniami sprawdzającymi, po czym studenci wykorzystają praktycznie swoje umiejętności w środowisku Visual Studio 2005.
Obiekty wokół nas
Jak wspominaliśmy na poprzednich zajęciach, w otaczającym nas świecie bez trudu można wskazać wiele obiektów.
Obiekty podobne ze względu na strukturę - cechy i zachowanie - należą do jednej klasy, na przykład uczestnicy kursu należą do klasy student, przejeżdżające lub zaparkowane przed uczelnią samochody należą do klasy pojazd.
Wśród obiektów dostrzec można pewną hierarchię klas - mamy samochody osobowe, jak i ciężarowe, jednak obie te klasy możemy włączyć do klasy pojazd.
Definicja klasy i instancji
Sama klasa student czy pojazd nie istnieje w rzeczywistości: jest to tylko opis, prototyp wszystkich obiektów, które należą do tej klasy - mają określone w niej cechy i zachowanie. Tak też definiujemy klasę.
Klasa pojazd może zatem zawierać: liczbę osi, moc silnika, masę, maksymalną prędkość, a zachowaniem pojazdu jest jego poruszanie się, spalanie paliwa i tak dalej. Klasa student może się składać z nazwiska studenta, numeru indeksu, roku studiów, do regulaminowych zachowań należy uczestniczenie w wykładach.
Obiekty, z którymi mamy do czynienia w rzeczywistym świecie, są instancjami - czyli egzemplarzami - różnych klas. Jeden z naszych kolegów jest więc studentem o znanym nam nazwisku, pewnym numerem indeksu i znanym roku studiów; chodzącym na określone wykłady.
Instancje klas to zatem obiekty, które mają zestaw cech opisanych przez tą klasę wraz z przypisanymi wartościami oraz zachowujących się w sposób również opisany przez klasę.
Składowe klasy
Powiedzieliśmy, że klasa opisuje zestaw cech i zachowanie obiektu. W programowaniu obiektowym odpowiadają temu składowe klasy. Składowymi klasy mogą być przede wszystkim zmienne składowe - liczby, napisy, zmienne logiczne, oraz metody, które stanowią funkcjonalność obiektu.
Ponadto klasy definiowane w języku C# mogą zawierać obiekty, właściwości czy definicje wewnętrznych klas, o czym później.
Dla przykładu weźmy klasę drzwi, której przynajmniej jedna instancja powinna znajdować się w zasięgu wzroku. Na pierwszy rzut oka można określić takie cechy, jak kolor drzwi oraz to, czy drzwi są otwarte. Wiemy też, że drzwi można otwierać i zamykać.
Jeśli chcielibyśmy utworzyć model tego wycinka rzeczywistości w języku obiektowym, zdefiniujemy klasę drzwi o zmiennych składowych: kolor (łańcuch znaków) i zmienną logiczną określającą, czy drzwi są otwarte. Klasa drzwi będzie miała również dwie metody - otwórz i zamknij.
Na slajdzie znajduje się schemat klasy drzwi w języku UML (Unified Modeling Language), wykorzystywanym w projektowaniu i inżynierii oprogramowania. Schemat składa się z trzech części - w pierwszej podana jest nazwa klasy, poniżej wymienione są zmienne składowe tej klasy oraz ich typ, w dolnej części podane są metody tej klasy.
Definicja klasy
Klasę drzwi możemy zdefiniować w języku C# następująco. Rozpoczynamy od słowa kluczowego class. Po nim podajemy nazwę klasy. Składowe klasy umieszczane są wewnątrz bloku oznaczonego klamrami.
Kolejno deklarowane są zmienne składowe: ich typ oraz nazwa. Niżej znajdują się definicje metod - to proste funkcje, w tym przypadku nie przyjmujące żadnych parametrów ani nie zwracające żadnego wyniku (słowo kluczowe void).
Słowo kluczowe public zostanie wyjaśnione na kolejnych zajęciach.
Instancjonowanie klas (1)
Po zdefiniowaniu klasy (w projekcie C# zapisujemy klasę w nowym pliku), z programu możemy utworzyć jej instancję.
Instancję tworzy się za pomocą słowa kluczowego new, instancja otrzymuje nazwę. Składnia podana jest na slajdzie: tworzymy tu instancję klasy Drzwi o nazwie mojeDrzwi.
Na slajdzie pokazany jest również schemat UML instancji klasy, jakiego używa się w diagramach obiektów. W górnym polu podana jest nazwa instancji (podkreślona) oraz jej klasa (po dwukropku). Pozostała część schematu nie zmieniła się.
Po utworzeniu instancji klasy, można korzystać z jej zmiennych składowych i metod, podając nazwę instancji i po kropce zmienną lub metodę.
Na przykładzie przypisujemy zmiennej składowej Kolor wartość zielony i przypisujemy wartość zmiennej składowej Otwarte do zmiennej logicznej stanDrzwi. Niżej wywołujemy metody Otworz() i Zamknij().
Instancjonowanie klas (2)
Definiując klasę, możemy napisać konstruktor - czyli metodę, która uruchomi się automatycznie przy tworzeniu instancji tej klasy. Konstruktor w języku C# jest metodą o tej samej nazwie co klasa.
W przykładzie na slajdzie tworzymy konstruktor klasy Drzwi, który przyjmuje jako parametr zmienną - łańcuch znaków. Przy tworzeniu instancji klasy Drzwi, konstruktor przypisze wartość łańcucha do zmiennej składowej Kolor, po czym wyświetli w konsoli komunikat o zbudowaniu nowego obiektu o podanym kolorze.
Niżej przykład utworzenia instancji przy wykorzystaniu konstruktora.
Na schemacie UML klasy pojawił się konstruktor oznaczony przez słowo <<constructor>>.
Instancjonowanie klas (3)
W niektórych językach obiektowych można nie tylko tworzyć, ale i usuwać obiekty, gdy przestaną być już potrzebne w programie. W C# obiekty usuwane są automatycznie gdy program przestaje z nich korzystać. Na moment usunięcia nie mamy wpływu, ale możemy wyzerować instancję poleceniem podanym na dole slajdu.
Podobnie jak w przypadku konstruktora, możemy napisać metodę, która będzie uruchamiana podczas usuwania obiektu - destruktor. Metodę destruktora oznaczamy przez tyldę i nazwę klasy.
Przykład na ekranie w momencie usuwania obiektu wyświetli komunikat w oknie konsoli.
Obiekty składowe
Jak wspomniano na początku tych zajęć, w skład klasy mogą wchodzić nie tylko zmienne składowe prostych typów (liczbowych, logicznych, łańcuchowych), mogą to być również obiekty innych klas.
Na przykładzie widzimy definicje dwóch klas: Silnik oraz Pojazd. W skład klasy Pojazd wchodzi między innymi obiekt klasy Silnik.
Na schemacie UML przedstawiona została ta sytuacja. Ten rodzaj relacji między klasami nazywany jest agregacją - do budowy jednej klasy wykorzystano drugą. Agregację oznaczamy strzałką z pustym rombem. Można zwrócić uwagę, że niezależnie od tworzenia instancji klasy Pojazd możemy utworzyć samą instancję klasy Silnik.
Składowe statyczne (1)
Niektóre składowe klasy możemy oznaczyć jako statyczne - będą miały wówczas dwie cechy:
będzie można z nich korzystać nawet, gdy nie ma instancji danej klasy,
będą występowały tylko w jednym egzemplarzu, niezależnie od liczby utworzonych instancji tej klasy.
Definiujemy przykładową klasę Bilet. Klasa ma statyczny Licznik oraz statyczną metodę IleWydano(). Nie tworząc instancji, można już korzystać z tych składowych.
Ponadto mamy zmienną składową Numer oraz konstruktor. Zwróćmy uwagę, że konstruktor zwiększa statyczny Licznik i przypisuje jego wartość do zmiennej Numer.
Uwaga - metody statyczne nie mogą korzystać ze składowych klasy, które nie są statyczne!
Na schemacie UML zmienna i metoda statyczna oznaczone są podkreśleniem.
Składowe statyczne (2)
Jak wspomniano przed chwilą, nawet nie tworząc instancji klasy Bilet możemy korzystać z jego statycznych składowych. W przykładzie odwołujemy się do statycznej metody IleWydano(). Metoda zwraca stan licznika, który na początku wynosi 0.
Następnie tworzymy instancję klasy Bilet. Konstruktor zwiększy licznik i przypisze jego stan jako numer biletu. Numer zostanie wyświetlony w oknie konsoli.
Tworzymy drugą i trzecią instancję klasy. Każdy z utworzonych w ten sposób biletów będzie miał inny numer, natomiast statyczny licznik będzie pokazywał liczbę utworzonych instancji.
Podsumowanie
Na zajęciach powtórzono definicję klasy i jej instancji. Podana została składnia definicji klasy w języku C#, wraz z jej składowymi. Omówiony został sposób tworzenia instancji klasy oraz dostęp do jej składowych.
Studenci zapoznali się z pojęciem i implementacją konstruktora i destruktora klasy oraz ze statycznymi składowymi klasy.
Pytania sprawdzające
Pytania sprawdzające wiedzę przyswojoną podczas tych zajęć:
Jakie są składowe klasy?
W jaki sposób definiujemy klasę i tworzymy jej instancje?
Czym są składowe statyczne?
Laboratorium
W ramach ćwiczeń, korzystając z umiejętności zdobytych na zajęciach, studenci piszą w języku C# klasy według poniższych poleceń.
Napisz kilka klas reprezentujących obiekty, które znajdują się w laboratorium. Utwórz po kilka ich instancji. Dodaj klasy do diagramu klas.
Laboratorium ma kilka drzwi, którymi można wejść lub wyjść - specjalne czujniki rozpoznają te sytuacje. Wszystkie drzwi blokowane są elektrycznym ryglem, który może odblokować tylko uprawniona osoba (podaje kod). Gdy z sali wyjdzie ostatnia osoba, drzwi są automatycznie blokowane. Napisz oprogramowanie dla tego systemu.
Napisz klasę, będącą modelem samochodu. Uwzględnij jak najwięcej cech i funkcjonalności (na przykład dane administracyjne, charakterystyka modelu, kierowanie i ruch, przewóz towarów, spalanie paliwa…). Dodaj klasę do diagramu klas.
L
L