06. Klasy i obiekty

06. Klasy i obiekty

Autor: Daniel Celeda

Opublikowano: 1/3/2006, 12:00 AM

Liczba odsłon: 264228

Programy pisane w C# składają się z definicji klas oraz tworzonych na ich podstawie obiektów (czasami używa się struktur – „uproszczonych klas”). Klasa definiuje nowy typ, a obiekty to egzemplarze tego typu. Klasę można porównać do matrycy, a obiekty do odlewów stworzonych na podstawie tej matrycy. Przyjrzyjmy się przykładowemu programowi oraz wynikowi jego wykonania.

class HelloWorld
{
    static void Main()
    {
        System.Console.WriteLine("Hello world !");
        System.Console.ReadLine();
    }
}

Po skompilowaniu i uruchomieniu programu otrzymujemy napis „Hello world !”. Jak łatwo się domyśleć, za wypisywanie tekstu odpowiedzialna jest metoda

System.Console.WriteLine("Hello world !");

„System” to przestrzeń nazw, którą możemy porównać do pewnego zbioru matryc, czyli klas (będzie o tym mowa w następnych artykułach). „Console” to klasa, w której znajduje się definicja metody „WriteLine” (także wiele innych metod), a „WriteLine” to metoda jaką należy wykonać aby wydrukować na ekranie jakiś tekst. Tekst traktujemy jako daną, a metodę „WriteLine” jako instrukcję. Teksty, zwane łańcuchami znakowymi, umieszczamy w cudzysłowach aby kompilator potrafił je odróżnić.

Na razie nie przejmujmy się przestrzeniami nazw - wystarczy, że będziemy traktować je jako pewnego rodzaju zbiór zdefiniowanych klas. Gdyby wszystkie klasy (a jest ich w .NET tysiące) znajdowały się w jednym miejscu, nikt nie potrafiłby znaleźć mu potrzebnej, tak więc pogrupowano klasy w przestrzenie nazw. „Console” to gotowa klasa stworzona dla nas przez Microsoft i umieszczona w przestrzeni „System”. Klasy, które będziemy tworzyć możemy umieszczać we własnych przestrzeniach. Przestrzenie, klasy, zmienne i metody tworzą w pewien sposób hierarchię: przestrzenie zawierają klasy, te natomiast zmienne i metody. Poruszając się po tej hierarchii stosujemy kropki. To one, tak jak gałęzie w drzewach, łączą klasę z jej zmienną lub metodą.

@STRONA@

WriteLine a Write

 Istnieje także metoda „Write”, różniąca się od „WriteLine” tym, że po wypisaniu tekstu kursor nie przechodzi do nowej linii.

Łatwo sprawdzić różnicę wykonując poniższy program.

class HelloWorld
{
    static void Main()
    {
        System.Console.WriteLine("Pierwszy napis wypisany przez metodę WriteLine");
        System.Console.WriteLine("Drugi napis wypisany przez metodę WriteLine");
        System.Console.Write("Pierwszy napis wypisany przez metodę Write");
        System.Console.Write("Drugi napis wypisany przez metodę Write");
        System.Console.ReadLine();
    }
}

Wynik jaki powinniśmy otrzymać.

W każdym z powyższych programów wykonuję także metodę

System.Console.ReadLine();

Jest to w pewnym sensie metoda odwrotna do „WriteLine”, nie wypisuje tekstu, lecz czeka na tekst, który powinniśmy jej dostarczyć. Łatwo możemy to sprawdzić uruchamiając nasz program znowu. Dopóki nie naciśniemy klawisza Enter, możemy pisać po ekranie. Naciśnięcie klawisza Enter kończy działanie metody „ReadLine”.

Nasz program składa się z jednej klasy „HelloWorld”. Wszystko znajdujące się pomiędzy klamrami „{ }” to ciało klasy. Na ciało naszej klasy składa się tylko jedna metoda „Main”. Jest to bardzo ważna funkcja w C#, ponieważ wykonanie wszystkich programów rozpoczyna się od tej metody.

Słowo kluczowe „class” określa początek definicji klasy, w tym przypadku „HelloWorld”.

Co znaczą słowa „static” oraz „void” znajdujące się przed „Main” ?

Na razie nie przejmujmy się nimi za bardzo. Wystarczy wiedzieć, że „static” określa nam, że metoda może działać mimo, że nie tworzymy obiektów klasy „HelloWorld” (mamy tylko jej definicję). „Void” natomiast określa, że „Main” nie zwraca nam żadnego wyniku (gdyby to była metoda dodająca dwie liczby to zwracałaby nam sumę).

No dobrze, mamy klasę, a gdzie są obiekty?

Klasa „HelloWorld” to klasa główna programu, ponieważ zawiera metodę „Main”, czyli jest jakby punktem startu naszej aplikacji. Nie tworzymy obiektów tej klasy, po prostu wykonanie programu rozpoczyna się od pierwszej instrukcji wewnątrz metody „Main”. Pora więc na bardziej rozbudowany przykład.

@STRONA@

Instancje klas – obiekty

Tym razem stworzymy sobie dwie klasy, jedną podobną do „HelloWorld”, czyli główną klasę naszego programu oraz drugą, z której będziemy tworzyć obiekty wewnątrz klasy głównej.

class Echo
{
    string napis;
    public void WczytajNapis()
    {
        System.Console.WriteLine("Podaj napis.");
        napis = System.Console.ReadLine();
    }
    public void Napisz()
    {
        System.Console.Write("Napisałeś: ");
        System.Console.WriteLine(napis);
    }
}
class
KlasaGlowna
{
    static void Main()
    {
        Echo obiektEcho = new Echo();
        obiektEcho.WczytajNapis();
        obiektEcho.Napisz();
        System.Console.ReadLine();
    }
}

Jak nazwa wskazuje klasą główna jest „KlasaGlowna”. Zawiera ona znaną już nam metodę „Main”, wewnątrz której tworzymy obiekt klasy „Echo” oraz wykonujemy jej metody.

Pojawiło się kilka nowych rzeczy. Omówmy najpierw klasę „Echo”. Na początku zawiera ona zmienną typu „string”, czyli tekstową (może przechowywać napisy). Następnie znajdują się dwie metody rozpoczynające się od słowa „public”. Wyraz ten oznacza dostępność elementów klasy dla innych klas. W tym przypadku mówi, że metody które poprzedza są publiczne, czyli mogą je wykonywać inne klasy (nie tylko klasa zawierająca definicje tych metod). Dzięki temu wewnątrz klasy „KlasaGlowna” możemy nie tylko tworzyć obiekty klasy „Echo”, ale też wykonać publiczne metody klasy „Echo”.

Następująca linijka

napis = System.Console.ReadLine();

oznacza, że program prosi nas o podanie tekstu (oczekuje tego metoda „ReadLine()”). Po naciśnięciu klawisza Enter, a więc po zakończeniu wprowadzania tekstu, to co wpisaliśmy „ląduje” wewnątrz zmiennej „napis”. Pozostała zawartość metod powinna być już dla nas jasna. Prześledźmy jeszcze wykonanie metody „Main” w głównej klasie. W pierwszej linijce tworzymy nowy obiekt klasy „Echo” i „wkładamy” go do zmiennej „obiektEcho”. Część

Echo obiektEcho

to deklaracja zmiennej „obiektEcho”, która może przechowywać tylko obiekty klasy „Echo’. Następnie mamy znak „=”, który przypisuje wartość, którą będziemy przechowywać wewnątrz naszej zmiennej. Teraz wystarczy nam stworzyć nowy obiekt klasy „Echo”, aby mieć co załadować do zmiennej.

new Echo();

A oto wynik działania powyższego programu.

Pojawiło się nowe dla nas słówko „new”. „New” służy do tworzenia nowych instancji klas, a więc tworzenia obiektów na podstawie zdefiniowanej klasy.
Więcej o tworzeniu nowych obiektów, a także o konstruktorach oraz typach referencyjnych i prostych powiemy sobie w następnym artykule.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia