You are on page 1of 9

Klase i prostori imena

Jedinica: 4 od 41
Klase i prostori imena u .NETu
Struktura jezika C# podrazumeva klase rasporeene u odgovarajue prostore imena. Kada bismo ovaj koncept hteli da prenesemo na primer iz ivota, mogli bismo prostore
imena uporediti sa mnotvom fascikli u kojima se nalaze razliiti prazni formulari specifinih namena.
Na primer, fascikla pod nazivom kola mogla bi sadrati formulare za upis u kolu, za ispisivanje iz kole, za premetaj iz kole u kolu... Fascikla Automobil mogla bi sadrati
formulare za registraciju, prodaju vozila, kupovinu vozila...
Slika 1

Recimo da ovim fasciklama rukuje neki slubenik. Kada slubenik eli da ispuni formular, lako ga identifikuje, jer zna da su svi formulari rasporeeni tematski po fasciklama.
Nakon to je identifikovao koji mu formular treba, slubenik preuzima formular iz fascikle. Ovaj formular ne sadri podatke, ali sadri polja za unos podataka, pa slubenik ne
moe pogreiti i u formular za prodaju vozila uneti podatke za upis u kolu i obrnuto.
Kada je slubenik preuzeo jedan formular iz fascikle i uneo neki podatak u njega, taj formular vie nije ablon, ve se smatra objektom u sistemu u kome se nalazi. Slubenik
dalje moe proslediti ovaj objekat-formular nekom drugom slubeniku, koji e uneti jo podataka u njega, ili preuzeti iz njega podatke koji su mu potrebni za dalji rad, pa ak i za
ispunjavanje nekih novih formulara.

Dakle, formular ima neki svoj ivot u sistemu. U zavisnosti od namene formulara, zavisi i njegov ivot. Na primer, ako je formular bio potreban kako bi se izvrila prijava ispita,
nakon zavrenog ispita, ovaj formular moe biti uniten. Sa druge strane, ako je u pitanju izvod iz knjige roenih, formular e verovatno biti potreban vie puta i nikada ne
moemo biti sigurni da nam nee vie trebati, pa je bolje da ga sauvamo za dalju upotrebu.
Pratei ovu analogiju, slian sistem moemo identifikovati u .net sistemu klasa i prostora imena. Unutar ovog sistema, razliite klase (formulari) rasporeene su po razliitim
prostorima imena (fasciklama). Da bismo iskoristili neku od klasa, moemo, jednostavno, navesti fasciklu unutar koje se klasa nalazi, a zatim identifikovati i samu klasu. Kako u
jednu fasciklu moemo smestiti i druge fascikle, tako i unutar jednog prostora imena moemo smestiti druge prostore imena i tako dobiti jo precizniju klasifikaciju.
Prostori imena u jeziku C# sadre mnotvo elemenata. Pored klasa, tu su jo i interfejsi, enumeracije i slino (sve pojmove obradiemo u narednim lekcijama i za sada emo se
zadrati samo na klasama).
Za konkretan primer, moemo uzeti prostor imena System. Ovo je osnovni prostor imena u jeziku C# i bez njega ne moe dobro funkcionisati ni jedna aplikacija.

Svakako ne bi trebalo brkati pojmove dobrog funkcionisanja i funkcionisanja uopte. Tanije, da bi jedan C# program mogao da radi, mi zapravo ne moramo implementirati u
njega ni jedan prostor imena, ali tada taj program, iako nee prijaviti greku, nee nita konkretno moi da uradi.
Pogledajmo sledei primer. U pitanju je potpuno ispravan C# program koji ne radi nita.
Primer koda 1

Napomena:

{} ovo su vitiaste zagrade. Korisno je imati naviku da se, pre pisanja samog koda, izmeu vitiastih zagrada
prvo one same napiu, pa tek onda kod koji se izmeu njih nalazi. Ovo je pogotovo korisno ako i sam kod koji se
pie izmeu njih takoe sadri vitiaste zagrade. Kod je najitljiviji ukoliko su otvorena i zatvorena vitiasta
zagrada u vertikalnoj liniji, a sav ostali kod, koji se nalazi izmeu njih - uvuen u desno.

1
2
3
4
5
6
7
class MyFirstProgram
{
static void Main()
{

}
}
Primer:

kod
{
kod
{
kod
}
}
Ovaj program zadovoljava standarde i bie pravilno preveden. Da bismo ga preveli, dovoljno je da aktiviramo konzolnu aplikaciju CSC sa parametrom MyFirstProgram.cs ili da,
ukoliko smo program kreirali unutar Visual Studija, aktiviramo opciju za startovanje ili debug programa.
Slika 2

U bilo kom sluaju program e imati izlaz poput onoga na slici 2.

Specificiranje prostora imena i klasa
Primeujemo da je sam program predstavljen klasom. Ova klasa se u primeru zove MyFirstProgram i sadri jedan metod pod nazivom Main. Ona je osnovna klasa programa i
kada sistem pokrene aplikaciju, on e automatski, kao njenu poetnu taku, uzeti ba ovu klasu. Ipak, to nije zbog naziva klase, ve zbog metode Main koja se nalazi u njoj.
Naime, kada sistem zapone pokretanje aplikacije, on prvo pokuava da identifikuje metod Main, u bilo kojoj klasi, bilo kog dela sistema. Kada pronae ovaj metod, sistem
oznaava klasu unutar koje se ovaj metod nalazi kao polaznu taku programa i poinje izvravanje metoda Main.
Ali, ta ukoliko sistem naie na vie Main metoda u razliitim klasama? Koja e biti tretirana kao polazna taka programa?
Zapravo, nijedna. Ukoliko unutar njega postoji vie od jedne Main metode, program e prijaviti greku.
Slika 3

Napomena:

Koncept prostora imena preuzet je iz jezika C++ i ekvivalentan je konceptu paketa u Java programskom jeziku.
S obzirom na to da je Main metod prvo to e se dogoditi u programu, iz njega moemo vriti dalje aktivnosti programa tako to emo manipulisati ostalim klasama sistema. Za
poetak, moemo iskoristiti klasu Console. Ova klasa sadri razne metode i svojstva za rukovanje konzolom, odnosno za prikazivanje poruka na ekranu i uitavanje poruka sa
tastature i nalazi se u prostoru imena System. Kako bi klasa bila iskoriena, neophodno je naglasiti prostor imena (fasciklu) System, a zatim i njen naziv.
Pored mnotva metoda, klasa Console sadri metod za ispis jedne linije teksta u konzoli. Ovaj metod naziva se WriteLine. Dakle, potrebno je da se pronae prostor imena
System, njegova klasa Console i njen metod WriteLine. Za navigaciju kroz ove elemente koristi se operator, pa e kompletan poziv metode izgledati ovako:
Ako implementiramo primer u ostatak koda, kompletan program e izgledati ovako:
1 System.Console.WriteLine("Hello");
Primer koda 2

Nakon startovanja, program e imati sledei izlaz:
Slika 4

.NET je prvo potraio metod Main i naao ga unutar klase MyFirstProgram i startovao ga. Tokom prolaska kroz ovaj metod naiao je na jednu liniju, System.Console.WriteLine i
startovao je. Ova linija je potraila klasu Console u prostoru imena System i aktivirala njen metod WriteLine. S obzirom na to da metod prihvata parametar, odnosno tekst koji e
biti prikazan u konzoli, a mi smo kao taj parametar prosledili re Hello, rezultat na izlazu je oekivana poruka - Hello.
U sluaju klasa MyFirstProgram i System.Console, ne izvrava se takozvano instanciranje klase. Preciznije reeno, ablon, koji je predstavljen klasom, ne upotrebljava se za
kreiranje objekta, ve se jednostavno samo pozivaju metode ovih klasa, kako bi izvrile neku radnju. U sluaju MyFirstProgram klase, ta radnja je aktivacija Main metode,
odnosno aktivacija glavnog dela programa, a u sluaju klase Console, aktivacija WriteLine metode, tj. ispisa teksta u konzolu.
Da bi sistem mogao da pristupi elementima klase bez kreiranja njihovih objekata, ti elementi moraju posedovati modifikator static, odnosno, moraju biti statiki. Ukoliko bi, na
primer, ispred metode Main uklonili modifikator-klljunu re static, aplikacija ne bi mogla da bude prevedena i prijavila bi greku.
Pored metode WriteLine, jedan od esto korienih metoda klase Console je metod ReadLine. Ovaj metod stavlja konzolu u stanje ekanja, sve dok korisnik ne unese neto sa
tastature i pritisne taster Enter. Nakon toga, program nastavlja izvravanje. Ovaj metod, takoe, moe identifikovati ono to je korisnik uneo:
Primer koda 3

Ako aktiviramo kod iz primera koda 3, program e aktivirati konzolu, ali nee dati nikakav izlaz, sve dok ne unesemo neki tekst u konzolu. Nakon toga, program e prikazati tekst
koji smo uneli, zajedno sa porukom you entered... Rezultat je prikazan na sledeoj slici:
1
2
3
4
5
6
7
class MyFirstProgram
{
static void Main()
{
System.Console.WriteLine("Hello");
}
}
1
2
3
4
5
6
7
8
class MyFirstProgram
{
static void Main()
{
string userInput = System.Console.ReadLine();
System.Console.WriteLine("You entered " + userInput);
}
}
Slika 5

Iz prethodnih primera, zakljuujemo da je System prostor imena, i da on sadri klase i takoe prostore imena.
Jednu klasu smo ve prikazali i predstavili - to je klasa Console.

Postoji mnotvo prostora imena unutar Systema. Gotovo svi .NET framework prostori imena nalaze se ba unutar prostora imena System. To su prostori imena IO, Net,
Collections, Security, Web Globalization, Text, Threading...
Na slikama, prostori imena oznaeni su belom bojom, a klase (odnosno, klasa Console) narandastom bojom.
Slika 6

U okviru C# programiranja razlikujemo, dakle, dve celine: sam C#, njegovu sintaksu, pravila, strukturu i ponaanje i .NET framework, kao ogromnu biblioteku klasa koje
koristimo za izgradnju programa u ovom jeziku.
Oigledno je da je, uz dobro poznavanje .NET frameworka (i naravno, samog jezika C#), vrlo jednostavno napraviti aplikaciju bilo koje namene.

Primer 1
Recimo da elimo da napravimo aplikaciju koja preuzima informacije unete od strane korisnika i na osnovu njih vri sabiranje, a zatim, emituje rezultat sabiranja na izlaz
(konzolu). Dakle, program bi trebalo da od korisnika preuzme prvi operand, zatim drugi operand, a zatim sabere ta dva operanda.
U analizi ovog zadatka ve vidimo da postoje dva problema koja, na osnovu prethodnih primera, umemo da reimo. Prvi je preuzimanje podataka od korisnika (ReadLine), a
drugi, emitovanje podataka na izlaz (WriteLine).
Pored ovih, takoe, postoje jo dva problema u programu. Prvi je: kako da korisniki unos, koji e biti u formi teksta (string tip), pretvorimo u tip nad kojim moemo izvravati
aritmetike operacije, a drugi: kako da izvrimo aritmetiku operaciju sabiranja.
Uz poznavanje C# jezika i klasa .NET frameworka, oba problema su jednostavno reiva.
Pre svega, konverzija u numeriku vrednost.

Kada korisnik unese neki podatak putem konzole (kroz metod ReadLine), taj podatak je u formi stringa, ak iako je korisnik uneo broj, C# je u stanju da sabere dva stringa, ali
rezultat ovog sabiranja nee biti neto to bismo oekivali od sabiranja brojeva.
Kada bismo, na primer, sabrali stringove 2 i 3 - dobili bismo 23. To nije rezultat sabiranja brojeva 2 i 3, ve spajanje stringova. To znai da C#u moramo dati do znanja, da
podatke koje je korisnik uneo, tretira kao brojeve. Ovo moemo uraditi na nekoliko naina. Jedan od njih je korienje klase Convert, koja se nalazi u prostoru imena System:
Slika 7

Tako moemo, u zavisnosti od toga kojim emo tipom brojeva rukovati, izvriti adekvatnu konverziju korisnikog unosa. Recimo da elimo da rukujemo celobrojnim vrednostima.
Tada emo iskoristiti metod ToInt32.
Primer koda 4

U prvoj liniji primera koda 4, iznad promenljive operand1String, dodeljena je vrednost preuzeta od korisnika. S obzirom na to da je ova promenljiva tipa string, ona je
neupotrebljiva za sabiranje brojeva i zato u drugoj liniji koristimo metod ToInt32, klase Convert, kako bismo izvrili konverziju u tip koji se moe sabirati celobrojnu vrednost.
Da smo pokuali da preuzmemo podatak od korisnika direktno u celobrojnu vrednost, dolo bi do greke, jer metoda ReadLine, jednostavno, nije u stanju da vrati celobrojnu
vrednost, ve samo vrednost tipa string.
Primer koda 5

Da bismo videli koji tano tip vrednosti moemo da oekujemo kao povratnu vrednost neke metode, dovoljno je da se zadrimo miem iznad nje, i okruenje (Visual Studio) e
prikazati njene osnovne podatke, meu kojima i tip koji vraa:
Slika 8

Nakon to, na isti nain, preuzmemo vrednost i za drugi operand, moemo izvriti sabiranje ove dve vrednosti i izvriti emitovanje rezultata na izlaz:
Primer koda 6 funkcionalan primer

Program iz primera koda 6 je funkcionalan, ali sadri dosta ponavljanja slinog koda. Ovakav izgled programa je dobar prilikom izgradnje, kada nam je potrebno da znamo tano
ta se unutar njega deava. U finalnom obliku, ovakav program bi bio verovatno optimizovan i izgledao poput sledeeg:
Primer koda 7 funkcionalan primer
1
2
string operand1String = System.Console.ReadLine();
int operand1Int = System.Convert.ToInt32(operand1String);
1 int operand1Int = System.Console.ReadLine(); //primer izaziva greku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyFirstProgram
{
static void Main()
{
string operand1String = System.Console.ReadLine(); //dobijamo prvi operand od korisnika
int operand1Int = System.Convert.ToInt32(operand1String); //konvertujemo ga u celobrojni tip

string operand2String = System.Console.ReadLine(); //dobijamo drugi operand od korisnika
int operand2Int = System.Convert.ToInt32(operand2String); //konvertujemo ga u celobrojni tip

int result = operand1Int + operand2Int; //izvravamo sabiranje, a rezultat //stavljamo u posebnu promenljivu

System.Console.WriteLine(result); //rezultat prikazujemo u konzoli
}
}
1
2
3
4
5
6
7
class MyFirstProgram
{
static void Main()
{
System.Console.WriteLine(System.Convert.ToInt32(System.Console.ReadLine()) + System.Convert.ToInt32(System.Console.ReadLine()));
}
}

Iako ima mnogo manje linija koda, ovaj program ima isti rezultat kao i onaj iz primera koda 6.

Ukljuivanje prostora imena u kod
Program iz primera 1 je funkcionalan u obe verzije, ali, iako je druga verzija (primer koda 7) daleko kraa od prve verzije, onda takoe sadri ponavljanje koda. Vidimo da se za
svaki poziv metoda, koristi i kompletna navigacija : System.Console...
C# ima mogunost ukljuivanja prostora imena u aktuelnu stranu, tako da ne moramo svaki put vriti kompletnu navigaciju do eljene klase. Za ukljuivanje prostora imena u
dokument, koristi se kljuna re using.
Ukljuivanje koda kljunom reju using moe se izvriti postavljanjem oznake using na vrh tekueg dokumenta. Oznaci using sledi taan naziv prostora imena koji hoemo da
implementiramo. Using linija zavrava se sa oznakom ;
U liniji iznad pravilno je napisana using naredba. Nakon ovako napisane naredbe, vie nije neophodno korienje oznake prostora imena System, ukoliko elimo da koristimo
neku klasu ovog prostora imena.
Drugim reima, dugaka imena klasa ponovo postaju kratka, bez navoenja putanja, naravno pod uslovom da se u naredbi using navede sama putanja klase.
Primer koji sledi sadri validan kod, iako je klasa Console napisana bez kompletne navigacije.

Napomena:

Kljuna re import u programskom jeziku Java ekvivalentna je kljunoj rei using u programskom jeziku C#.

Kreiranje sopstvenog prostora imena
U ovom trenutku znamo kako da koristimo postojee prostore imena. Takoe, moemo kreirati i sopstvene prostore imena.
Da bi se neka klasa nala u zasebnom prostoru imena, neophodno je da je oiviimo namespace blokom.
Vano:

ak i ukoliko niste eksplicitno naveli, kompajler dodaje default namespace koji se esto naziva i globalni
namespace.

Kada smestimo neku klasu u zaseban prostor imena, tada moemo istoimenu klasu smestiti u drugi prostor imena, pa ak ako se obe nalaze unutar istog dokumenta.
Savet:

Izbegavajte kreiranje klasa sa IMENOM istim kao i IME prostora imena (namespace).
U sledeem primeru kreirane su dve istoimene klase, u dva razliita prostora imena. Prva klasa sadri metod Main, i on je ulazna taka programa. Unutar druge klase, nalazi se
metod Hello. Ovaj metod se poziva iz prve klase, i da bi uspeno bio aktiviran, neophodno je da izvrimo navigaciju do njega, odreivanjem njegovog prostora imena
(MyOtherNamespace.MyClass.Hello();).

Primer ne bi bio validan kada bismo postavili prostor imena kljunom reju using, a zatim pokuali da pozovemo klasu bez navigacije (MyClass.Hello();) jer tada prevodilac ne bi
znao da li se obraamo klasi MyClass iz postojeeg ili nekog drugog prostora imena.
Primeujemo da ispred naziva metode stoji kljuna re public. Ovaj modifikator je obavezan ako hoemo da pristupimo metodi neke klase iz neke druge klase.
1 using System;
1
2
3
4
5
6
7
8
using System;
class MyFirstProgram
{
static void Main()
{
Console.WriteLine("Hello");
}
}
1
2
3
4
5
6
7
8
9
namespace MyNamespace
{
class MyClass
{
static void Main()
{
}
}
}
1
2
3
4
5
6
7
8
9
using System;
namespace MyNamespace
{
class MyClass
{
static void Main()
{
MyOtherNamespace.MyClass.Hello();
}
Primer koda 8 - funkcionalan primer

Prostori imena se esto tematski razvrstavaju po folderima. Tako se sve klase koje spadaju u jednu grupaciju smetaju u jedan folder i jedan prostor imena. Ovi folderi najee
se nazivaju isto kao i prostori imena koje predstavljaju, ali to nije neophodno i, ak i ako nazivi foldera i prostora imena nisu isti, okruenje e se oslanjati na naziv prostora
imena, a ne na foldere (ovde govorimo o ponaanju samog Visual Studija).
Napomena:

Namespace implicitno ima javni (public) pristup, i ova osobina se ne moe promeniti.
Sledea varijanta ne bi prijavila greku prilikom prevoenja programa:
Slika 9

Pravilniji i pregledniji nain prikazan je u sledeem primeru:
Slika 10

Kada kreiramo novi projekat u Visual Studiju on automatski generie ablon za program. Ovaj ablon podrazumeva glavnu klasu programa, Program, i glavni prostor imena
programa. Ovaj prostor imena dobija naziv po nazivu projekta.
10
11
12
13
14
15
16
17
18
19
20
21
}
}
namespace MyOtherNamespace
{
class MyClass
{
public static void Hello()
{
Console.WriteLine("Hello");
}
}
}
Slika 11

Primeujemo da je okruenje automatski implementiralo i dodatne prostore imena u okruenje System.Collections.Generic, System.Linq i System.Text.
Takoe, moemo iz ovoga zakljuiti da nije dovoljno implementirati jedan prostor imena kako bi bili implementirani i svi prostori imena koje on sadri. Zbog toga, iako je na
poetku programa implementiran prostor imena System, okruenje implementira i dodatne prostore imena Ling, Text i Collections.Generic.
Nivoe prostora imena moemo definisati u njegovom nazivu.
U sledeem primeru definie se prostor imena MyNamespace.Animals i unutar njega, definie se prostor imena Cats, a unutar njega, prostor imena Domestic. U drugom delu
programa, unutar klase Program, vri se aktivacija metode Show, punim adresiranjem, MyNamespace.Animals.Cats.Domestic...


Veba 1
Problem:
Potrebno je napraviti dva prostora imena unutar jedne aplikacije. Jedan prostor imena se zove Schools, a drugi Universities. Oba prostora imena trebalo bi da sadre klasu Info
i unutar nje metod Show. Ovaj metod prikazuje razliite rezultate.
Za klasu Schools prikazuje poruku info about schools, a za klasu Universities info about universities.
Glavna klasa programa trebalo bi da aktivira ove dve metode.
Reenje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace MyNamespace.Animals
{
namespace Cats
{
namespace Domestic
{
class Info { public static void Show() { System.Console.WriteLine("Miaou"); } }
}
}
}
class Program
{
static void Main()
{
MyNamespace.Animals.Cats.Domestic.Info.Show();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace Schools
{
class Info
{
public static void Show()
{
System.Console.WriteLine("Info about schools");
}
}
}
namespace Universities
{
class Info
{
public static void Show()
{
System.Console.WriteLine("Info about universities");
}
}
}
class Program
{
static void Main()
{
Schools.Info.Show();
Universities.Info.Show();
}
}

Veba 2
Problem:
Potrebno je kreirati prostore imena Dogs i Cats. Unutar svakog od ovih prostora imena nalaze se po dva prostora imena, Wild i Domestic, a unutar njih klase Info. Svaka Info
klasa sadri metod Show, a svaki od ovih metoda prikazuje odreeni tekst na izlazu. Za domaeg psa Wof, za divljeg Grrr, za domau maku Miaou i za divlju Grrr.
Reenje:

Reference:

http://msdn.microsoft.com/en-us/library/z2kcy19k%28v=vs.80%29.aspx
http://msdn.microsoft.com/en-us/library/0d941h9d.aspx
http://www.csharphelp.com/2006/02/namespaces-in-c/
http://www.csharp-station.com/Tutorials/Lesson06.aspx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
namespace Animals
{
namespace Cats
{
namespace Domestic
{
class Info { public static void Show() { System.Console.WriteLine("Miaou"); } }
}
namespace Wild
{
class Info { public static void Show() { System.Console.WriteLine("Grrr"); } }
}
}
namespace Dogs
{
namespace Domestic
{
class Info { public static void Show() { System.Console.WriteLine("Wof"); } }
}
namespace Wild
{
class Info { public static void Show() { System.Console.WriteLine("Grr"); } }
}
}
}
class Program
{
static void Main()
{
Animals.Cats.Domestic.Info.Show();
Animals.Cats.Wild.Info.Show();
Animals.Dogs.Domestic.Info.Show();
Animals.Dogs.Wild.Info.Show();
}
}

You might also like