Класе и методе класе

До класа долазимо полазећи од појединачних објеката. Посматрањем објеката уочавамо њихова заједничка својства која зовемо атрибутима. Такође, објектима можемо придружити исте „акције“ које у оквиру класе називамо методима класе. Њима описујемо функционалности објеката класе.
Класу дефинишемо навођењем резервисане речи class иза које следи идентификатор класе (име класе). Затим у витичастим заградама { } дефинишемо чланове класе (атрибути и методи).Погледајмо на примеру

class ime_klase
{
opis / definicija clanova klase
}

На пример, класу ученика можемо интуитивно дефинисати на следећи начин:


public class Ucenik
{
    //Navodimo atribute koje ce nasa klasa Ucenik da ima 
    String ime, prezime ;  
    char odeljenje ; 
    int razred ;
}

Напомена: Атрибутима описујемо одређену особину објекта ( име, презиме, разред, одељење ... ). Најчешће, различити објекти исте класе имају различите вредности атрибута. Често кажемо да вредности атрибута дефинишу стање објекта. При опису атрибута морамо навести тип коме тај атрибут припада (целобројни, реални, знаковни...) и име атрибута. При томе, наведени тип је претходно дефинисан (уграђен у систем или дефинисан од стране програмера).

Приступ атрибутима објекта у програмском језику C# реализујемо навођењем имена објекта, знака тачка (‘.’), па имена атрибута. На пример, ако је X објекат класе Ucenik, атрибуту разред приступамо са X.razred.

Пример 1. Направити класу која описује комлексне бројеве .

Решење:


Како правимо класу која описује реалне броје, морамо прво видети које ће атрибуте наша класа имати. Пошто знамо да комлексни бројеви имају свој имагинарни и реални део, наша класа ће имати два атрибута. Први ће бити атрибут који описује реални део комплксног број и он ће бити типа float истог типа ће бити атрибут који описује имагинарни део комплексног броја.
Слика 4.68. Представљање комплексног броја


public class KompleksniBroja
{
    //Navodimo atribute koje ce nasa klasa KompleksniBroj da ima 
    float re ;  
    float im ;     
}


Методом описујемо понашање објекта у одређеној ситуацији и под одређеним условима , али и одређујемо нове вредности на основу особина које објекат поседује (нпр. метод prosek). На тај начин описујемо функционалност објекта.
Пре позива метода везаног за класу неопходно је помоћу конструктора направити одређени објекат на који ће се тај метод применити. Дакле, прво правимо наш комплексан број, то ће бити објекат типа KompleksniBroj. Уколико у класи нисмо дефинисали конструктор(а то ћемо научити нешто касније), користимо подразумевани конструктор који увек постоји, а потом додељујемо вредности одређеним атрибутима на следећи начин : На пример,х ако је објекат класе KompleksniBroj, атрибуту Re приступамо са x.re . Погледајмо :

//Pomocu podrazumevanog konstruktora pravimo kompleksan broj 
 KompleksniBroj  a = new KompleksniBroj();
//Realnom delu dodeljujemo vrednost 5
a.re = 5;
//Imaginarnom delu dodeljujemo vrednost 3
a.im = 3;    

Метод класе је именовани блок наредби који се састоји из заглавља и тела метода. У заглављу наводимо повратни тип ( ако метод не производи вредност коју враћа, наводимо резервисану реч void ), затим име метода за којим следи у малим заградама списак параметара метода. За сваки параметар наводи се тип коме тај параметар припада као и име параметра. После заглавља у витичастим заградама наводимо тело метода које се састоји из одговарајућих наредби програмског језика C#.Наш метод би имао следећу синтаксу:



povratni tip ime_metode ( lista parametara koje metoda koristi )
{
telo metode
}

На пример, направићемо методу која исписује име, презиме и разред ученика.
Прво морамо одредиди тип наше методе. У овом случају то ће бити String јер желимо да вратимо низ карактера који исписују име, презиме и разред ученика. Затим морамо одредити које параметре наша метода приме . То су три параметра , параметар ime типа string , параметар prezime типа string и параметар razred типа int .

//Navodimo tip metode i parametre koje metoda koristi 
String ispisiIme( String ime, String prezime, int razred )
{ 
    //Povratna vrednost nase metode je string i njome ispisujemo zelenu recenicu 
    return  " Ucenik " + ime +  " "  + prezime +  "je " + razred +  .razred .
}



Сви атрибути конкретног објекта доступни су и видљиви свим методима тог објекта и трају док траје објекат. За разлику од њих, променљиве декларисане у оквиру неког од метода (локалне променљиве), настају извршавањем тог метода, видљиве су само у оквиру њега, и гасе се завршетком тог метода. Зато, ако је потребно да користимо вредност у оквиру више метода једне класе (или у више извршавања једног метода), можемо је дефинисати као атрибут класе.

Позив метода објекта у програмском језику C# реализујемо на следећи начин:

imeObjekta.imeMetoda( lista vrednosti parametara )

На пример, ако је x објекат класе Ucenik, метод ispisiIme позивамо
x.ispisiIme( ime,prezime,razred )
Више приче о класама следиће након неколико поглавља. Покушајмо сада да направимо једну методу класе KompleksniBroj коју смо претходно направили:

Пример 2. Направити метод који сабира два комплексна броја.

Ovo je Java Applet napravljen u GeoGebri sa www.geogebra.org - izgleda da nemate instaliranu Javu; molim otvorite www.java.com
Анимација 4.3. Представљање комплексног броја

*У случају да се анимација не приказује, притиснути дугме Прикажи слику



Решење:
Прво морамо одредити којег је типа наша метода. Како правимо методу која сабира два комплексна броја, онда знамо да као резултат добијамо комплексан број па је тип наше методе KompleksniBroj. Следеће што треба да одредимо јесу параметри које наша метода прима.Па како сабирамо два комплексна броја, следи да наша метода прима два параметра типа KompleksniBroj .


KompleksniBroj Saberi(KompleksniBroj a, KompleksniBroj b)
{
    //Sada treba da odredimo kako sabiramo dva kompleksna broja. Pa sabiramo ih tako sto
    //realan deo prvog broja saberemo sa realnim delom drugog i imaginarni deo prvog broja
    //saberemo sa imaginarnim delom drugog
    //Prvo kreiramo novi kompleksan broj c pomocu podrazumevanog konstruktora
     KompleksniBroj  c = new KompleksniBroj();
    c.re = a.re + b.re ;
    c.im = a.im + b.im ;  
    return c;  
}



У С# имамо и већ посојеће, тј. дефинисане класе, чије методе можемо одмах користити.

Класа System.Math

System.Math класа нуди многе статичке методе које можеmo да користитимо при израчунавању тригонометријских, логаритамских и других математичких прорачуна. На пример, Pow метод System.Math класе може да се користи да се подигне број на неки степен. Такође, System.Math класа садржи и бројне већ дефинисане константе, које можемо директно користити, као на пример константу PI.

На пример, желимо да израчунамо површину круга полупречника р. Како ћемо то урадити уз помоћ System.Math класе и њених већ постојећих метода и константи.

double povrsina = Math.Pow(p,2)*Math.PI;

Дакле, израчунали смо површину круга користећи методу Pow, чији је први аргумент баш полупречник, тј. оно што се степенује, а други, број на који се степенује полупречник. Константа PI се такође налази дефинисана у класи Math и можемо је слободно користити позивањем Math.PI.

Следећи метод који се често користи јесте метод Sqrt. То је метод који се користи када желимо да рачунамо корен неког броја или неког израза.

На пример, желимо да израчунамо хипотенузу правоуглог троугла, ако су нам већ познате његове катете a и b.

double hipotenuza = Math.Sqrt(a*a+b*b);

У овом задатку могли смо користити и већ од малопре познату методу Pow.

double hipotenuza = Math.Sqrt(Math.Pow(a,2)+Math.Pow(b,2));



Abs метод враћа апсолутну вредност броја (позитивну вредност броја независно од његовог знак). На пример, следећи код враћа апсолутну вредност броја -3, што је 3.

double apsolutna_vrednost = Math.Abs(-3);

Метод Round заокружује број на најближи цео број. На пример, следећи код се користи да заокружимо број 5,49999 на најближи цео број. Резултат ће бити 5.

double ceo_broj = Math.Round(-3);

Ако користимо Round да заокружимо број који је тачно на пола између два броја, као што је 5.5, Round увек враћа паран број најблизи броју. Дакле, Math.Round(5.5) ће вратити 6, али Math.Round(8.5) ће вратити 8.

Math.Max и Math.Min враћају већи и мањи од два броја, респективно. Они подржавају скоро све типове бројева као параметре.

//Maksimum ce biti 5
int maksimum = Math.Max(5,2);
//Minimum ce biti 2.3
float minimum = Math.Min(7.6,2.3);


Пример 3. Направити класу круг и методе које рачунају обим и површину круга.

Решење :


//Definisemo klasu krug
 public class Krug
{   
    double r;
    //Metoda koja racuna povrsinu kruga
    public double Povrsina(double r) 
    {
        return r * r * Math.PI;
    }
    //Metoda koja racuna obim kruga
    public double Obim( double r)
    {
        return 2 * r * Math.PI;
    }
}
private void button1_Click( object sender, EventArgs e)
{
    double r = double.Parse(textBox1.Text);
    //Kreiramo primerak klase
    Krug k = new Krug();
    //Pozivamo metodu Obim
    double obim = k.Obim(r);
    label2.Text = "Obim kruga je: " +obim;
}
private void button2_Click(object sender, EventArgs e)
{
    double r = double.Parse(textBox1.Text);
    Krug k1 = new Krug();
    label3.Text = "Povrsina kruga je :" + k1.Povrsina(r);
}