07.11. KLASA I KONSTRUKTORI U C#
Ponavljanje, ako treba:
C# program se sastoji od sledećh delova −
- Namespace deklaracija
- Klasa ( class )
- Metode u klasi ( Class methods )
- Atributi klase ( Class attributes )
- Glavna metoda - Main
- Izrazi i naredbe ( Statements and Expressions )
- Komentari ( Comments )
Primer koda je u nastavku ( Hello world primer) :
using System;
namespace HelloWorldApplication {
class HelloWorld {
static void Main(string[] args) {
/* moj prvi program u C# */
Console.WriteLine("Hello World");
}
}
}
Kada se ovaj kod kompajlira i izvrši, dobija se sledeći rezultat :
Hello World
Delovi programa su redom:
-
Prvi red: using System; - ključna reč using se koristi da se u program uključi prostor imena System. U programu se obično nalazi više linija koje počinju sa using.
-
Drugi red: deklaracija prostora imena - namespace. Svaki prostor imena (namespace) je skup klasa. U našem primeru, prostor imena HelloWorldApplication sadrži u sebi klasu HelloWorld.
-
Treći red: deklaracija klase ( class ), Klasa HelloWorld u sebi sadrži definicije podataka i metoda (funkcija) koje naš program koristi. Klase u sebi obično imaju više metoda. Metode su ono što opisuje ponašanje klase. U našem slučaju, klasa HelloWorld ima samo jednu metodu - Main.
-
Četvrti red: definiše se metoda Main, od koje naš program počinje ( entry point ). Ovaj metod počinje sa static, što znači da je statički i void - ne vraća vrednost. static - metoda koja je dostupna iz samog tipa, a ne iz pojedinačnih instanci klase (objekata). To znači da i ako imamo gomilu objekata neke klase, ako je negde nešto označeno sa static, onda je to samo jedno za sve - Samo je jedna metoda Main ! U zagradama to što piše znači da možemo imati niz argumenata, prvi kaže koliko ih je, a onda ide niz argumenata (a može da nema nijedan)
-
Sledeći red: /*...*/ se ignoriše od strane kompajlera - to je komentar.
-
Metoda Main radi sledeće: Console.WriteLine("Hello World");
WriteLine je metoda u klasi Console koja se nalazi u prostoru imena System. Na ekranu ćemo da dobijemo poruku "Hello, World!" .
-
Ako se koristi Visual Studio Comunity ili neki od IDE alata, postoji velika verovatnoća da je potrebno posle poslednjeg reda dodati: Console.ReadKey(); To će dovesti do toga da program stane i sačeka da se pritisne bilo koje dugme, a ne da se samo izvrši i zatvori.
NAPOMENA:
-
C# je case sensitive - Razlikuju se velika i mala slova. npr. ne možete napisati main(). To nije isto kao Main().
-
Sve naredbe moraju da se završe sa tačka-zarezom (;).
-
Izvršavanje programa počinje sa metodom Main.
-
Ime fajla i ime klase u njemu ne moraju da budu isti - ali je poželjno bar na početku da tako radimo radi bolje jasnoće.
Znači, u našem malom programu imamo 3 bloka koda koji su ograđeni vitičastim zagradama { }. Prvi blok predstavlja samo imenski prostor čiji se naziv može menjati. Drugi blok predstavlja klasu, znači vaš program je u suštini klasa i u njoj se nalazi funkcija. Funkcije u C# programskom jeziku uvek zovemo metoda. Naziv metode Main() ne možemo menjati, ali njene atribute u ovom programu možemo totalno i izbrisati jer za izvršenje ovakvog prostog koda ne trebaju nikakvi ulazni argumenti.
PRVI ČAS: POJAM KLASE I RAZLIKA IZMEĐU KLASE I STRUKTURE
1. Uvod: Šta je klasa?
Klasa je šablon (model, nacrt) pomoću kojeg se stvaraju objekti.
Klasa opisuje kako će objekat izgledati i kako će se ponašati.
U realnom svetu:
-
„Automobil“ je klasa,
-
„Fiat Punto 2010, crveni“ je objekat.
U C# klasa se definiše pomoću ključne reči class.
Deo lekcije ->
Klasa je šablon za objekat koji opisuje vrstu i količinu podataka koje će objekat sadržavati, ali ne predstavlja ni jedan određen primerak objekta. Tačnije, klase u osnovi predstavljaju šablone iz kojih se mogu stvarati objekti. Objekti sadrže podatke i metode za manipulisanje i pristup podacima, ali klasa određuje koje podatke mora da sadrži svaki konkretan objekat iako klasa sama ne sadrži nikakve podatke. Taj konkretan objekat uglavnom u literaturi se naziva primerak ili instanca. Inače klasa kao reč je nastala prema pojmu klasifikacija. Kada pravite klasu, vi uređujte članove klase u smisleni entitet. Za razliku od stuktura, klase vam daju mnogo veću fleksibilnost i više mogućnosti s obzirom da klase podržavaju nasleđivanje. Strukture su vrednosni tip podataka dok su klase referentni tip.
Primer iz stvarnog sveta za klasu možete zamisliti i kao svojstva koja opisuju na primer tramvaj. Tramvaj ima motor, sedišta, kočnice, ponekad i klima uređaj; može da se vozi napred i nazad. Klasa opisuje sva svojstva i radnje koje jedan tramvaj poseduje ali klasa ne predstavlja ni jedan određen tramvaj. U stvarnom svetu tramvaj bi predstavljao objekat. S obzirom da postoje različiti tramvaji, znači da postoje i različiti objekti; ali svi bi objekti tramvaj bili prepoznati kao primerci klase tramvaj. Klase opisuju svojstva i ponašanje objekta preko članova. Članovi klase mogu biti polja, svojstva, metode i događaji. Klasu pravite tako što koristite ključnu reč class. Sintaksa za pravljenje klase je sledeća:
class ime_klase
{
članovi_klase
}
Šta je enkapsulacija?
Enkapsulacija, enkapsuliranje što u prevodu znači zamotavanje je način da vi sakrijete, zaštitite i kontrolišete pristup podacima koji se nalaze u objektu. To radite tako što članovima klase odredite rang vidljivosti, tj. odredite koji članovi klase su na primer javni, privatni, zaštićeni ili interni. Na primer dok vi gledate realiti šou na TV, vas ne interesuje kako televizor prikazuje realiti šou. Vas interesuje da gledate program. Tako isto kad koristite objekte, bilo da su objekti vaši ili da je objekte neko drugi pravio; vi želite da objekti rade ono za šta su namenjeni, bez obzira koliki vi uvid imate u ono kako tačno objekat radi. Znači, enkapsulaciju koristite u vašim klasama kad hoćete da kontrolišete skrivenost članova klase koju će objekat da koristi.
(izvor, www.manuelradovanovic.com )
ili
Deo lekcije ->
Kako su to objasnili u jednoj od knjiga:
Klase (classes) su opisi koji definišu kako će se generisati objekti i koje osobine i funkcionalnosti ti objekti poseduju. Klasa predstavlja strukturu u kojoj su grupisani podaci i funkcije, uključujući i druge klase. Klase predstavljaju opise tj. šablone za opis zajedničkih karakteristika grupe objekata. Klase se sastoje od članova (class members) različitog tipa. Podaci klasnih tipova predstavljaju primerke (instances) i nazivamo ih objektima (objects). Promenljiva klasnog tipa je pokazivač u statičkoj memoriji na objekat koji se nalazi u dinamičkoj memoriji.
Član klase može biti polje (field) za podatke, metoda (method) koje predstavljaju funkcije klase, konstruktor, destruktor, svojstvo, indekser, druga klasa ili događaj.
Deklaracija klase
class ime_klase : NazivOsnovneKlase
{
modifikator tip polje;
...
modifikator tip metoda(parametri);
...
}
Polje klase
imeTipa imePolja = početnaVrednost, imePolja2,..;
Klasom se definiše novi korisnički tip. Instance klase nazivaju se objekti. Svaki objekat ima svoje sopstvene elemente koji su navedeni u deklaraciji klase. Ovi elementi nazivaju se članovi klase. Kreiranje objekata se vrši operatorom new, članovima se pristupa preko operatora . (tačka):
objekat.clan
Unutar klase, tekućem objektu klase se predstavlja ključnom reči this. Time se označava da se pristupa članu tekućeg objekta:
this.clan
Za pristup članu sopstvene klase može se koristiti samo ime člana klase:
clan
Za pristup članovima se koristi modifikator koji može biti: public, private, protected, protected internal i internal.
***
MODIFIKATORI
Modifiers - modifikatori određuju rang delovanja promenjive, funkcije, strukture, metode i klase na nivou celog rešenja. Osnovni modifikatori pristupa su:
- Public – javan, bez restrikcija.
- Protected Internal – limitiran na program, klasu i izvedene klase
- Internal – limitiran na program i klasu
- Protected – limitiran na klasu i izvedene klase.
- Private – limitiran samo na klasu
- Static – omogućava da nam nije potrebno da instaciramo klasu kako bi smo pristupili članu klase
Primer: jednostavna klasa
class Automobil
{
public string Marka;
public int Godiste;
public string Boja;
public void PrikaziPodatke()
{
Console.WriteLine("Marka: " + Marka + ", Godište: " + Godiste + ", Boja: " + Boja);
}
}
class Program
{
static void Main()
{
Automobil a = new Automobil(); // kreiranje objekta
a.Marka = "Fiat";
a.Godiste = 2010;
a.Boja = "Crvena";
a.PrikaziPodatke();
}
}
🟢 Izlaz:
Marka: Fiat, Godište: 2010, Boja: Crvena
DRUGI ČAS: KONSTRUKTORI U KLASI
1. Šta je konstruktor?
Konstruktor je specijalna metoda koja se automatski poziva prilikom kreiranja objekta.
Ima isto ime kao i klasa, nema tip povratne vrednosti, čak ni void.
Koristi se za inicijalizaciju polja objekta.
Deo lekcije ->
Konstruktori
Šta su konstruktori? Konstruktori su specijalne metode koje služe za inicijalizaciju objekata nakon njihovog kreiranja. Oni obezbeđuju da objekat ima dobro definisano početno stanje pre nego što se upotebi. Ako ne uspe inicijalizacija neće postojati objekat.
Za imenovanje konstruktora koristi se ime klase (metoda ima isto ime kao i klasa) iza koga slede zagrade.
Konstruktori nemaju povratnu vrednost, pa čak ni tipa void.
1. način (jednostavniji) na koji se mogu objasniti konstruktori:
Constructor - konstruktor je najjednostavnije rečeno prva metoda koja se izvršava kad se poziva vaša klasa, stručnije rečeno kad se stvara primerak tipa. Svaka klasa ima konstruktor čak iako ga vi ne napišete i svaki konstruktor se u C# programskom jeziku zove isto kao i klasa. Znači konstruktor je specijalna metoda. Konstruktori jesu specijalna metoda, više metoda koja ne vraća vrednost ali bez ključne reči void jer konstruktori nikada ne mogu da vraćaju vrednosti. Konstruktori služe da vi inicijalizujete podatke klase ili strukture pre upotrebe.
Svaka klasa ili struktura može imati jedan konstruktor, čak iako ga ne napišete ili možete imati više konstruktora, ali svi se oni zovu isto kao i klasa. Međutim, da bi se konstruktori razlikovali jedan od drugog oni moraju da imaju različite atribute. Sintaksa za konstruktor je sledeća:
public class ime_klase
{
public bool ime_promenljive;
public ime_klase( bool ime_atributa )
{
ime_promenjive = ime_atributa;
}
}
Možete pomisliti da u navedenoj sintaksi postoji greška, da je trebalo napisati ime konstruktora, ali jednostavno ime konstruktora nije opcija, već kao što je rečeno ime konstruktora mora biti isto kao i ime klase!
(izvor, www.manuelradovanovic.com )
*
2. Podrazumevani konstruktor
Ako ne napišemo nijedan konstruktor, kompajler automatski pravi prazan konstruktor.
class Ucenik
{
public string Ime;
public string Prezime;
public double Prosek;
}
class Program
{
static void Main()
{
Ucenik u = new Ucenik(); // poziva se podrazumevani konstruktor
u.Ime = "Ana";
u.Prezime = "Petrović";
u.Prosek = 4.8;
Console.WriteLine(u.Ime + " " + u.Prezime + " - " + u.Prosek);
}
}
Deo lekcije ->
*
Vrlo je bitno da zapamtite osobine podrazumevanih konstruktora zbog njegove dalje upotrebe u raznim Vašim programima (koristićete ih u svakoj klasi koju napravite).
Osobine podrazumevanog konstruktora su:
- Podrazumevani konstruktor ne prima parametre.
- Podrazumevani konstruktor implicitno inicijalizuje sva nestatička polja na njihove podrazumevane vrednosti i to:
- numerička polja (int, double,decimal) na nulu
- logička polja na false
- polja referentnog tipa na null
- polja tipa zapis tako da su svi elementi zapisa inicijlizovani na njihove podrazumevane vrednosti.
Modifikator pristupa je public.
Konstruktor može primiti jedan ili više parametara koji se koriste za inicijalizaciju polja.
Ako se u klasi deklariše bar jedan konstruktor, kompajler neće generisati podrazumevani konstruktor.
Sva polja koja nisu inicijalizovana u korisnički definisanom konstruktoru zadržavaju svoju podrazumevanu inicijalizaciju.
Za jednu klasu može se definisati više konstruktora.
NAPOMENA: lista parametara svakog od njih mora biti jedinstvena, ili po broju ili po tipu parametara (odnosno moraju imati različite potpise)
3. Konstruktor sa parametrima
Omogućava da odmah prilikom kreiranja objekta postavimo vrednosti polja.
class Ucenik
{
public string Ime;
public string Prezime;
public double Prosek;
// konstruktor sa parametrima
public Ucenik(string ime, string prezime, double prosek)
{
Ime = ime;
Prezime = prezime;
Prosek = prosek;
}
public void Prikazi()
{
Console.WriteLine(Ime + " " + Prezime + " - " + Prosek);
}
}
class Program
{
static void Main()
{
Ucenik u = new Ucenik("Marko", "Jovanović", 4.5);
u.Prikazi();
}
}
🟢 Izlaz:
Marko Jovanović - 4.5
4. Konstruktor kopije
Konstruktor kopije pravi novi objekat tako što kopira vrednosti iz postojećeg objekta.
class Ucenik
{
public string Ime;
public string Prezime;
public double Prosek;
public Ucenik(string ime, string prezime, double prosek)
{
Ime = ime;
Prezime = prezime;
Prosek = prosek;
}
// konstruktor kopije
public Ucenik(Ucenik drugi)
{
Ime = drugi.Ime;
Prezime = drugi.Prezime;
Prosek = drugi.Prosek;
}
public void Prikazi()
{
Console.WriteLine(Ime + " " + Prezime + " - " + Prosek);
}
}
class Program
{
static void Main()
{
Ucenik u1 = new Ucenik("Mila", "Ilić", 5.0);
Ucenik u2 = new Ucenik(u1); // kopija
u2.Ime = "Jovan"; // menja samo kopiju
u1.Prikazi(); // Mila Ilić - 5.0
u2.Prikazi(); // Jovan Ilić - 5.0
}
}
--->>> konstruktor kopije omogućava da napravimo nezavisnu kopiju objekta.
5. Vežbe
Vežba 1
Napisati klasu Krug sa poljem Poluprecnik.
Napraviti:
-
konstruktor bez parametara (podrazumevani, r = 1),
-
konstruktor sa parametrima (
Krug(double r)), -
konstruktor kopije (
Krug(Krug k)).
Dodati metodu Povrsina() i testirati sve konstruktore.
✅ Rešenje:
class Krug
{
public double R;
public Krug() { R = 1; }
public Krug(double r) { R = r; }
public Krug(Krug k) { R = k.R; }
public double Povrsina()
{
return Math.PI * R * R;
}
}
Vežba 2
Napisati klasu Film sa poljima: Naziv, Zanr, Trajanje.
Napraviti konstruktor sa parametrima i konstruktor kopije.
U Main() napraviti jedan film, pa njegovu kopiju i proveriti da li su vrednosti nezavisne.
6. Pitanja za samostalni rad / proveru znanja
-
Šta je klasa?
- Kada se poziva konstruktor?
-
Na koji način se poziva konstruktor kopije?
-
Napisati primer definicije konstruktora sa parametrima.
Ukratko:
| Pojam | Objašnjenje |
|---|---|
| Klasa | Šablon iz kojeg nastaju objekti |
| Konstruktor | Specijalna metoda koja se poziva pri kreiranju objekta |
| Podrazumevani konstruktor | Automatski postoji ako ga ne definišemo sami |
| Konstruktor sa parametrima | Inicijalizuje polja pri kreiranju objekta |
| Konstruktor kopije | Stvara novi objekat kopiranjem postojećeg |