Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

06. Klasy i obiekty

06. Klasy i obiekty

Daniel Celeda
3 stycznia 2006
256 929
Odsłony
Daniel Celeda
3 stycznia 2006
256 929
Odsłony

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ą.

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.

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.

Zobacz również

Komentarze

Kurcze, mieszam się :( Przydałyby się screeny tak jak w temacie nr 5.
Skaleq, 10 lipca 2006, 00:45
oo poradziłem sobie, jednak trzeba się bardziej skupić :)
Skaleq, 10 lipca 2006, 01:19
Nie da się tego zrobić. Bo mi wyskakują same errory.
Anonim, 16 lipca 2006, 08:50
wszystko jest ok i jak na chwile obecną wszystko idzie bez problemów. Pozdrowienia!
csharp laik:), 21 lipca 2006, 11:55
Mi wszystko wychodzi - umiem Pascala(TP,Delphi) i z C# jakos latwiej mi idzie
Mydew, 22 lipca 2006, 21:17
Wszystko pięknie działa jak się zna podstawy.. A od tego jest Pascal ew. Delphi.. C# raczej do zapoznawania sie z programowaniem nie polecam. Zręsztą podobnie jak c++ i ogólnie dotNeta.
BuLDoG, 22 lipca 2006, 23:02
cytuję : Pojawiło się nowe dla nas słówko „new”. „New” służy do tworzenia nowych instancji klas koniec cytatu. Skoro wielkość liter ma znaczenie to po co nagle "NEW"? Skoro jest to słowo kluczowe to należy je pisać z małej litery aby nie wprowadzać zamieszania (i na wypadek gdyby jednak zasady ortografii nakazywały użyć na początku zdania wielkiej litery inaczej sformuować zdanie)
bartek, 21 sierpnia 2006, 16:11
jezeli ktos pisal w c wszystko jest jasne. jezeli ktos kaleczyl sie pascalem lub delphi pozniej utknie. pzdr
Salomon, 27 sierpnia 2006, 19:58
Po Pacalu (mam na informatyce) pozostają dziwne przyzwyczajenia w stylu używania funkcji bezargumentowych bez nawiasu, bezsens... Zamiast Console.Readkey(); piszę Console.Readkey;, a później szukam błedu... Ogólnie mówiąc wydaje mi się, ze C# jest bardzo podobny do Javy pod względem architektury, a składniowo nie wiele różni się od C++ dlatego lepiej zacząć od któregoś z powyższych.
Licealista :/, 23 lipca 2007, 12:11
TEMAT: Klasy i obiekty a tłumaczyć coś takiego: System.Console.WriteLine("Hello world !"); to jakiś absurd. Poza tym dramatycznie ubogo.
Grzegorz, 28 lipca 2007, 14:05
Odsyłam do fachowych książek jeśli komuś tu ubogo. Fajnie jest mieć gdzie zapoznać sie z podstawowymi pojęciami. Pozdrawiam
Nowy, 2 sierpnia 2007, 18:45
C#, a szczególnie takie podstawy są bardzo proste. A jeżeli ktoś nie potrafi pojąć najprostszych rzeczyw C#, to niech lepiej się uczy Pascala albo Delphi najpierw PS - NNNNOOOOOOBBBBBBBBBYYYYY
No ładnie..., 9 września 2007, 18:32
Nie kazdy zaczyna od Pascala, czy Delphi. Ja zaczalem od C i C++. Mimo, ze bylo ciezko jakos dalem sobie rade... A skoro taki z Ciebie cwaniak, a wszyscy to nooby, to po co czytasz kursy??
Adolf, 13 września 2007, 22:46
A tak btw, kursik bardzo ciekawy i przejrzysty. Pozdr for all.
Adolf, 13 września 2007, 22:47
... mi dziala :)
Fuku, 19 września 2007, 20:07
wedlug mnie bardzo fajnie napisane. Troszke skacze po pojeciach ale dobrze sie czyta. BTW ja zaczalem nauke od TP pozniej DELPHI ale z powodu drogiego oprogramowania borlanda szukalem alternatywy i C# jest wlasnie tym czego potrzebowalem ;) Jeszcze w miedzyczasie nauczylem PHP wiec przejscie z Delphi przez PHP do C# bylo baaaardzo przyjemnie przeprowadzone i polecam PHP ludziom ktorzy nie mieli do czynienia z jezykami interpretowanymi.
jatoja, 25 września 2007, 12:48
Te linie kodu można dodać do poprzedniego programu.
Rafal, 16 marca 2008, 09:23
Wie ktoś może jak zrobić Klasę, która potrafi liczyć działanie związane z pierwiastkowaniem ?? albo coś takiego: Tutaj chce zeby pierwiastkował liczby od zmiennych wybierz.wynik1, wybierz.wynik2. I nie wiem jak to zrobic :(:( (..) case "3": { wybierz.odejmowanie(zesp1.x, zesp1.y, zesp2.x, zesp2.y); Console.WriteLine("Wynik: " + wybierz.wynik1 + " + j" +wybierz.wynik2); Console.WriteLine("Czy chcesz zamienic na posta trygonometryczna??"); Console.WriteLine("1 - Tak"); Console.WriteLine("0 - Nie"); int x = int.Parse(Console.ReadLine()); if (x == 1) { Console.WriteLine(Math.sqrt(JAKIEŚ TAM DZIALANIE); } break; } (..)
Pomocy!! etx, 3 czerwca 2008, 12:10
spoko kurs jest:)  uwazajcie na duze / male litery bo maja znaczenie i na to by deklaracja zmiennej string byla dla calej klasy a nie jej wybranej funkcji no to tyle bo tez mi sie errorowalo
RasMike, 21 grudnia 2009, 16:31
Ja znam C++ dlatego niemam z niczym problemu
Robcio, 21 lutego 2010, 18:21
No a ja własnie sie ucze programowac i kurs jest spoko
Noob, 28 czerwca 2010, 10:17
Kurs całkiem, całkiem:) no i komentarze zabawne 5+ heh
D.A.J, 6 lipca 2010, 22:44
Naprawdę bardzo fajny kurs.
milkwarz, 7 września 2010, 03:57
ja się ucze i daje 5 za kurs:p
konrad, 2 listopada 2010, 15:02
Z tego co widze konstrukcja jezyka jest bardziej obiektowa - jak Java, ale skladnia w duzej mierze podobna do c++, takze wystarcza mi pobiezne czytanie :D
damian, 24 listopada 2010, 15:32
Kurs miły i przyjemny. Polecam iść ścieżką: ANSI C -> C++ -> C#. Warto zauważyć, że podstawy są bardzo prosto wyjaśnione, ale jeśli jednak chcemy z wg tego kursu coś stworzyć np. wiekszy projekt niz kalkulator to trzeba to dokladnie opanowac, znac zasady algebry boolowskiej, podstawy matematyki i rodzaje zmiennych oraz miec pojecie chociażby pojęcie o funkcjach jakie zazwyczaj stosujemy w programach.  Kurs mi się przydał i przydaje dalej. "Robię" symulację koła fortuny w C# + .Net Framework i ten kursik przyspieszył pracę.  Autorowi życzę wielu sukcesów zawodowych ! Pozdro
Guest, 25 listopada 2010, 10:50
Po co pisać system.console? samo console wystarczy.
Stprzemo, 5 września 2011, 10:50
System.Console.ReadLine(); w klasie glownej jest zbedny
omg, 20 listopada 2011, 00:26
@guest Ale przecież ANSI C jest najtrudniejszy a po nim C++. Wszystko jest zminimalizowane i przez to kod nie jest rozciągliwy , ale czy łatwy do nauki? Trzeba dbać o pamięć itp. Wydaje mi się że taka kolejność powinna być od najłatwiejszego C#>Java>C++>C>Asembler Ponoć łatwiejsze są jeszcze Python i Ruby
james, 29 listopada 2011, 23:20
Przydało by się od razu napisać (dla zielonych, czyli i dla mnie), jak możemy sprawdzić do jakiej przestrzeni nazw dana klasa należy, tak byśmy łatwo mogli sprawdzić, co trzeba dołączyć w sekcji "using", by nasz program kompilował się bez błędów...
pswierq, 19 stycznia 2012, 12:01
Wg. mnie, najlepiej najpierw się nauczyc C++, potem C#. Nie wiem dlaczego ktoś napisał że C# jest łatwy, wg. mnie trudniejszy od C++, a c++ uczę się już 4 miesiące, przeczytałem Thinking In C++ i pare innych książeczek.
Black Boss, 7 maja 2012, 00:20
Zmienną raczej zadeklarujmy tak Public string Napis; natomiast nowy obiekt klasy echo var obietkEcho = new Echo(); ostatnia instrukcja string readLine = System.Console.ReadLine(); do tego nasze klasy w dwóch .cs ijest super
Szymon Jakubowski, 2 kwietnia 2013, 21:55
Nie używa się już terminu "metoda"... Podobno :)
Norbert, 1 lipca 2014, 08:32
Straszny język, z kosmosu składnia odwrotna niż w innych językach deklaracja czegokolwiek skomplikowana. Przerost formy nad treścią.
Mycha, 18 czerwca 2015, 19:50
@Norbert: A kiedy się coś zmieniło w języku C#, że jego metody nie są już metodami?
Krzysiek, 19 czerwca 2015, 12:50
Fajny
Kuba, 4 października 2015, 02:05

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.