Professional Documents
Culture Documents
Klasy
Klasy
Nazwa klasy powinna wskazywać na obiekty, jakie będzie można na jej podstawie
tworzyć. Jeśli obiektami mają być pracownicy, to dobrą nazwą dla takiej klasy jest wyraz
Pracownik. Obok obowiązkowych zasad dotyczących nazewnictwa w C# (takich samych jak
w przypadku nazw zmiennych i metod), istnieją dodatkowe zalecane standardy odnośnie 151
nazywania klas. Zgodnie z tymi zaleceniami, nazwy klas powinno się tworzyć przy pomocy
rzeczowników lub rzeczowników z przymiotnikami (zazwyczaj w liczbie pojedynczej).
Ponadto zaleca się, aby nazwy klas zaczynały się z dużej litery, a jeśli nazwa ma kilka słów,
kolejne słowa także powinny zaczynać się z dużej litery, np. PracownikZwolniony.
Skoro klasa ma być szablonem, na podstawie którego tworzone będą obiekty, należy ten
szablon odpowiednio zdefiniować. Budowę klasy opisuje szereg elementów, zostały one
zgrupowane i przedstawione na rysunku oraz w składni.
- atrybuty,
- dostęp do klasy, Elementy danych
- rodzaj klasy,
- nazwa klasy,
- klasa bazowa
(interfejsy bazowe). Elementy funkcyjne
Na rysunku widoczne są dwie grupy elementów składających się na budowę klasy: opis
klasy oraz elementy klasy (zawarte w ciele klasy). Składnia wygląda następująco:
Składnia 6.1
[Atrybuty][Modyfikatory] class Nazwa [:lista elementów bazowych]
{
Ciało klasy
}
Opis klasy (deklaracja klasy) zawiera dwa elementy obowiązkowe – słowo kluczowe
class oraz nazwę klasy (identyfikator), a ponadto może zawierać kilka informacji
opcjonalnych, opisujących charakter klasy. W prezentowanej składni opis klasy zawiera się w
pierwszej linii. Ciało klasy (w składni ujęte w klamrach) definiuje zawartość szablonu (klasy),
na podstawie którego będą tworzone obiekty. Poszczególne składowe opisu klasy oraz
budowa ciała klasy zostaną przedstawione w dalszej części podrozdziału.
152
W opisie klasy, obok słowa kluczowego class oraz nazwy klasy (które są obowiązkowe)
występować mogą dodatkowe dane opisujące klasę: atrybuty, dostęp do klasy, rodzaj klasy
oraz elementy bazowe (po których dziedziczy klasa). Zasady odnośnie tworzenia nazwy
klasy są takie same jak w przypadku zmiennych i metod, a o dodatkowych zaleceniach
pisaliśmy pod koniec podrozdziału 6.1. Atrybuty są opisowymi znacznikami, których można
używać do tworzenia uzupełniających informacji na temat typów (klas), elementów i
właściwości. W tym podręczniku nie będziemy omawiać tego zagadnienia. Dostęp do klasy
określa dostępność do klasy z zewnątrz (z innych klas). Dostęp do klasy definiuje się poprzez
tzw. modyfikatory dostępu (które zostaną wkrótce omówione). Można wyróżnić kilka
rodzajów klasy: klasa abstrakcyjna (abstract), klasa nie podlegająca dziedziczeniu (sealed),
klasa statyczna (static) oraz „zwykła” klasa. W przypadku tworzenia klasy innej niż ta
ostatnia należy umieścić modyfikator rodzaju klasy. Każda klasa może dziedziczyć po innej
klasie oraz implementować jeden lub więcej interfejsów, wówczas w opisie klasy należy
wskazać po dwukropku nazwę klasy bazowej (czy interfejsów). Interfejsy oraz zagadnienie
dziedziczenia zostaną w tym podręczniku jedynie wstępnie przestawione pod koniec
rozdziału.
Spośród wymienionych opcjonalnych elementów opisu klasy opiszemy szerzej jedynie
modyfikatory (modyfikatory dostępu oraz modyfikatory określające rodzaj klasy). Pozostałe
nie będą w początkowym etapie tworzenia własnych klas potrzebne.
Modyfikatory dostępu do klasy
Można wyróżnić pięć rodzajów modyfikatorów dostępu: public, private, protected,
internal oraz protected internal. Przy opisie modyfikatorów używa się terminu zestaw (ang.
assembly) – wykonywalny kod programów w środowisku .NET jest umieszczany w tzw.
zestawach (inne polskie nazwy to kompilat, podzespół, pakiet). Modyfikator public oznacza,
że klasa jest dostępna z poziomu każdego zestawu. Modyfikatory private oraz protected
dotyczą tylko klas zagnieżdżonych – private oznacza, że dostęp ogranicza się do klasy
zawierającej (czyli tej, w której dana klasa jest zagnieżdżona), a protected ponadto daje
dostęp klasom potomnym klasy zawierającej. W przypadku modyfikatora internal dostęp
dotyczy klas z tego samego zestawu – jest to domyślny modyfikator klasy. Modyfikator
protected internal oznacza, że dostęp ogranicza się do danego zestawu oraz klas potomnych
względem klasy zawierającej. W naszych pierwszych klasach będziemy używać modyfikatora
public i na razie nie jest konieczne, aby Czytelnik dobrze rozumiał wszystkie wymienione
modyfikatory.
Modyfikatory określające rodzaj klasy
Dla „zwykłej” klasy nie umieszcza się żadnego modyfikatora dla określenia rodzaju.
Istnieją jednak pewne klasy specjalne, dla których jest to konieczne. Wyróżnia się trzy 153
modyfikatory określające rodzaj klasy:
Zgłoś uwagę do tej strony pod adresem http://c-sharp.ue.katowice.pl/form.php?strona=153
Wstęp do programowania w C#
Wśród elementów klasy możemy wyróżnić dwie grupy: elementy danych oraz elementy
funkcyjne, co odzwierciedla charakterystyczne w programowaniu obiektowym powiązanie
danych i zachowania (tego co się z danymi dzieje). Elementy danych przechowują niezbędne
do działania obiektu dane (np. w klasie Osoba – nazwisko osoby, jej wiek, adres itp.).
Elementy funkcyjne to zdefiniowane w klasie bloki kodu umożliwiające klasie wykonywanie
określonych prac na obiektach. W stosunku do wszystkich elementów klasy (danych i
funkcyjnych) można zdefiniować dostęp poprzez modyfikatory dostępu.
Modyfikatory dostępu
Modyfikatory dostępu, zarówno w przypadku dostępu do elementów klasy jak i do całej
klasy – są takie same. Interpretacja w kontekście elementów klasy wydaje się być nieco inna,
co wynika z faktu, że modyfikatory private i protected dotyczą tylko składowych klasy
(zatem w kontekście klas dotyczą jedynie klas zagnieżdżonych). Ale faktycznie to są te same
modyfikatory, opiszemy je ponownie, uwzględniając tym razem kontekst elementów klasy.
Modyfikator public oznacza, że dany element klasy jest dostępny zarówno z wnętrza jak i
spoza klasy. Modyfikator private oznacza, że element jest dostępny tylko z wnętrza klasy –
154 ten modyfikator jest domyślny dla elementów klasy. Modyfikator protected daje dostęp do
danego elementu z wnętrza klasy oraz klasom pochodnym. W przypadku modyfikatora
Zgłoś uwagę do tej strony pod adresem http://c-sharp.ue.katowice.pl/form.php?strona=154
Rozdział 6. Wprowadzenie do tworzenia klas
internal dostęp dotyczy klas z tego samego zestawu. Modyfikator protected internal
oznacza, że składowa zadeklarowana jest widoczna z wnętrza klasy, w której została
zadeklarowana (lub klasy pochodnej od niej) oraz z wnętrza zestawu, w którym się znajduje.
W analogii do portali społecznościowych takich jak facebook, możemy powiedzieć, że te
dane, które użytkownik portalu udostępnia wszystkim są „public”, dane dostępne tylko dla
użytkownika są „private”, natomiast dostęp dla znajomych odpowiada modyfikatorowi
„protected”. W naszych przykładowych programach będziemy używać tylko modyfikatorów
public i private.
Elementy danych
Elementy danych to tzw. pola (lub po prostu dane). Składnia definicji pojedynczej danej
wygląda następująco:
Składnia 6.2
[Modyfikatory] typ Nazwa [= wartość domyślna];
56
156 Testując przykłady z rozdziału 6 należy wkleić cały kod przykładu w miejsce pustej sekcji class Program {},
wpisanej automatycznie przez środowisko Visual Studio.
Elementy funkcyjne:
57
Jeśli konstruktor ma być wykorzystywany standardowo, tzn. do tworzenia obiektów to musi być publiczny.
Ale pamiętajmy, że dla klas statycznych (zawierających składowe statyczne) nie ma potrzeby tworzenia
obiektów (np. w celu wykorzystania metod z klasy Math nie tworzyliśmy obiektów), wówczas konstruktor 157
mógłby być prywatny.
Omówiona klasa została zdefiniowana w celu jej użycia, tzn. tworzenia obiektów na jej
podstawie oraz wykonywania określonych operacji na tych obiektach. Program z przykładu
6.2 wykorzystamy do omówienia deklaracji obiektu oraz wywoływania metody dla obiektów.
Przykład ten po drobnych modyfikacjach będzie analizowany w tym podrozdziale jeszcze
kilkakrotnie, a w każdym z wariantów będzie akcentowane konkretne zagadnienie.
58
Tworzenie obiektów i wywoływanie konstruktora – to nie jest jedyna rola operatora new w języku C#. Na
stronie dokumentacji MSDN opisane są wszystkie role http://msdn.microsoft.com/en-gb/library/51y09td4.aspx
158 („new C# Reference”), jednak na obecnym etapie nauki wystarczy znajomość operatora new w roli jaką tu
omawiamy.