metode nizovi oop interfejsi

26
Sadrzaj: Prvi čas: 1.Metode: Def metoda Potpis metode Opsti oblik metode RETURN 2.PARAMETRI METODA Prenos parametara po referenci i po vrednosti(REF) Izlazni parametri(OUT) Nizovi parametara(PARAMS) Koriscenje modifikatora pristupa 3.Nizovi Opste o nizovima(Deklaracija, pristup elementima,inicijalizacija) Svojstva nizova(Rank,Length) Metode nizova(Clear,Copy,Sort,Clone,IndexOf) Drugi čas: 4.Klase i objekti Def klasa i objekata Enkapsulacija Kljucna rec this Koriscenja konstruktora Nasledjivanje 5.’’Zapecacene klase’’ 6.Interfejsi Osnovno o interfejsima is i as operatori 7.Apstraktne klase 8.Imenski prostori

Upload: pendici

Post on 16-Feb-2015

62 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Metode Nizovi OOP Interfejsi

Sadrzaj:

Prvi čas:

1.Metode: Def metoda Potpis metode Opsti oblik metode RETURN

2.PARAMETRI METODA Prenos parametara po referenci i po vrednosti(REF) Izlazni parametri(OUT) Nizovi parametara(PARAMS) Koriscenje modifikatora pristupa

3.Nizovi Opste o nizovima(Deklaracija, pristup elementima,inicijalizacija) Svojstva nizova(Rank,Length) Metode nizova(Clear,Copy,Sort,Clone,IndexOf)

Drugi čas:

4.Klase i objekti Def klasa i objekata Enkapsulacija Kljucna rec this Koriscenja konstruktora Nasledjivanje

5.’’Zapecacene klase’’6.Interfejsi

Osnovno o interfejsima is i as operatori

7.Apstraktne klase8.Imenski prostori

Page 2: Metode Nizovi OOP Interfejsi

Metode:

Metode su sredstva uz pomoc kojih se obezbedjuje blok koda koji moze biti izvrsen na bilo kom mestu u aplikaciji. Metoda je grupa deklaracija i drugih naredbi koja izvrsava odredjeni zadatak.

Kada i zasto koristiti metode:…

Potpis metode cine: Povratna vrednost metode,parametri metode i naziv metode.

Povratna vrednost metode predstavlja tip podatka koji metoda treba da vrati.Parametri metode su informacije kojima snabdevamo metodu.

Opsti oblik metode:

[access-modifier] < return-type> <methode-name>([parameter-type parameter-name],[.....]){ method-body}

access-modifier - stepen do koga je metoda dostupna drugim klasama ili projektima.return-type - tip vrednosti koju metoda treba da vratimethode-name - naziv metodeparameter-type parameter-name- tip i naziv parametra koje metoda prima.

Page 3: Metode Nizovi OOP Interfejsi

method-body - telo metode.

Kada metoda vracavrednost moramo uraditi sledece:- navesti tip povratne vrednosti u deklaraciji metode,- koristiti kljucnu rec RETURN da bi zavrsili metodu.

Parametri metoda:

Do sada smo koristili prenos parametara po vrednosti, u tom slucaju bilo koja promena nad promenjivom unutar metode nema NIKAKVOG EFEKTA na parametre navedene u pozivu metode.

static void Dupliraj(int vrednost){ vred *= 2; Console.WriteLine(" Vrednost je : {0}",vred);} Rezultat:

Poziv u Main-u: Vrednost je : 5

int broj = 5; Vrednost je : 10

Console.WriteLine("Vrednost je : {0},broj); Vrednost je : 5

Dupliraj(broj);Console.WriteLine("Vrednost je : {0},broj);

Ako hocemo da promenimo broj ovako necemo moci ali bi mogli broj = dupliraj(broj) ,a metoda mora da nam vraca taj broj koji hocemo da dupliramo, kod ovoga se javljaju problemi ako ima vise promenjivih.Jos jedan nacin prosledjivanja vrednosti u metodu je prenos preko reference. To znaci da ce metoda raditi sa istom promenjivom kao u pozivu metode a ne samo sa promenjivom koja ima istu vrednost. Sve promene se odrazavaju na promenjivu koja se koristi kao parametar. Za to je potrebno koristiti kljucnu rec REF kod inicijalizacije metode i kod pozivanja metode kod onih parametara za koje je to potrebno.

static void Dupliraj(ref int vrednost){ vred+= 2; Console.WriteLine(" Vrednost je : {0}",vred);} Rezultat:

Page 4: Metode Nizovi OOP Interfejsi

Poziv u Main-u: Vrednost je : 5

int broj = 5; Vrednost je : 10

Console.WriteLine("Vrednost je : {0},broj); Vrednost je : 10

Dupliraj(ref broj);Console.WriteLine("Vrednost je : {0},broj);

Kada koristimo prenos preko reference: ne smemo koristiti konstantne vrednosti CONST, promenjiva koja se koristi mora biti inicijalizovana.

Izlazni parametri

Parametar mozemo definisati da bude izlazni parametar, preko kljucne reci OUT koja se koristi isto kao i ref (kao modifikator parametra u definiciji metode i pri njenom pozivanju). Rezultat je isto ponasanje kao i kod referentnog tipa , u smislu da se vrednost parametra na kraju metode vraca promenjivoj koja je upotrebljena u njenom pozivu. Kod parametra OUT mozemo koristiti neinicijalizovane promenjive. Iako je nekoj promenjivoj dodeljena vrednost kada se koristi u metodi njena vrednost ce biti izgubljena nakon izvrsenja metode.

static int MaxVrednost(int[] nizBrojeva,out int indeks){

int max = nizBrojeva[0]; indeks = 0;

for(int i = 0; i<nizBrojeva.Length;i++){

if (nizBrojeva[i] > max){

max = nizBrojeva[i];indeks = i;

}}return max;

}

Kljucne reci OUT i REF se moraju navesti u pozivu metode

Metode clanice struktura

Metode mogu biti i clanice struktura.

Page 5: Metode Nizovi OOP Interfejsi

struct Osoba{

public string ime,prezime;public string DajImeIPrezime(){

return ime +" "+prezime;}

}

Ako hocemo da zajedno prikazemo ime i prezime moramo da iz spajamo da bi ih prikazali ( pozovemo stampanje imena, pa onda prezimena). Ako strukturi dodamo metodu, jednostavnim pozivom te metode odstampali bi podatke.

poziv : osoba.Ime(); Metoda unutar strukture ima direktan pristup clanicama strukture.

Nizovi parametara

C# dozvoljava da definisemo jedan poseban parametar za metode, ovaj parametar mora biti zadnji u definiciji metode i naziva se NIZ PARAMETARA. Ovaj parametar dozvoljava da pozivamo metode koristeci promenjivu kolicinu parametara, a definise se kljucnom recju PARAMS.

static <return-type>< method-name>(<paramname>,< paramname>,,params <type>[] <name> )

{...........................................................................return < return-value>;

}

Ovu metodu pozivamo na sledeci nacin: <methode name>(<p1>,...<val1>,<val2>,....)svi parametri moraju da budu tipa koji se navodi u inicijalizaciji metode.

static int Zbir(params int[] nizBrojeva){

int suma = 0;foreach(int val in nizBrojeva){

suma += val;}return suma;

}

Preopterecenje metoda

Page 6: Metode Nizovi OOP Interfejsi

Videli smo do sada da moramo sloziti potpis metode kada je pozivamo. To znaci da je potrebno imati dve metode koje operisu nad razlicitim tipovima promenjivih. Preopterecenje operatora prepoznaje ovu situaciju i omogucava da napravimo vise metoda sa istim imenom, koje rade sa razliacitim tipovima argumenata. Vise metoda koje imaju razlicit POTPIS.

static float MaxVrednost(float [] nizBrojeva){

float max = nizBrojeva[0];for(int i = 0; i<nizBrojeva.Lenght;i++){

if (nizBrojeva[i] > max)max = nizBrojeva[i];

}return max;

Mozemo napisati i metodu koja ce imati isti naziv kao i gornja metoda samo sa drugim tipom ulaznog parametra, ista metoda sa razlicitim potpisom. Ne moramo navoditi koju metodu cemo da koristimo, samo navedemo niz parametara i odgovarajuca metoda se pozove.Jedna od dobrih karakteristika tehnologije intelisence: ako imamo dve metode i krenemo da unosimo ime metode V.S. ce pokazati moguca preopterecenja za metodu.Mozemo imati dve metode sa istim imenom a potpis se razlikuje u tome da li se prenose parametri preko vrednosti ili preko adrese.

Koriscenje modifikatora pristupa

Modifikatori pristupa omogucavaju specificiranje stepena do koga je clan neke klase dostupan.

public - Clan je dostupan bez restrikcije

protected internal - Clan je dostupan samounutar klase, izvedenih klasa, ili klasa u istom programu(ili sklopu)

internal - Clan je dostupan samo unutar klase ili unutar istpg programa.

protected - Clan je dostupan samo unutar klase ili izvedenih klasa.

private - Clan je dostupan samo unutar klase. Ovo je podrazumevana vrednost.

static - sve instance klase koje sadrze staticku promenjivu ili metodu,. toj metodi pristupamo tako sto navedemo imeklase.Imemetode, nije potrebno da insatnciramo klasu.

Page 7: Metode Nizovi OOP Interfejsi

Nizovi:

Nizovi su uvek referentni tipovi.Nizovni tipovi se implicitno izvode iz System.Array koji je izveden iz System.Object tipa.Promenljive nizovnog tipa sadrze reference na niz a ne niz.

Da bi se deklarisala nizovna promenljiva potrebno je:– navesti tip elemenata niza, zatim – uglaste zagrade kojima se specificira rang niza, i na kraju– ime nizovne promenljive iza koga sledi tačka zarez.

Deklaracija:Tip[] imePromenljive;

Tip elemenata niza može biti bilo koji tip uključujući i nizovni tip

Podržani su jednodimenzionalni, dvodimenzionalni i nizovi nizova

int[] niz = new int[3] { 1, 10, 12 };

foreach (int broj in niz) { Console.Write(broj+" "); }int[,] matrica = new int[3,2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };

foreach (int broj in matrica) { Console.WriteLine(broj); }

Svojstvo Rank vraća vrednost koja ukazuje na rang, odnosno ukupan broj dimenzija niza.

Svojstvo Lenght vraća vrednost koja ukazuje na ukupan broj elemenata niza.

Metodom Sort sortiraju se elementi jednodimenzionalnog niza.– elementi niza moraju da implementiraju interfejs IComparable– ukoliko sortiranje nije uspešno završeno, rezultat je nedefinisan– koristi se QuickSort algoritam– ne vodi se računa o redosledu elemenata čija je vrednost ista

Metodom Clone kreira se nova instanca niza čiji su elementi kopije elemenata kloniranog niza.

Page 8: Metode Nizovi OOP Interfejsi

– ukoliko su elementi niza referentnog tipa, objekti na koje oni imaju reference neće biti kopirani

Metoda Copy:

public static void Copy(Array x,int i, Array y,int j ,int d)

x-niz iz koga se kopirai-indeks elementa niza x od koga se pocinjey- niz u koji se kopiraj-indeks elementa niza y od koga se pocinjed-broj obuhvacenih elemenata

Metoda IndexOf : Vraća vrednost indeksa prvog elementa čija je vrednost jednaka traženoj.

– ukoliko nepostoji element sa dtraženom vrednošću, vraća se -1.– može da se koristi samo nad jednodimenzionalnim nizovima.

Metoda GetLenght : Vraća vrednost koja ukazuje na broj elemenata za određenu dimenziju niza.

– prva dimenzija se označava sa 0.

Metodom Clear navedenim elementima niza se dodeljuju podrazumevane vrednosti.

Klase i objekti

OBJEKAT = PODACI + METODA. Objekat se definiše kao entitet koji je sposoban da čuva svoja stanja i koji okolini stavlja na raspolagaje skup operacija preko kojih se tim stanjima pristup.

Objekat karakterise njegov:IDENTITET(razlikovanje objekata medju sobom), PONASANJE(dato preko skupa metoda koje sadrzi objekat), STANJE( podaci koje objekti nose i veze sa drugim objektima).

KLASA je skup objekata koji imaju zajednicku strukturu i ponasanje.KLASA je struktura podataka koju treba posmatrati kao novi tip;

OBJEKAT JE INSTANCA KLASE.

Page 9: Metode Nizovi OOP Interfejsi

ENKAPSULACIJA. Direktan pristup podacima je nepotreban i nepozeljan.

Postoje dva bitna aspekta enkapsulacije: objedinjavanje podataka i funkcija u

jedinstven entitet (klasa) , kontrola mogućnosti pristupa članovima entiteta (modifikatori pristupa).

ZASTO KORISTITI ENKAPSULACIJU?1.) Zato sto omogucava kontrolu koriscenja(objekat se može koristiti

isključivo preko javnih metoda)2.) Omogucava smanjenje uticaja promena(ukoliko su detalji implementacije

objekta privatni mogu se promeniti, a da te promene ne utiču direktno na korisničke objekte (koji jedino mogu da pristupe javnim metodama).(Primer : recimo da se promeni nacin obracunavanja provizije i slicno)

KLJUCNA REC THISIako se ovaj parametar nikad eksplicitno ne deklariše, zapravo mu se može pristupiti pomoću ključne reči this.

– implicitno pokazuje na objekat koji poziva metodu

Kod statičkih metoda se ne prosleđuje ovaj dodatni parametar.– ne može se koristiti this zato što se ne pozivaju pomoću objekata

KORISCENJE KONSTRUKTORA

Instanciranje klasa se vrsi pomocu opreatora NEW Racun rac = new Racun();

Metoda koja ima isti naziv kao i naziv klase i nema nikakvu povratnu vrednost naziva se Konstruktor.Operator new vrsi alokaciju memorije za objekat klase Racun, a metoda Racun() kreira objekat.

public class Racun { public long brojRacuna; public decimal stanje; public decimal provizija;

public void Uplata(decimal iznos) { stanje = stanje + (iznos * (1 - provizija)); }

public void Isplata(decimal iznos) { stanje = stanje - (iznos * (1 + provizija));

Page 10: Metode Nizovi OOP Interfejsi

}

public void PrikaziStanje() { Console.WriteLine("Stanje na racunu je: {0}", stanje); } }

static void Main(string[] args) { Racun rac = new Racun(); rac.provizija = 0.05m; rac.Uplata(100); rac.PrikaziStanje(); //Nije obracunata provizija! rac.stanje += 10000; rac.PrikaziStanje(); }

Uvodjenjem ucaurenja:

public class Racun { private long brojRacuna; private decimal stanje; private decimal provizija;

public void Uplata(decimal iznos) { stanje = stanje + (iznos * (1 - provizija)); }

public void Isplata(decimal iznos) { stanje = stanje - (iznos * (1 + provizija)); }

public void PrikaziStanje() { Console.WriteLine("Stanje na racunu je: {0}", stanje); } }

static void Main(string[] args) { Racun rac = new Racun(); rac.provizija = 0.05m; rac.Uplata(100); rac.PrikaziStanje(); //rac.stanje += 10000; Pristup nije dozvoljen! }

Page 11: Metode Nizovi OOP Interfejsi

NASLEDJIVANJE

Nasledjivanje je koncept OOP-a. Omogućava da se na osnovu postojeće izvede nova

klasa. Izvedena klasa nasleđuje sve članove bazne klase. Nasleđivanjem se ostvaruje

veza (odnos) između objekata(is veza , bazna (super, nadređena) klasa, izvedena (podklasa, podređena) klasa koja nasleđuje baznu klasu).

Treba razlikovati nasledjivanje klasa od nasledjivanja interfejsa.Klasa koja nasledjuje interfejs treba da implementira sve navedena funkcije.

Nasledjivanje klasa moze biti DIREKTNO I INDEREKTNO.Jednu baznu klasu moze da nasledi vise izvedenih klasa(broj izvedenih klasa je neogranicen)

Nasledjivanje moze biti i JEDNOSTRUKO I VISESTRUKO(c# podrzava samo jednostruko nasledjivanje)

Grupa klasa koje su povezane nasleđivanjem formiraju strukturu koja se naziva HIJERARHIJA KLASA.

– klase na višim nivoima su opštije (koncept generalizacije), dok su one na nižim nivoima u hijerarhiji specifičnije (koncept specijalizacije).

– DUBINA HIJERARHIJE-Broj nivoa nasledjivanja,preporuka je da ne bude veca od 7.

Sintaksa nasledjivanja:

class IzvedenaKlasa:BaznaKlasa{...}

klasa B

klasa A

klasa C klasa D

Page 12: Metode Nizovi OOP Interfejsi

Izvedena klasa nasledjuje sve osim konstruktora i destruktora bazne klase.Ukoliko nije eksplicitno navedena bazna klasa podrazumeva se System.Object klasa.Izvedena klasa nasleđuje sve članove bazne klase.

– javni članovi bazne klase su implicitno javni članovi izvedene klase.

public class Racun{ public void Uplata(decimal iznos){...} public void Isplata(decimal iznos){...} private long brojRacuna; private decimal stanje; }public class TekuciRacun: Racun{}...TekuciRacun tekuci = new TekuciRacun();Tekuci.Uplata(100); //pristup nasleđenoj metodi

Izvedenoj klasi se mogu dodati novi članovi

public class Racun{ public void Uplata(decimal iznos){...} public void Isplata(decimal iznos){...} private long brojRacuna; private decimal stanje;}public class TekuciRacun: Racun{ private decimal provizija; // novi član}

Nasleđivanje ne podrazumeva da će izvedena klasa imati pristup svim članovima bazne klase.

– privatni članovi bazne klase, iako nasleđeni, su dostupni isključivo članovima bazne klase.

public class Racun{ public void Uplata(decimal iznos){...} public void Isplata(decimal iznos){...} private long brojRacuna; private decimal stanje;

Page 13: Metode Nizovi OOP Interfejsi

}public class TekuciRacun: Racun{ public void Prikazi(); { Console.WriteLine(“Stanje:”, stanje); //greška }}

Članovi bazne klase sa modifikatorom protected su jedino dostupni unutar bazne klase i direktno i indirektno izvedenim klasama.

– ukoliko modifikator pristupa nije naveden podrazumeva se da su clanovi klase oznaceni sa «private»

public class Racun{ ... protected decimal stanje; }public class TekuciRacun: Racun { public void Prikazi() { Console.WriteLine(“Stanje:”, stanje); // OK }}

PREPORUKA– sva polja klase treba da imaju modifikator pristupa private, a za svako od

njih navesti svojstvo sa modifikatorom pristupa protected.

Dostupnost izvedene klase je uslovljena dostupnošću bazne klase– ukoliko je bazna klasa privatna, izvedena klasa ne može biti javna.

...private class Racun{ ...}public class TecuciRacun: Racun // greška{ ...}

POZIV KONSTRUKTORA BAZNE KLASE

Page 14: Metode Nizovi OOP Interfejsi

Za poziv konstuktora bazne klase iz konstruktora izvedene klase se koristi ključna reč base.public class BaznaKlasa{ public BaznaKlasa() {...}}

public class IzvedenaKlasa: BaznaKlasa{ public IzvedenaKlasa(): base() { ... }}

Prvo se izvršava konstruktor bazne klase.Navođenje inicijalizatora konstruktora nije obavezno

– ukoliko se ne navede, poziva se konstruktor (bez parametara) bazne klase– konstruktor bazne klase, implicitno poziva konstruktor klase

System.Object

public class BaznaKlasa{ public BaznaKlasa(int x) {...}}

public class IzvedenaKlasa: BaznaKlasa{ public IzvedenaKlasa() { ... } //greška POZIVA SE NEPOSTOJECI KONSTUKTOR BAZNE KLASE ili public IzvedenaKlasa(): base() {...} //greška}

public class IzvedenaKlasa: BaznaKlasa{ public IzvedenaKlasa(): base(10) {...} //OK}

POLIMORFIZAM Sposobnost promenljive da referencira objekte različitih tipova i da

automatski poziva odgovarajuću metodu objekta koji referencira se naziva polimorfizam.

Polimorfizam se zasniva na konceptu da metoda koja je deklarisana u osnovnoj klasi može da se implementira na više različitih načina u različitim izvedenim klasama.

Polimorfizam se realizuje preko virtuelnih metoda

Page 15: Metode Nizovi OOP Interfejsi

o Za deklaraciju virtuelnih metoda se koristi ključna reč virtual.o Virtuelne metode se mogu reimplementirati u izvedenim klasama.o Koristi ključna reč override

public class Racun{ public virtual void Prikazi() {...}}public class TekuciRacun: Racun{ public override void Prikazi() {...}}

Virtuelna i reimplementirana metoda moraju biti indetične, moraju imati– isti naziv,– isti modifikator pristupa,– isti tip rezultata i– iste parametre

SAKRIVANJE VIRTUELNIH METODA

Mogu se sakriti i virtuelne i nevirtuelne metode. Sakrivanje metoda utiče na polimorfizam. Novodobijena metoda može biti virtuelna, što znači da se u dalje izvedenim

klasama ona može reimplementirati. Potpis, zaglavlje, zapis, definicija – naziv metode, broj i tip parametara, bez

povratne vrednosti.

public class OsnovnaKlasa { public virtual void Metoda() {...}}

public class IzvedenaKlasa: OsnovnaKlasa{ public override void Metoda() {...}}

OsnovnaKlasa promenljiva = new IzvedenaKlasa();promenljiva.Metoda;

Generisaće se kod kojim će se proveriti tip instance koju referencira promenljiva, u ovom slučaju izvedena klasa.

– poziva se reimplementirana metoda

Page 16: Metode Nizovi OOP Interfejsi

public class OsnovnaKlasa { public void Metoda() {...}}

public class IzvedenaKlasa: OsnovnaKlasa{ new public void Metoda() {...}}

OsnovnaKlasa promenljiva = new IzvedenaKlasa();promenljiva.Metoda;

Pozvaće se metoda klase čijeg je tipa promenljiva– poziva se metoda osnovne klase

Zapecacene klase

Ukoliko ne zelimo da drugi programeri koji koriste nase klase prosiruju(nasledjuju) neku od tih klasa to mozemo uciniti pomocu kljucne reci sealed.Zapecacena(sealed) klasa ne moze se koristiti kao bazna klasa bilo koje druge klase.Zapecaceni klase imaju smisla recimo u slicaju kada klasa implementira sigurnosne aspekte sistema i ne zelimo da neko reimplementira tu klasu i napravi ‘back door’.

public sealed class ZapecacenaKlasa { //... }

Interfejsi

Interfejs je ugovor kojim se garantuje klijentu da ce se klasa koja ga je nasledila ponasati na odredjeni nacin.Kada klasa implementira interfejs ona potencijalnim klijentim kaze “garantujem da prodrzavam metode,propertije,dogadjaje i indeksere imenovanog interfejsa!”

Sintaksno interfejs je klasa koja sadrzi samo aprstraktne metode.Kada klasa implementira interfejs ona mora da implementira sve njene metode.

Moguce je da klasa implementira vise interfejsa.

Page 17: Metode Nizovi OOP Interfejsi

Ukoliko zelimo da pitamo objekta dali implementira interfejs mozemo to uciniti na dva nacina:

1.) IS operator: (Kocka is ITelo) se sracunava u true ako se kocka moze kastovati u ITelo

2.) AS operator : Kombinuje IS i operacije kastovanja tako sto prvo testira da li je kastovanje moguce a zatim kompletira kastovanje ako je moguce.Ukoliko kastovanje nije moguce operacor AS vraca null.(ITelo telo = kocka as ITelo)

Apstraktne klase

Apstraktna klasa je klasa koja se moze naslediti, ali se ne moze instacirati. Moze posedovati apstraktne metode, koje nemaju svoju implementaciju, ali ih klase naslednice (ukoliko nisu apstraktne) moraju implementirati koriscenjem kljucne reci “override”. Takodje apstraktna klasa moze imati metode koje imaju implementaciju za razliku od interfejsa, i koje u svom telu mogu koristiti apstraktne medote.

Primer:

public interface IRacun { void IsplatiSaRacuna(double iznos); void UplatiNaRacun(double iznos); string VratiPodatkeORacunu(); double VratiStanje();

}

public abstract class AbstractRacun : ApstraktneKlase.IRacun { private double stanje; private string brojRacuna; public AbstractRacun(string brojRacuna):this(brojRacuna, 0) { } public AbstractRacun(string brojRacuna, double pocetnoStanje) { this.brojRacuna = brojRacuna; this.stanje = pocetnoStanje; } public double VratiStanje() { return stanje; } public void UplatiNaRacun(double iznos) { stanje += iznos - ProvizijaNaUplatu(iznos); } public void IsplatiSaRacuna(double iznos) {

Page 18: Metode Nizovi OOP Interfejsi

stanje -= iznos + ProvizijaNaIsplatu(iznos); } protected abstract double ProvizijaNaUplatu(double iznos); protected abstract double ProvizijaNaIsplatu(double iznos); public virtual string VratiPodatkeORacunu() { string podaci = "Racun broj: " + brojRacuna+"\nIznos na racunu: " + stanje; return podaci;

}

public class TekuciRacun:AbstractRacun { public TekuciRacun(string brojRacuna) : base(brojRacuna) { } public TekuciRacun(string brojRacuna, double pocetnoStanje) : base(brojRacuna, pocetnoStanje) { } protected override double ProvizijaNaUplatu(double iznos) { return 0; } protected override double ProvizijaNaIsplatu(double iznos) { double obracunataProvizija = 100 + (iznos * 3 / 100); return obracunataProvizija; } public override string VratiPodatkeORacunu() { return base.VratiPodatkeORacunu() + "\nTip racuna: TEKUCI"; }

}

public class DevizniRacun:AbstractRacun { public DevizniRacun(string brojRacuna) : base(brojRacuna) { } public DevizniRacun(string brojRacuna, double pocetnoStanje) : base(brojRacuna, pocetnoStanje) { } protected override double ProvizijaNaUplatu(double iznos) { double obracunataProvizija = 100 + (iznos * 5 / 100); return obracunataProvizija; } protected override double ProvizijaNaIsplatu(double iznos) { double obracunataProvizija = 100 + (iznos * 5 / 100); return obracunataProvizija; } public override string VratiPodatkeORacunu() { return base.VratiPodatkeORacunu() + "\nTipRacuna: DEVIZNI"; }

Page 19: Metode Nizovi OOP Interfejsi

}

MAIN:

AbstractRacun[] racuni = new AbstractRacun[2]; racuni[0] = new TekuciRacun("111-111", 0); racuni[1] = new DevizniRacun("222-222", 0); for (int i = 0; i < 2; i++) { Console.WriteLine("Uplata na " + i + ". racun u iznosu od 1000"); racuni[i].UplatiNaRacun(1000); Console.WriteLine("Podaci o racunu posle uplate: \n"+racuni[i].VratiPodatkeORacunu()); Console.WriteLine(); }

Console.ReadLine();

Imenski prostori

Obezbedjuju kontejner koji sadrzi aplikacioni kod, i to tako da i kod i njegov sadrzaj mogu biti jedinsveno identifikovani. Omogucuje izbegavanje konflikta izmedju imena klasa u programima. Izolovanje deklaracije klasa na specifican region koda. Promovise se ponovna upotreba koda. Imenski prostori se koriste i za kategorizaciju objekata u .NET okruzenju.

C# kod se sadrzi u globalnom imenovanom prostoru, to znaci da se tom kodu moze pristupiti iz nekog drugog koda koji je unutar globalnog imenovanog prostora, tako sto se navede njegovo ime. Koristimo kljucnu rec namespace , da bismo eksplicitno definisali imenski prostor. Imena moraju biti kvalifikovana( sadrzi sve informacije o hijararhiji, to znaci da ako imamo kod u jednom imenovanom prostor, koji treba da koristimo u drugom moramo ukljuciti referencu na ovaj imenovani prostor. Koristimo znak (.) izmedju imenovanih prostora.

namespase LevelOne {

//kod u prostoru LevelOne }

// kod u globalnom imenovam\nom prostoru

LevelOne.NameOne

Mozemo definisati ugnjezdjene imenovane prostore.

Page 20: Metode Nizovi OOP Interfejsi