Jason. Cała informatyka w jednym miejscu!

Materiał przedstawia wprowadzenie do programowania w paradygmacie obiektowym w C# :O!!! Poznacie tutaj nie tylko samą definicję klasy, ale także jak ją utworzyć, jakie są jej możliwości oraz jakie zasady mają być przestrzegane. A pierwszy krok do obiektowości zawdzięczamy słowu kluczowemu "class" w języku C#. Od Was wymaga się jedynie wejścia do środka artykułu, ja już przedstawię resztę :).

"CLASS" W JĘZYKU C# ZAPEWNI CI WSZYSTKO, CO OBIEKTOWE!

Klasa to kręgosłup każdego nowo powstałego obiektu. Najprostsze co można o niej powiedzieć to to, że jest to szablon albo wzorzec dla obiektu. Obiekt bowiem to kopia klasy, lecz dużo częściej będziecie spotykać termin "instancja" (ang. instance). Zatem, już pierwszą rzeczą jaką możecie zrobić w kierunku rozumienia obiektowości to to, jaka jest różnica pomiędzy obiektem, a klasą. Klasa to de facto nowy niestandardowy typ danych. Obiekt to kopia klasy tworzona na jej podstawie.

DEFINICJA KLASY W KODZIE ŹRÓDŁOWYM

Obserwując kod źródłowy, klasę dostrzeżecie natychmiast po tytułowym słowie kluczowym. "class" w języku C# zawsze będzie oznaczać definicję klasy niestandardowej, która będzie wykorzystywana bezpośrednio albo pośrednio w programie. Tak wygląda sam szkielet klasy, "rozebrany" ze wszystkiego co może w sobie mieć (szczegóły w dalszej części treści):

class MyClass
{
	
}

Co widzimy oprócz słowa "class"? Podaną etykietę, za pomocą której będziemy mogli się odwoływać do klasy celem jej użycia. Występuje niewielka część zasad dotyczących nazewnictwa, która także opisana jest w jednym z poniższych akapitów. Poza tym, para klamerek (czy też nawiasów klamrowych) określających granicę miejsca przeznaczonego na zawartość niniejszej klasy.

ISTNIEJĄ RÓŻNE RODZAJE KLAS

Choć dopiero startujemy z tak ważnym zagadnieniem jakim jest obiektowość i wykorzystywanie jej w aplikacji, to jednak muszę Was uświadomić, że klasa może być bardziej specyficzna od jej klasycznego wyglądu. Otóż jeżeli się dobrze przyjrzeć i wydobyć na wierzch wszyściusieńkie typy jakie oferuje "class" w języku C#, to poza tą najbardziej podstawową znajdziecie również:

  1. klasę potomną,
  2. klasę abstrakcyjną,
  3. klasę zapieczętowaną,
  4. klasę zagnieżdżoną,
  5. klasę statyczną,
  6. klasę częściową.

Sporo tego i wszystkie z nich zostaną opisane bardzo szczegółowo w odrębnych porcjach przygotowanego materiału. Niech nie dane Wam będzie bać się tych terminów, gdyż wraz z nabywaniem doświadczenia w tym kierunku to, jakiego typu klasy użyć albo jaki będzie najbardziej adekwatny, będzie samo przychodzić do głowy.

DANE SKŁADOWE KLASY, CZYLI ZMIENNE W KLASIE

Tak można by to określić dosłownie czym są dane składowe. Nie przez przypadek nazywa się to raczej "danymi składowymi", a w C# ponadto panuje też stwierdzenie, że są to pola. Takie pole to pojedyncza zmienna umieszczona wewnątrz klasy, która stanowi jeden z jej dwóch podstawowych budulców. Element ten stanowi przechowywanie "stanu klasy". To znaczy jakimi wartościami będzie dysponować obiekt, który "narodził się" dzięki niniejszej klasie.

Dane składowe umieszczamy zawsze wewnątrz klamerek, które w sposób naturalny określają granice dla istnienia danych klasy. Tak może wyglądać przykładowe pole (zmienna), którym będzie dysponować klasa oraz każdy nowo powstały obiekt:

class MyClass
{
	public int x;
}

Mamy prawo do jednoczesnej deklaracji i definicji takiej zmiennej przez co nie będzie przyjmowała wartości domyślnej, tylko tę podaną przez nas jawnie:

class MyClass
{
	public int x = 50;
}

Ważnym jest aby pamiętać, że żadna dana składowa nigdy nie jest niezainicjowana, jeżeli nie podamy żadnej wartości samodzielnie (w przeciwieństwie do zmiennej występującej poza klasą)! Wówczas przyjmuje ona wartość domyślną zgodną z jej typem według określonych standardów (np. dla każdego typu reprezentującego liczbę całkowitą, przyjmie wartość 0). To nam zapewnia "class" w języku C#.

METODY KLASY, CZYLI FUNKCJE W KLASIE

Pamiętacie jak Wam to rozróżniałem podczas pogadanki o funkcjach? To już wiecie, że przyjmuje się powszechnie, że "metodą" jest funkcja będąca częścią klasy. Tak jest w rzeczywistości. To jest ten drugi budulec klasy pozwalający opisywać jej "zachowanie", czyli jakie czynności może wykonywać obiekt powstały na bazie tej klasy.

Ponieważ już macie pojęcie w jaki sposób definiuje się funkcje, to nie zdziwi Was w jaki sposób się to robi w stosunku do klasy ;):

class MyClass
{
	public void DoSomething()
	{
		// instrukcje
	}
}

Nic przerażającego. Definicja funkcji umieszczona w klasie przez co natychmiast "awansuje" na metodę. I tak też powinna być określana każda funkcja będąca częścią klasy lub innej konstrukcji (np. interfejsu).

KONWENCJE NAZEWNICZE

Dwa słowa o zasadach nazewnictwa klasy, zarówno tych obowiązków, jak i zalecanych. Co do obowiązkowych, to nic się nie zmienia w porównaniu do nazywania zmiennych, czyli żadnych spacji, żadnych cyfr na początku, żadnych znaków specjalnych na początku, zakazane są również zarezerwowane słowa kluczowe. Jakie zaś są zalecenia? Sugeruje się, żeby nazwa klasy (umieszczona zaraz po "class" w języku C#) ZAWSZE zaczynała się wielką literą i była pozbawiona znaków podkreślenia, czyli 100% pisowni na styl "PascalCase".

TWORZENIE OBIEKTU NA PODSTAWIE KLASY

Przechodzimy do przedostatniego podpunktu dzisiejszego materiału i pokażę Wam jak prawidłowo utworzyć obiekt na bazie naszej klasy. Wystarczy tylko przejść do innego miejsca w kodzie poza naszą klasą, utworzyć sobie zmienną typu tej klasy i przypisać jej referencję do obiektu posługując się taką oto instrukcją:

MyClass mc = new MyClass();

Teraz się wyjaśnia czemu klasę można określić także jako nowy typ danych. Gdyż nazwę klasy podstawiamy w miejsce typu zmiennej! Po niej oczywiście identyfikacja zmiennej czyli własna nazwa, a po operatorze przypisania alokujemy pamięć dla obiektu przy pomocy kombinacji słowa kluczowego "new" oraz ponownie podanej (tej samej) nazwy klasy. Zaraz po niej, obowiązkowa para nawiasików okrągłych z powodu możliwości określenia czy klasa ma przyjmować jakieś parametry w momencie inicjowania obiektu. O samych konstruktorach będzie przytoczenie już w osobnym artykule.

PRAWDA O WARTOŚCI ZMIENNEJ OBIEKTOWEJ

Akapit wstecz wspomniałem o ważnym procesie jaki zachodzi w miejscu instrukcji z "new". Musicie o tym wiedzieć bezapelacyjnie! W rzeczywistości, tworząc nowy obiekt nie powstaje on tak samo jak dowolny typ prosty np. wartość logiczna, tylko przeznaczona jest dla niego odpowiednia ilość wolnej pamięci na tzw. stercie - strukturze danych przechowującej dynamiczne byty. A obiekt jest jak najbardziej takim bytem, ponieważ nigdy nie można określić z góry sztywnej (zawsze takiej samej) ilości pamięci. Każdy z nich będzie wymagać niestandardowej liczby komórek pamięci, gdyż występują różne klasy o różnych budowach. Jedno "class" w języku C# może mieć tysiące danych składowych, a drugie "class" tylko paręnaście.

Przypisanie również skrywa tajemnicę. Nie przypisujemy tak naprawdę samego obiektu, tylko odniesienie do niego poprzez adres w systemie szesnastkowym. Jeszcze piękniej, wręcz encyklopedycznie, określa się to "referencją". Referencja w tym przypadku objawia się w postaci adresu do tego obiektu, który stanowi swoistą "plakietkę" albo identyfikator pozwalający jednoznacznie określić miejsce jego występowania w pamięci.

Zrozumienie powyższych informacji spowoduje "wskoczenie" przez Was samych na wyższy poziom rozumowania programowania. To nie jest nic wyjątkowego dla tego języka wysokiego poziomu. Ten sam mechanizm znajdziecie wszędzie tam, gdzie mowa jest o obiektowości i referencjach. A jeśli chcecie zgłębić temat dlaczego jest tak a nie inaczej, sięgnijcie do korzeni (do języka C) i poczytajcie sobie na temat istoty działania wskaźnika.

Klasa w języku C#

Klasa to szablon dla każdego przyszłego obiektu bazującego na niej. Zmienna instancyjna przechowuje w rzeczywistości referencję w postaci adresu do obiektu umieszczonego na stercie!


To kończy artykuł wprowadzający do programowania obiektowego w "CSharpie". "class" w języku C# to dopiero wierzchołek góry lodowej. Widzieliście sami ile dodatkowych informacji się z tym wiąże. Samo słowo kluczowe to jest moment, a wraz z nim dochodzi reszta cennych zagadnień :D. Klasa może dysponować danymi składowymi i metodami, jest to szablon dla każdego obiektu, obiekt sam w sobie to kopia klasy, a przypisanie do zmiennej powoduje przechowywanie referencji do obiektu, a nie samego obiektu jako takiego. Tak brzmi "TL;DR" dzisiejszego tematu :).

PODOBNE ARTYKUŁY