Professional Documents
Culture Documents
Auditorne Vježbe 6
Auditorne Vježbe 6
Osijek
Auditorne vjebe Kneza Trpimira 2b
31000 Osijek
www.etfos.hr
U ovom poglavlju nauiti ete koji su osnovni standardi za kreiranje suelja u Windows
aplikaciji. Kako se dodaju nove forme u Windows aplikaciju, to su SDI, a to MDI forme , te
kako se dodaju izbornici u formu. U nekoj aplikaciji za kreiranje suelja mogu se koristiti ove
dvije vrste formi:
Kod SDI suelja svaka forma moe se micati samostalno neovisno o ostalim formama. Da
bi Windows aplikacija bila efikasnija i ugodna za upotrebu korisniku, potrebno je drati se
nekih standarda pri izradi formi (Barker, 2007): tj. koristiti ustaljenu kombinaciju boja koje
ne iritiraju korisnike (npr. standardne su siva ili bijela boja pozadina formi). Prikazivati
dugmad na standardnim mjestima i biti konzistentan u poloaju dugmadi (npr. dugme za
povratak na prethodni ekran stalno na istom mjestu). Konzistentno koristiti izbornike i alate sa
sliicama (koristiti iste izbornike i sliice na svim formama, i po mogunosti one koji su
standardni za veinu Windows aplikacija, npr. File, Edit, View, Window, Help). Upotrijebiti
pravu kontrolu za prave svrhe (u izboru kontrola koje dodajemo na formu paziti da budu
logine kako bi korisniku olakale unos podataka i rukovanje aplikacijom, npr. ako korisnik
treba unijeti podatak za koji postoje unaprijed utvrene mogue vrijednosti, koristiti
ComboBox ili ListBox umjesto textBox-a za unos) .
Svojstva forme:
U Visual Studio 2008 svojstva forme prikazuju se u prozoru Properties kada miem
oznaimo formu. Svojstva se mogu podijeliti u 9 kategorija. Kategorije e se prikazati u
prozoru Properties ako kliknemo miem na dugme Categorized ispod naziva forme u tom
prozoru. Dugme Categorized prikazuje svojstva grupirana u kategorije, takoer postoji
dugme koje prikazuje svojstva po abecedi. Neke od kategorija svojstava koje emo kroz
vjebe i zadatke koristiti su:
Izgled (eng. Appearance) podeavanje postavki prikaza kao npr. boje pozadine,
irine, visine, pokazivaa i dr.).
Ponaanje (eng. Behavior) podeavanje ponaanja forme, npr. da li e forma biti
omoguena (svojstvo Enabled).
Dizajn forme (eng. Design) odreuje naziv forme, jezik upotrebe, zakljuavanje i dr.
Predloak (eng. Layout) odreuje poetni poloaj, min. ili max. veliinu i dr.
Razliito (eng. Misc skraeno od Miscellaneous) odreuje da li e se tipka Enter
koristiti kao AcceptButton, a tipka Esc kao CancelButton i dr.
U Visual Studio 2008 otvorite novi projekt pod nazivom Forme. Kreirati emo
aplikaciju koja koristi i SDI i MDI forme. Kreirajte prvu formu s kontrolama kao na slici:
Nakon to korisnik klikne miem na dugme ''Unos podataka'', elimo da se otvori nova
forma u kojoj e korisnik moi unijeti podatke. To e biti SDI forma, jer e se otvarati u
novom samostalnom prozoru i nee biti podreena prvoj formi. Potrebno je u Visual Studio
2008 kreirati novu formu (pod nazivom Form2), a zatim u kodu programa pozvati prikaz te
nove forme.
Postupak za kreiranje nove SDI forme: Nova forma se moe kreirati na dva naina:
1. Aktivirati izbornik Project -> Add Windows Form, (ili Add New Item), te u prozoru
odabrati Windows form, i upisati eljeni naziv forme (npr. Form2).
2. U prozoru Solution Explorer oznaiti naziv aplikacije (Forme), kliknuti na desno
dugme mia i u iskonom izborniku izabrati Add -> New Item. Oznaiti Windows
form za kreiranje nove forme. Upisati naziv nove forme. Nakon ovog postupka, u
prozoru Solution Explorer prikazat e se nova forma kao dio istog projekta, pod
nazivom Form2.cs.
Klikom mia na prvu formu (Form1.cs) vraamo se na tu prvu formu kako bismo napisali
naredbe kojima e se nakon klika miem na tipku ''Unos podataka'' prikazati druga forma.
Dvokliknite miem na tipku ''Unos podataka'' kako biste se pozicionirali u programski kod.
Kada se nalazite u metodi button1_Click, upiite sljedee naredbe za prikaz nove forme:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(); frm.Show();
}
Vratite se natrag u dizajn aplikacije. Na drugu formu dodajte sada kontrole s kojima e
korisnik moi unijeti podatke, npr. Ime i prezime, te Ocjenu studenta (labele i okvire za tekst).
Postavite svojstvo za text druge forme na ''Unos podataka'' (tako da u naslovnoj traci forme
pie taj naslov forme. U drugu formu dodajte sljedee kontrole za unos podataka o
studentima, te dugme za povratak na prethodnu formu:
U ovoj fazi neemo pisati naredbe programa koje e se izvriti kada korisnik klikne na dugme
''Povratak'', nego objasniti dalje rad s vie formi. Sada elimo kada korisnik klikne na dugme
''Izvjetaji'' kreirati MDI formu koja e biti u okviru prve forme (Form1), odnosno njezin
potomak. Da bismo to mogli ostvariti, potrebno je sljedee:
U dizajnu forme Form1 kliknuti dvaput na dugme ''Izvjetaji'' kako bismo se pozicionirali
u kod programa, u metodu button2_click(), i tamo upisati potrebne naredbe da se deklarira i
otvori nova forma MDI dijete. Postupak:
1. Kreirajte novu formu na isti nain kao to je kreirana forma Form2. Novoj formi
dodijelite naziv Form3. Provjerite da li se u prozoru Solution Explorer nalazi na
popisu formi Form3.
2. Vratite se u dizajn forme Form1. Oznaite formu i u prozoru Properties postavite
svojstvo IsMDIContainer na vrijednost True (time smo omoguili da ta forma bude
MDI roditelj forma). Forma e promijeniti boju (postat e transparentna).
3. Kliknite dvaput na dugme ''Izvjetaji''. U metodi button2_Click() upiite sljedei kod:
Nakon toga u dizajnu Form3 forme dodajte kontrole kao na sljedeoj slici (koje e omoguiti
ispis izvjetaja o imenu i prezimenu i ocjeni):
Naredbe koje e se izvriti kada korisnik klikne na tipku ''Povratak'' za sada neemo pisati,
niti ispisivati vrijednosti za ime i prezime, te ocjenu, budui da e to biti obraeno u sljedeim
poglavljima. Pohranite i pokrenite aplikaciju tipkom Debug. Kliknite miem na dugme
''Izvjetaji''. Pojavit e nova forma, ali unutar prozora prve forme kao na slici:
Koristei mi poveajte prvu formu tako da se untar njezinog prozora vidi cijela druga forma.
Drugu formu ne moete pomicati izvan prve (roditeljske), to je karakteristika MDI formi.
Rad s izbornicima
Izbornici (eng. menus) su vaan dio korisnikog suelja Windows aplikacije. U Visual
Studio 2008 izbornici se dodaju na formu s pomou kontrole MenuStrip. Mogue je dodati
horizontalne i vertikalne izbornike, te njihove podizbornike. Naredbe (odgovor na dogaaj)
koje e izvriti klikom korisnika na odgovarajui izbornik, piu se u programskom kodu
nakon dvoklika miem na element izbornika.
Da biste u aplikaciju Forme dodali izbornik na vrhu prozora, na prvoj formi (Form1) u
dizajnu aktivirajte Toolbox, te izaberite kontrolu MenuStrip (nalazi se u grupi kontrola pod
naslovom Menus & Toolbars). Povucite je miem na formu, i smjestite u gornji lijevi vrh
forme. U prazno polje za upis (oznaeno s Type here upiite prvi element izbornika, npr.
Datoteka kao na sljedeoj slici:
Ispod toga upiite element Spremi, pa ispod toga Zatvori. U vodoravnoj razini upiite
izbornike Unos, Izvjetaji, Pomo. U izbornik Unos umetnite u okomitoj razini elemente
Unos studenata, Unos predmeta, Unos ocjena ili neke druge proizvoljne elemente. U
izbornik Izvjeaji umetnite u okomitoj razini elemente Prema broju indeksa, Prema
datumu ili dr. Pohranite i debug-irajte aplikaciju. Pogledajte kako izgledaju izbornici na
prvoj formi. Izvravanje naredbi klikom na izbornik bit e takoer obraeno u sljedeim
poglavljima.
Svaki programski jezik sastoji se od niza kljunih rijei koje imaju svoje unaprijed
odreeno znaenje i mogu se koristiti za pisanje naredbi programa. Osim koritenja ugraenih
kljunih rijei, u naredbama koristimo i proizvoljne nazive za klase, objekte, metode i
varijable. Do sada smo u primjerima uvijek koristili klase koje su ve ugraene u razvojni
alat Visual Studio 2008 (npr. klasa Form koja je oznaavala formu u Windows aplikaciji).
Meutim, u aplikaciji programeri esto trebaju kreirati vlastite klase po potrebi. Kako kreirati
vlastite klase? Za odgovor na to pitanje, potrebno je razumjeti osnovne koncepte objektnog
programiranja to su tipovi, klase, instance, objekti.
Bit objektnog programiranja je kreiranje novih tipova. Tip predstavlja neku stvar (eng.
thing). Ponekad je stvar abstraktna (npr. tablica), a ponekad je vrlo konkretna (npr. dugme u
nekom prozoru). Tip definira opa svojstva i ponaanje neke stvari. Npr. dugme (kontrola
button) je jedan tip objekta. OK je jedna instanca dugmeta, Cancel je jedna instanca dugmeta,
Help je jedna instanca dugmeta. Sva ova tri objekta su tipa button (sve su to dugmadi).
Ako smo kreirali tri dugmeta (OK, Cancel i Help), sva tri nasljeuju svojstva koja ima
tip button: svojstvo visine, irine, text koji e pisati na dugmetu, poloaj dugmeta na formi i
druga svojstva zajednika svim instancama koje pripadaju tipu button. Ta se karakteristika
objektnog programiranja zove NASLJEIVANJE. NASLJEIVANJE je mogunost da
instance preuzimaju sva svojstva tipa kojem pripadaju.
Klase se najee koriste, pa e biti detaljnije objanjene u nastavku. KLASA je neki tip
promatranih objekata. Klasa je adekvatna skupini ili vrsti kod biolokih bia, npr. skupina
pasa, maaka, studenata, radnika, artikala, itd. Objekt je instanca neke klase.
Primjeri:
1. Pas = klasa Rex = instanca klase Pas (konkretan pas iz klase Pas)
2. Student = klasa Pero Peri = instanca klase Student
3. Button = klasa OK button koji napravimo u aplikaciji = instanca klase button
Kada kreiramo neku vlastitu klasu, potrebno je definirati:
1. njezina svojstva (properties) ili varijable kojima e dodjeljivati vrijednosti (ako se radi
o javnim svojstvima, tada se koristi izraz svojstvo (eng. property), a ako se radi o
privatnim varijablama koje e se koristiti samo u toj klasi, tada govorimo koristimo
izraz varijabla
2. metode koje odreuju njezino ponaanje. Naredba za kreiranje nove klase poinje
kljunom rijei class, zatim dolazi naziv klase, zatim deklaracija svojstava
(properties) koja se definiraju za tu klasu, te metode koje pripadaju klasi.
class mojaKlasa {
//ovdje definicija svojstava ili varijabli, npr. int mojaVarijabla;
}
Gornjim naredbama kreirali smo klasu pod nazivom mojaKlasa, i njoj pripadajuu
cjelobrojnu varijablu pod nazivom mojaVarijabla kojoj e se unutar klase mojaKlasa moi
dodjeljivati vrijednosti. Npr. sljedeim naredbama definira se klasa ili skupina objekata
Student, a unutar nje metoda pod nazivom Main(). Main() je glavna metoda za neki program,
a nalazi se u datoteci Program.cs u okviru Solution Explorer-a. U metodi Main() se definira
instanca klase.
class Student {
// ovdje definiramo svojstva koja pripadaju toj klasi:
int Ocjena;
// ovdje definiramo metodu:
public void Main() {
Student Pero = new Student();
Pero.Ocjena= 3;
}
}
Kreirali smo instancu Pero koja pripada klasi Student, varijabli Ocjena koja pripada
instanci Pero dodjelili smo vrijednost 3. Naredba kojom se definira instanca neke klase
izgleda ovako: (npr. za kreiranje instance Pero klase Student).
Naredba sadri na kraju zagrade (), pa izgleda kao da poziva metodu. Zapravo, pri
kreiranju nove instance poziva se jedna metoda koja se zove konstruktor (eng. constructor).
Zadatak konstruktora je kreirati instancu (objekt) neke klase i omoguiti da se toj instanci
dodijeli vrijednost kasnije u programu. Nakon to se konstruktorom kreira nova instanca, u
memoriji se ostavlja prostor za vrijednosnu instancu. Ako ne specificiramo koji konstruktor
pozivamo, CLR poziva standardni (default) konstruktor kojim se definira nova instanca klase
i ne prosljeuju mu se nikakve vrijednosti. Zato u zagradama kod ovog standardnog
konstruktora ne piemo nita. Ukoliko se eli koristiti neki vlastiti odreeni konstruktor, tada
se on mora deklarirati u programu prije samog koritenja.
Primjer: deklariranje konstruktora koji e ispisivati sistemsko vrijeme
Time(System.DateTime dt) {
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
Metoda je neka funkcija koja se nalazi unutar klase. Ona je lan (eng. member) klase.
Metode definiraju to klase rade i kako se klase ponaaju. Metodama koje sami kreiramo
moemo dati proizvoljne naziv, npr. Ispis(), Racunanje(), itd. Ako elimo napisati odgovor
na dogaaj klik mia na neku kontrolu (button ili dr.), dvostrukim klikom mia program e
kreirati metodu i dati joj standardni naziv, npr. button1Click(). U svakoj aplikaciji postoji
prva, glavna metoda iz koje se pozivaju sve ostale metode te aplikacije. Ta se metoda zove
Main(). Otvorite u Visual Studio 2008 novi projekt (Windows aplikaciju) i dajte joj ime
RadSaKlasama. U Solution Explorer prozoru kliknite na Program.cs. Pojaviti e se
programski kod za glavni program aplikacije koji poziva sve metode te aplikacije. Glavni
program aplikacije izgleda ovako:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace RadSaKlasama
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Application.Run(new Form1());
Neke metode uope ne vraaju nikakve vrijednosti. Takve metode samo neto izvode,
i tada je tip metode void, a u zagradi se ne pie nita, npr. ovako:
void myVoidMethod( );
private znai da se metoda koristi samo unutar jedne klase u kojoj je deklarirana, void
znai da metoda ne vraa nikakvu vrijednost, button1Click je naziv metode. Metodi se u
zagradi prosljeuju parametri koji su standardni za neku click metodu.
Komentari se u programski kod umeu zbog vie razloga: Kako bi olakali programeru
snalaenje u kodu (zbog moguih kasnijih ispravki), te kako bi omoguili izradu adekvatne
programske dokumentacije. Postoji tri osnovna naina upotrebe komentara:
1. C++ stil: // ovo je C++ stil pisanja komentara i vrijedi do kraja // jedne linije
2. C stil: /* ovo je C stil pisanja komentara. Komentar se moe pisati kroz vie linija a
vrijedi do znaka */
3. Komentari za XML dokumente
Operator . koristi se za pristup metodi ili svojstvu unutar neke klase, te kako bi ograniio
naziv klase na odreeni prostor za nazive (namespace), npr. u naredbi:
using System.Windows.Forms;
Primjer:
Student.Pero.Visina=175;
koristi instancu Pero klase Student, i njegovom svojstvu Visina dodjeljuje vrijednost 175.
Pri koritenju metode Main() vidjeli smo da naredba sadri kljunu rije static:
Rije static znai da se ta metoda moe pozvati samostalno bez prethodnog pozivanja
klase. Moete je koristiti bez da u ruci imate instancu te klase. Svojstva i metode neke klase
mogu biti instance ili statini lanovi. Ako su instance, moraju se pozivati preko operatora ''.''
tako da se najprije navede klasa kojoj pripadaju, npr. ako definiramo klasu Student, i u okviru
nje instancu Pero, a zatim neku metodu Upisi() (kojom e se studenti upisivati na fakultet),
tada se ta metoda poziva:
Kljuna rije this odnosi se na trenutnu instancu neke klase (ili drugog objekta). this
je skriveni pokaziva (pointer) na svaku nestatinu metodu neke klase. Postoje 3 naina
upotrebe this:
1. nain: U svrhu kvalificiranja instance ako se ona zove isto kao i parametar koji se
prosljeuje nekoj metodi, pa tada this omoguava da se odredi na koju se vrijednost misli:
Ovaj primjer uspostavlja dvije klase, jedna je klasa koja ima metodu FirstMethod(), a druga
je klasa OtherClass koja ima metodu SecondMethod(). Ako unutar prve metode elimo
pozvati metodu koja pripada drugoj klasi, tada tu drugu metodu moramo pozvati iz te druge
klase. Tu klasu ne moemo koristiti pod njezinim nazivom, nego moramo proslijediti
parametar varijablu koja je tipa OtherClass.
3. nain: koritenjem indeksera. Primjer ako this koristimo u svrhu odreivanja ije svojstvo
(property) e se koristiti:
label4.Text = this.ImePrezimeStudenta;
textBox1.Text = this.Ocjena;
Gornjom naredbom u tekstu textBox1 e se ispisati vrijednost svojstva Ocjena koje pripada
aktualnoj klasi (u kojoj se nalazi ta metoda i naredba).
class tocka
{
public int x;
public int y;
}
class tockaApp
{
public static void Main()
{
tocka starting = new tocka();
tocka ending = new tocka();
starting.x = 1;
starting.y = 4;
ending.x = 10;
ending.y = 11;
System.Console.WriteLine("Tocka 1: ({0},{1})", starting.x, starting.y);
System.Console.WriteLine("Tocka 2: ({0},{1})", ending.x, ending.y);
}
}
Rekli smo da su prednosti objektno orijentiranog programiranja mogunost kontrole
pristupa podacima.U gornjem primjeru koristili smo javni pristup varijablama i pristup je
dozvoljen iz bilo kojeg dijela programa. No mi elimo imati kontrolu nad pristupom
varijablama i drati ih pod private pristupom. C# stoga ima koncept zvan svojstva
(properties) koja omoguavaju pristup privatnim lanovima i koja emo kasnije jo detljanije
objasniti.
class tocka
{
int privatni_x; //private
int privatni_y; //private
public int x
{
get
{
return privatni_x;
}
set
{
privatni_x = value;
}
}
public int y
{
get {
return privatni_y;
}
set {
privatni_y = value;
}
}
class tockaApp
{
public static void Main()
{
tocka starting = new tocka();
tocka ending = new tocka();
starting.x = 1;
starting.y = 4;
ending.x = 10;
ending.y = 11;
System.Console.WriteLine("Tocka 1: ({0},{1})", starting.x, starting.y);
System.Console.WriteLine("Tocka 2: ({0},{1})", ending.x, ending.y);
}
}
U gornjem primjeru smo napravili dva svojstva public int x i public int y. Oni sada
omoguuju pristup varijablama x i y koje su sada pod kljunom rijei private. Unutar
svojstava set naredba se izvrava uvijek kada postavljamo vrijednost privatnim varijablama, a
get naredba kada itamo vrijednost varijabli. U slijedeem primjeru:
x=13;
poziva se svojstvo i izvrava se kod unutar set naredbe i postavlja vrijednost varijable
privatni_x na 13.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sharp
{
class Krug
{
public int x;
public int y;
public double radius;
public double area()
{
double theArea;
theArea = 3.14159 * radius * radius;
return theArea;
}
public double radijus()
{
double theCirc;
theCirc = 2 * 3.14159 * radius;
return theCirc;
}
}
class KrugApp
{
public static void Main()
{
Krug prvi = new Krug();
Krug drugi = new Krug();
double area;
double circ;
prvi.x = 10;
prvi.y = 14;
prvi.radius = 3;
drugi.x = 10;
drugi.y = 11;
drugi.radius = 4;
System.Console.WriteLine("Krug 1: Centar = ({0},{1})",
prvi.x, prvi.y);
System.Console.WriteLine(" Radius = {0}", prvi.radius);
System.Console.WriteLine(" Area = {0}", prvi.area());
System.Console.WriteLine(" Circum = {0}", prvi.radijus());
area = drugi.area();
circ = drugi.radijus();
System.Console.WriteLine("\nKrug 2: Centar = ({0},{1})",
drugi.x, drugi.y);
System.Console.WriteLine(" Radius = {0}", drugi.radius);
System.Console.WriteLine(" Area = {0}", area);
System.Console.WriteLine(" Circum = {0}", circ);
}
}
}
Rezultat:
Krug 1:
Centar = (10,14)
Radius = 3
Area = 28.27431
Circum = 18.84954
Krug 2:
Centar = (10,11)
Radius = 4
Area = 50.26544
Circum = 25.13272
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sharp
{
public class test
{
static public int sctr = 0;
public int ctr = 0;
public void routine()
{
Console.WriteLine("In the routine - ctr = {0} / sctr = {1}", ctr, sctr);
}
public test()
{
ctr++;
sctr++;
Console.WriteLine("In Constructor");
}
~test()
{
Console.WriteLine("In Destructor");
}
}
class TestApp
{
public static void Main()
{
Console.WriteLine("Start of Main method");
test first = new test();
test second = new test();
first.routine();
test third = new test();
third.routine();
second.routine();
Console.WriteLine("End of Main method");
}
}
}
Rezultat:
Primjer:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sharp
{
class Osoba
{
protected string Ime;
protected string Nadimak;
protected string Prezime;
private int godine;
public Osoba()
{
}
public Osoba(string fn, string ln)
{
Ime = fn;
Prezime = ln;
}
public Osoba(string fn, string mn, string ln)
{
Ime = fn;
Nadimak = mn;
Prezime = ln;
}
public Osoba(string fn, string mn, string ln, int a)
{
Ime = fn;
Nadimak = mn;
Prezime = ln;
godine = a;
}
public void displaygodine()
{
Console.WriteLine("godine {0}", godine);
}
public void displayFullName()
{
StringBuilder FullName = new StringBuilder();
FullName.Append(Ime);
FullName.Append(" ");
if (Nadimak != "")
{
FullName.Append(Nadimak[0]);
FullName.Append(". ");
}
FullName.Append(Prezime);
Console.WriteLine(FullName);
}
}
class NameApp
{
public static void Main()
{
Osoba myWife = new Osoba("Melissa", "Anne", "Jones", 21);
Zaposlenik me = new Zaposlenik("Bradley", "L.", "Jones", 23);
Zaposlenik you = new Zaposlenik("Kyle", "Rinni", 2000);
myWife.displayFullName();
myWife.displaygodine();
me.displayFullName();
Console.WriteLine("Godina Zaposlenja: {0}", me.godinaZaposlenja);
me.displaygodine();
you.displayFullName();
Console.WriteLine("Zaposleni ste: {0}", you.godinaZaposlenja);
you.displaygodine();
}
}
Rezultat:
Melissa A. Jones
godine 21
Zaposlenik: Bradley L. Jones
Godina zaposlenja: 0
Age 23
Zaposlenik: Kyle Rinni
Zaposleni ste: 2000
godine 0
Primjer polimorfizma:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sharp
{
class Osoba
{
protected string Ime;
protected string Prezime;
public Osoba()
{
}
public Osoba(string fn, string ln)
{
Ime = fn;
Prezime = ln;
}
public void displayFullName()
{
Console.WriteLine("{0} {1}", Ime, Prezime);
}
}
class Zaposlenik : Osoba
{
public ushort gZaposlenja;
public Zaposlenik()
: base()
{
}
public Zaposlenik(string fn, string ln)
: base(fn, ln)
{
}
public Zaposlenik(string fn, string ln, ushort hy)
: base(fn, ln)
{
gZaposlenja = hy;
}
public new void displayFullName()
{
Console.WriteLine("Zaposlenik: {0} {1}", Ime, Prezime);
}
}
class NameApp
{
public static void Main()
{
Zaposlenik radnik = new Zaposlenik("Bradley", "Jones", 1983);
Osoba Brad = radnik;
radnik.displayFullName();
Console.WriteLine("Zaposlen godine: {0}", radnik.gZaposlenja);
Brad.displayFullName();
}
}
U gonjrem primjeru smo stvorili instancu klase Zaposlenik sa imenom radnik. Nakon toga
smo stvorili referencu na klasu Osoba sa imenom Brad i pridjelili mu adresu instance radnik.
Nakon toga pozivamo metodu za ispis imena na dva naina. Prvi put pozivamo je preko
objekta radnik i poziva se metoda koja pripada klasi Zaposlenik, no u drugom sluaju poziva
se preko reference na klasu Osoba i pozvat e se metoda iz klase Osoba iako objekt pripada
klasi Zaposlenik. Ako elimo da se pozove metoda klase kojoj pripada objekt, a ne referenca
metodu moramo proglasiti virtualnom.
Rezultat:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sharp
{
class Osoba
{
protected string ime;
protected string prezime;
public Osoba()
{
}
public Osoba(string fn, string ln)
{
ime = fn;
prezime = ln;
}
public virtual void displayFullName()
{
Console.WriteLine("{0} {1}", ime, prezime);
}
}
class Zaposlenik : Osoba
{
public ushort gZaposlenja;
public Zaposlenik()
: base()
{
}
public Zaposlenik(string fn, string ln, ushort hy)
: base(fn, ln)
{
gZaposlenja = hy;
}
public override void displayFullName()
{
Console.WriteLine("Zaposlenik: {0} {1}", ime, prezime);
}
}
// Klasa Poslodavac nasljeuje klasu Osoba...
class Poslodavac : Osoba
{
public string tvrtka;
public Poslodavac()
: base()
{
}
public Poslodavac(string fn, string ln, string c)
: base(fn, ln)
{
tvrtka = c;
}
public override void displayFullName()
{
Console.WriteLine("Poslodavac: {0} {1}", ime, prezime);
}
}
class NameApp
{
public static void Main()
{
Osoba Brad = new Osoba("Bradley", "Jones");
Osoba me = new Zaposlenik("Bradley", "Jones", 1983);
Osoba Greg = new Poslodavac("Hill", "Batfield", "Data Diggers");
Brad.displayFullName();
me.displayFullName();
Greg.displayFullName();
}
}
}
Rezultat:
Bradley Jones
Zaposlenik: Bradley Jones
Poslodavac: Hill Batfield
U gornjem primjeru metoda displayFullName je virtualna i iako svaki njen poziv ide preko
reference na klasu Osoba poziva se metoda iz klase kojoj pripada objekt na koji pokazuje
referenca.
1.8. Nizovi, liste i kolekcije
U .NET-u postoji vie naina kako pohraniti vie objekata u jednu kolekciju (ili skup)
objekata. Neki od tih naina su: Nizovi (Arrays), Liste (List ili ArrayList), Kolekcije
(Collection). Koriste se kada elimo npr. imena ili plae vie djelatnika pohraniti u jedan
zajedniki skup objekata i s tim skupom rukovati u aplikaciji (npr. sortirati, mijenjati
vrijednosti, brisati, prikazivati, i dr.). Taj skup objekata je indeksiran, tj. za svaki objekt u tom
skupu poznat je njegov poloaj (koji je on po redu u tom skupu). Indeksi kreu od vrijednosti
0 nadalje, npr. Djelatnik [0] Djelatnik [1] Djelatnik [2] . Itd. Klase koje su raspoloive za
skupove objekata u .NET-u su: Array, ArrayList, NameValueCollection, StringCollection,
Queue, Stack, and BitArray.
Nizovi
Niz (eng. array) je indeksirani skup objekata koji su istog tipa. Vrste nizova:
jednodimenzionalni, viedimenzionalni i ugnjedeni (tj. nizovi niza). S obzirom da su u C#-u
lanovi niza objekti, oni mogu imati svoja svojstva i metode. Kada se deklarira neki niz u
C#-u, automatski se kreira objekt u ugraenoj klasi System.Array (da Vaa aplikacija koristi
ovu klasu moete vidjeti u naredbi Using na poetku svoje aplikacije Using System.Array).
Automatski su na raspolaganju ugraene metode koje vrijede za ovu klasu, a neke od njih su:
Clear(), Copy(), Sort(), IndexOf() i dr. iji puni popis moete pronai u (Liberty,
Programming C#, OReilly, 2006).
type[ ] naziv-niza;
type oznaava tip niza, npr. string, int, double i dr. naziv-niza proizvoljni naziv niza. Na
primjer:
string[] imeStudenta;
Int[] ocjenaStudenta;
Double[] prosjOcjena;
Da bismo kreirali instancu niza (tj. ostavili prostor u memoriji za odreeni broj lanova tog
odreenog niza) potrebno je upisati ovakvu narebu: naziv-niza = new type[dimenzijaniza];
Upotreba nizova bit e objanjenja kroz primjer Nizovi. Otvorite novi projekt pod
nazivom Nizovi. Ccilj nam je kreirati u programskom kodu niz i taj niz ispisati u labelu na
formi. Liste i kolekcije emo dodati kasnije, pa zasad napravite samo label ''Rad s nizovim''
i dugme ''Ispii niz''.
Klinite na dugme ''Ispii niz'' i u metodi button1Click() deklarirat emo niz od 5 elemenata
koji e sadravati imena studenata, pa e biti tipa string. Deklarirati niz i dodijeliti mu
vrijednosti mogue je na vie naina:
1. nain: Ako bismo htjeli pojedinano dodjeljivati vrijednosti za imena studenata, tada
bismo u posebnoj naredbi deklarirali niz od 5 elemenata, a u posebnoj naredbi
dodijelili vrijednost prvom elementu, drugom, itd. ovako: imeStudenta = new
string[5]; imeStudenta[0] = "Marko"; imeStudenta[1] = Janko"; imeStudenta[2] =
Slavko"; imeStudenta[3] = Ante"; imeStudenta[4] = Andrija";
2. nain deklaracija niza i dodjela vrijednosti u jednoj liniji koda, ovako: string[]
imeStudenta = { "Marko", "Janko", "Slavko", "Ante", "Andrija" };
label2.Text = imeStudenta[0];
S obzirom da elemenata niza ima vie, da bismo ih sve ispisali, potrebna je petlja iteracije.
Ispis elemenata niza u petlji for i foreach. Petlja for izgledala bi ovako:
Znak += stavlja se kako bi u labelu uvijek ispisivala nova vrijednost kao dodatak staroj, a
ne samo zadnja. Znak \n oznaava prijelaz u novi red nakon svake vrijednosti. Petlja
foreach izgledala bi ovako:
Array.Sort(nazivniza);
Pohranite i debug-irajte aplikaciju. Kada kliknemo na dugme ''Ispii niz'' pojavit e sljedei
rezultat ispisa (imena e biti sortirana po abecedi):
Osim sortiranja, na nizovima se mogu primijeniti i druge metode, o kojima vie pogledajte u
(Liberty, Programming C#, OReilly, 2006).
Ako bismo niz htjeli popuniti brojanim vrijednostima, tada se to moe napraviti u petlji for,
npr. na sljedei nain:
Lista (eng. List) je skup objekata istog tipa koji se pohranjuju u zajedniki niz objekata
(ArrayList) i mogu se dodavati bez da unaprijed znamo dimenziju (broj elemenata) u nizu.
Pogodna je za upotrebu ako se vrijednosti objekata uitavaju od strane korisnika kroz formu
(npr. iz textBox-a). Sintaksa za deklaraciju liste:
Ako se u deklariranu listu imeStudenta ele pohraniti vrijednosti koje korisnik unese u
textBox1, naredba je sljedea:
imeStudenta.Add(textBox1.Text);
Nastavit emo projekt pod nazivom Nizovi. Nakon rada s nizovima, drugi cilj nam je:
Kreirati listu pod nazivom studenti, dodjeljivati joj vrijednosti koje korisnik unese u textBox
i ispisati elemente liste Za te potrebe dodajte kontrole za rad s listama objekata prikazane na
slici:
S obzirom da listu studenti elimo koristiti u vie metoda nae forme, neemo je deklarirati
unutar jedne metode, nego za cijelu formu, tj. odmah ispod naredbi kojima se kreira klasa
forme upisat emo deklaraciju liste:
namespace Nizovi
{
public partial class Form1 : Form
{
List<string> studenti = new List<string>();
}
}
List je tipa string, jer e se u njezine elemente upisivati tekstualne vrijednosti za imena
studenata, ali se u aplikaciji mogu kreirati i liste raznih drugih tipova (int, double, button, itd.)
Dodjeljivanje vrijednosti liste napravit emo u metodi koja se aktivira na klik mia na dugme
''Pohrani u listu''.
elimo listu puniti vrijednostima koje korisnik unese u textBox1, tj. nakon to korisnik
unese ime studenta u textBox1 i klikne na tipku ''Pohrani u listu'', elimo u listu studenti
pohraniti unesenu vrijednost za novi element liste. Da bismo to uinili, potrebno je dvaput
kliknuti na dugme ''Pohrani u listu'' kako bismo isprogramirali odgovor na dogaaj. U metodi
button2click upisat emo sljedeu naredbu:
studenti.Add(textBox1.Text);
Ova naredba dodat e novi element liste i u njega pohraniti vrijednost iz textBoxa1.
Na listi je mogue koristiti ugraene metode koje mogu npr. dodati novi element liste (Add),
prebrojati koliko je elemenata uneseno u listu (Count), prikazati koliko elemenata stane u listu
(Capacity), obrisati listu (Clear) i dr. U metodi button1click osim dodavanja elementa liste,
prebrojat emo i koliko je elemenata liste dodano, te koliki je kapacitet liste. Te emo podatke
upisati u labele (label6 i label7).
Kapacitet liste se mijenja dinamiki ovisno o broju unesenih elemenata u listu. Najprije se u
memoriji otvara mjesta za 4 elementa, a ako se unese 4 elementa, ostavlja se 8 itd. kapacitet
se automatski poveava. Cijela metoda button2click() izgleda ovako:
Da bismo ispisali elemente liste, potrebno je dvaput kliknuti na dugme Ispii listu, kako
bismo se pozicionirali u metodu button3click(). U njoj treba ispisati elemente liste u petlji
iteracije foreach:
Kolekcije
Djelatnici.Add(Marko Markovi);
Djelatnici.Add(Ivo Ivi);
Djelatnici.Add(Mara Mari) ;
Djelatnici.Remove(Marko Markovi);
Za ispis kolekcije na formu (npr. u labelu) koristi se petlja foreach na isti nain kao i kod
ispisa liste:
Za prebrojavanje elemenata kolekcije koristi se (kao i kod liste) metoda Count, npr. ako u
labelu 5 elimo ispisati koliko je elemenata u nekoj kolekciji:
Label5.Text= Djelatnici.Count;
U Visual Studio 2008 otvorite novu aplikaciju, nazovite je Kolekcije, te na formu dodajte ove
kontrole kao na slici:
Cilj vjebe je kreirati kolekciju djelatnika koja e biti tipa klase djelatnika. Klasa
djelatnika e imajti svojstva: imeDjelatnika i placaDjelatnika. Tim svojstvima treba unositi
vrijednosti putem textBoxova u jednoj formi, a zatim u putem izbornika, napraviti izvjetaj u
drugoj formi (Form2).
Otvoriti unutar iste aplikacije u C#-u posebnu datoteku u koju emo upisati kod za kreiranje
klase. Ta klasa e se moi koristiti u cijeloj aplikaciji. U izborniku Project->Add New Item,
pa u prozoru za izbor objekata izaberite CodeFile (jer ne otvaramo novu formu, nego novu
datoteku za pisanje programskog koda). Kao naziv datoteke upiite Djelatnik.cs. U novu
praznu datoteku Djelatnik.cs upiite ove naredbe za kreiranje nove klase:
public class Djelatnik {
private string imePrezime;
public string ImePrezime {
get {
return imePrezime;
}
set {
imePrezime = value;
}
}
private double placa;
public double Placa {
get { return placa;
}
set {
placa = value;
}
}
public Djelatnik(string imePrezime, double placa) {
this.ImePrezime = imePrezime; this.Placa = placa;
}
}
U datoteci Djelatnik.cs sada imamo kreiranu klasu Djelatnik sa svojstvima. Da bismo mogli
tu klasu koristiti za vie djelatnika, kreirat emo kolekciju klasa, i to kao svojstvo, jer je
elimo prenositi kroz vie formi iste aplikacije: Ta e kolekcija sadravati skup unesenih
djelatnika, dakle ona e biti tipa Djelatnik. Budui da je treba koristiti u vie metoda i vie
formi, kreirat emo je za cijelu formu Form1 kao svojstvo (kasnije i u Form2), tako da u
Form1.cs, odmah ispod deklaracije klase Form1 upiemo deklaraciju za kolekciju:
Da bismo u tako deklarirana svojstva unijeli vrijednosti koje korisnik unese u TextBox-ove,
dvaput emo kliknuti na dugme ''Pohrani'' i u metodi button1click() upisati naredbe za unos
vrijednosti u klasu Djelatnik. Za te potrebe, moramo kreirati instancu klase djelatnik, nazvat
emo je d, i ta instanca moe poprimiti vrijednosti unesene u textBox-ove, tako ih da ih
proslijedimo u zagradi. Naredbe izgledaju ovako:
S obzirom da izvjetaj elimo ispisati u drugoj formi, kreirat emo u istoj aplikaciji
formu Form2, i iz Form1 dvaput kliknuti na izbornik Izvjetaji/Ispis plaa da bismo doli u
metodu u kojoj treba upisati naredbe za kreiranje nove instance forme 2 (nazvat emo je
''Izvjetaji'', i proslijediti joj vrijednosti iz kolekcije Djelatnici ovako:
Ispis izvjetaja u Form2. U Form2 najprije emo dodati kontrole labela za ispis podataka, kao
na slici:
Nakon toga, u metodi Form2Load() treba upisati sljedee naredbe za ispis svojstava svih
djelatnika iz kolekcije. U petlji foreach se za svakog djelatnika u kolekciji Djelatnici ispisuju
podaci. Prije petlje dobro je isprazniti tekst u labelama, kako se ne bi vidjele na ekranu oznake
label3 i label5:
Pri tome je: Djelatnik = tip (klasa koju smo deklarirali u posebnoj .cs datoteci).
Zakljuak: Ako elimo vie objekata pohraniti u jedan zajedniki skup objekata, gdje e
objekti biti indeksirani, koristit emo ili nizove, ili liste ili kolekcije. Nizove, liste i kolekcije
najprije treba deklarirati, a zatim im dodijeliti vrijednosti. Ako se vrijednosti liste ili kolekcije
uitavaju iz forme, vrijednosti se pohranjuju s pomou petlje foreach u kojoj se deklarira neka
instanca koja predstavlja element te liste ili kolekcije. Ako elimo elemente liste ili kolekcije
koristiti kroz vie formi neke aplikacije, potrebno je: U posebnoj datoteci te aplikacije kreirati
vlastitu klasu objekata (npr. Djelatnik). U svakoj formi aplikacije deklarirati svojstva koja su
tipa kolekcije klase. U metodi koja treba ispisati ili uitati vrijednosti svojstvima koristiti
petlju foreach u kojoj se deklarira instanca klase.