Programski jezik C#

Osnove objektnega programiranja
Gregor Jerše, Matija Lokar in Srečo Uranič

V 0.9 marec 2009

C# . NET

2

Programiranje 1 – VSŠ Informatika

C# . NET

3

Programiranje 1 – VSŠ Informatika

C# . NET

4

Predgovor
Omenjeno gradivo pokriva osnove objektnega programiranja v C# . Gradivo vsekakor ni dokončano in predstavlja delovno različico. V njem so zagotovo napake (upava, da čimmanj), za katere se vnaprej opravičujeva. Da bo lažje spremljati spremembe, obstaja razdelek Zgodovina sprememb, kamor bova vpisovala spremembe med eno in drugo različico. Tako bo nekomu, ki si je prenesel starejšo različico, lažje ugotoviti, kaj je bilo v novi različici spremenjeno.

Gregor Jerše, Matija Lokar in Srečo Uranič Kranj, november 2008

Programiranje 1 – VSŠ Informatika

Gradivo dodano na konec in sicer:  Vsebina prosojnic. ki naj bi bile spredavane letos  Zgled za Avto  Gradivo. Tam je nekaj smiselnih zgledov. Programiranje 1 – VSŠ Informatika .9 – še vedno povsem neurejeno. ki ga je smiselno vkomponirati. 2009: Različica V0. Dodano nekaj gradiva. Gregorjevega (str. 11. ki pokriva uvod v OOP iz C++. ki pa jih je potrebno prepisati v C#. Premisliti je še potrebno kaj in kako. NET 5 Zgodovina sprememb 14. 1 – 120) in Sašovega gradiva.C# . 5. 3. 2008: Različica V0.8 – le prenos (še neurejeno) Matijevega.

.................................................................................................................................................................................................................................................................................................................................................................................................................................................................. 41 Uporaba razreda Zajec .......................................................................... 41 Razred Kolega .................................................................................................................................................................................................... 40 Razred Zajec ............................................................................ 42 Zajci z datumom............................................................................................................................................................................................................................................................................................. 42 Nadgradimo datum ..................................................... 19 Uporaba razreda Zajec .................................................................................................................................................................................................................................................................................................. 16 Objektno programiranje ........................................................................................... 10 Objekti.............................................................. 25 Povzetek ......................................................................... 42 Dostop do stanj objekta.................................. 30 Zgled ......................... 15 Ustvarjanje objektov ........................................................... 38 Vaje .................................................................. 19 Združevanje podatkov ... ....................................................................................................................................................................................................................................................... 28 Privzeti konstruktor .......................................................................................................................................................................................................................................................................................................................................................................................................................... 31 Objektne metode ............................................................................................... 15 Objekt in ime spremenljivke .....................................................................................................................C# ................................................................................................................................................................ 37 Fibonaccijevo zaporedje............................................................... 11 Objekti.................................. ................................................................................................................. 26 this ................................................................................................................................................................ 43 Zgledi .................................................... 9 Objektno usmerjeno programiranje – kaj je to ..................... 30 Še malo o this ........................................................................ 26 Konstruktorji .............................................................................................................................................................................................................................................................................................................................................................................................................. 40 Razred Majica ................................................................................................................................................ 9 Motivacija ............................................................................................................................ 15 C# in objekti ................ 40 Kochova črta ............................................................................ 28 Več konstruktorjev .................................................... 22 Še en primer ............................................................... 34 Zgledi ...................................................................................... 18 Objekti............................................ 29 Preobtežene metode ................. 13 Programiranje v C# . 16 Zgled .......................................................................................................................................... 48 Programiranje 1 – VSŠ Informatika ........................................................................................................................................................................................................................................................................... 29 Konstruktorji razreda Zajec – navzkrižno sklicevanje .................................................................................. 14 Klasično/objektno programiranje ............................................................................................................................... NET 6 KAZALO Objektno programiranje ......................... 42 Datum............................................................................................................................................................................................................................................................................................. 14 Od kje razredi? ........................................................................ 21 Dostop do podatkov v objektu ........................................................................................................ 40 Razred Točka in Kochova črta ..........................................................................................Ulomek ................................................................................................................................ 40 Ulomek . 42 Uporaba razreda Zajec z datumom ........................................................................................................................... 15 Ustvarjanje objektov .................................................................................................................................. razredi........................................................................................................................................................................................................................................................................................................................................................................................................................................... 37 Datum.............. 14 Objekti.................................................................................................................................................................................................. 27 Uporaba razreda: ........................................................................................................................... 42 Dostopi do stanj .................................................................................................. 41 Uporaba razreda Kolega ..........................................................................................

..................................................................................................................................................................................................................................................................... 107 Razred Pes ........................ 106 "Umazane" podrobnosti .......................................................................................................................................................................................................................... 97 Pogosto uporabljani postopki I................................................................................. 110 Razred Pes II ................................................................................ 67 Vaje ................................................................ 107 Vaje ......................................... 87 Statične komponente ........................................................................................................................................................... 72 Razred Kolega ............................................................................................................................................................................................................................................................................................................................................................................................................................................................................ 98 Razred BoljsiUlomek ...................................................................................................................................................................................................... 100 Iz muhe slon ............................................................................................................................... 95 Statične metode ................................................................................................................................................................................................................................................................................................................................................................................................................................................ 58 Problem Banke Butale ........................................................................................................ 49 Dostop do stanj................................................................................................................................................... 54 Gradnja razredov ................................................................................................................................................................................................................................................................................. 79 Podatkovni nosilec ................... 77 Kandidat za direktorja banke ............................................................................................................................................................................................................................................................................................................................................ 62 Ustvarjanje razredov in objektov: povzetek ............................................................................................................................. 87 Statične spremenljivke .......................................... 66 Zgledi ...............................................................................................................................C# ............... NET 7 Dostop do stanj/lastnosti .................................................................................................................................................... 76 Majica .............................................................................................................................................................................................................................................................................................................................................................................................................................. 74 Datum......... 59 Uporaba razreda Kovanec .......................................................................................................................................... 106 Zgledi ............................................................................................................................................ 98 Uporaba Boljšega ulomka ..................... 97 Dedovanje .......................................................... 80 Razred Zajec ...................................................................... 76 Oseba........ 80 Statično in objektno ............................ 48 Nastavitve podatkov (stanj)................................................................................................................................................................... 106 Osnova: razred ZajecNov ................................................................................................. 99 Dedovanje ........................................................................ 99 Dedovanje .................................................................................................................................. 113 Programiranje 1 – VSŠ Informatika ...............................razred Kvader ............. 98 Pogosto uporabljani postopki ..zgled ......................................................................................................................................................................................................................................................... 61 Zgled ................................................................................................................................................................................................................................................................................................... 51 Ostale metode.............................................. 106 Uporaba .................... 106 Prekrite metode .............................. 87 Uporaba statičnih spremenljivk ......................................................................................................... 88 Zajec................................................................................................................................................................................................................................... 52 Metoda ToString ..................... 58 Okostje razreda ............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ 59 Razred Kovanec ......................................... 52 Celotni razred Zajec ................ 88 Statične komponente – dostop ............................................................................................................................................................... 97 Dedovanje .............. 111 Zajec iz živali ............................................. 107 Zival .................................................................................................... 88 Statične metode .................................................................................................................................. 77 Denarnica ....................................................... 109 Razred Dalmatinec ....................................................................... 88 Statične komponente – naslavljanje ....................................................................................................................................................................................................................................................................................................................................... 109 Naloge brez računalnika ........................................................................ 96 Privatne metode................................................................................................................................................................................... 58 Ustvarjanje objektov .........

......................................... 140 Nove metode ...................................................................................................................................... 129 Kopirni (copy) konstruktorji .................................................................................................................................................................................................................................................................................................................................................................................................................. prirejanje razredov ..............................................................................................o ................................ 143 Polimorfizem ................................................................. 120 Plavalec II ....................................................................................................... 113 Vaje "peš" ................. M...........................................................................................mnogoličnost ................................................................................................................................. 139 Kaj je to dedovanje ....................................................................................................................................................................... 149 Razred Avto .............................................................................................................................. 131 Destruktorji ....... 121 Razred ....... 140 Določanje oz............................................................................................................................................................................................................................................................................................ 130 Polja tipa readonly ..................................................................................................................................................... 114 Halo Kitajc ............................ 146 Uporaba označevalca protected .......................................................................................... Krašna)............................................................................................................................................................................................................................................................................................................. 143 Prekrivne (Override) metode ........................................................................................................................................................................................................................ 221 OOP v C++ (avtor dr................................................. 122 Enkapsulacija .................................................................................................................................. 137 Statična polja .......................... 118 Trojiško ..................................................... 221 Programiranje 1 – VSŠ Informatika ....................... 119 Redki vektorji........ Lokar 2009 ...................................................................................................................................................... 122 Konstruktor .... 139 Bazični razredi in izpeljani razredi...... 148 Prosojnice M................... 119 Plavalec ....class ................................................................................................... 127 Preobloženi (overloaded) konstruktorji ................................................................................................................................................................................................ 139 Klic konstruktorja bazičnega razreda ......................................................................................................................................................................................... 141 Virtualne metode .........................................................................................................................................................................................................................................................................................................................................................................................................o........................................... 130 Statični (static) konstruktorji ................. 131 Lastnost (Property) ............................................. 149 Testiranje razreda .................................................. 137 Dedovanje (Inheritance) – izpeljani razredi .......................................................................... 121 Razredi in objekti (osnove) ....................................................C# ..................................................................................................................................................... 134 Statične metode . NET 8 Embi d...............................................................................................................

ta samodejno ustvari okno z določenim imenom in gumbom za zapiranje … Večina jezikov omogoča. na primer besedilo. da naj se objekt document (kar pomeni kar ta spletna stran) spremeni tako. Na ta način lažje pišemo sodobne programe.menjajocaSlika. Java.jpg". Visual Basic for Applications. imenuje kot objekt z imenom document. potrditev določenih izbir. kot tudi ne številne druge podrobnosti. dedovanje (inheritenca). … ki se med sabo prepletajo. kjer je zapisana datoteka. Če v kodi spletne strani piše <script type="text/javascript"> document. 1000) } JavaScript spletno stran. da smo na enostaven način poenotili vse naslove na spletni strani. da vemo. zapiranje oken.writeln("<p>To naj se pojavi na spletni strani!</p>"). ki jih imenujemo objekte.menjajocaSlika. klikanje na gumbe. ki so vsaj na prvi pogled zelo zapleteni. da izvedejo določene postopke. da program zlahka dopolnimo z gumbi. na katerim potem z določeno metodo narišemo krog. Pri uporabi tovrstnih jezikov hitro naletimo naletimo na pojme kot so združevanje (enkapsulacija). ki ga bomo prej s pomočjo ustreznega postopka obdelali. nad katerimi lahko izvajamo določene metode. NET 9 Objektno programiranje Motivacija Pri programiranju se je izkazalo. …) nudijo okolja v katerih so že določeni objekti. da objekte ustvarimo in jim naročamo.src = "album" + i + ". na kateri se nahaja. v našem konkretnem primeru sliko (vstavljeno v jeziku HTML z značko IMG). Programiranje je potem sestavljeno iz tega. večličnost (polimorfizem). function animacija() { i = i + 1. da bomo napisali na spletno stran kaj bolj zapletenega. da na problem gledamo kot na množico objektov. funkcije. Podobno z metodo writeln vstavimo v samo dototeko ustrezno kodo v jeziku html.src = "album" + i + ". Python. da mu spremenimo lastnost src. setTimeout("animacija()". Objektno usmerjeno programiranje nam omogoča. da je zelo koristno. C#. zapisan med narekovaji. Vse to so objekti. Na tem objektu imamo tudi druge objekte. potrditvenimi stikali in podobnimi elementi. Številni jeziki (JavaScript. vplivajo drug na drugega in kar bi le s težavo sprogramirali na klasičen način z nizanjem zaporedja stavkov in ukazov. Zanima nas le označeni del var i = 0. če podatke in postopke nad njimi združujemo v celote. Tako smo na primer pri šesti nalogi hitrega testa v uvodu uporabili možnost pisanja na spletno stran zato. Programiranje 1 – VSŠ Informatika . ki naj jo ta objekt prikazuje document. s katerimi na te objekte vplivamo.C# . kot če bi na spletni strani napisali kar <p>To naj se pojavi na spletni strani!</p> Seveda pa smo se doslej naučili že dovolj.jpg". Večina sodobnih programskih jezikov je objektno ali kot tudi rečemo predmetno usmerjenih. ki med seboj sodelujejo in vplivajo drug na drugega.jpg"> S pomočjo stavkov v jeziku JavaScript vplivamo na ta objekt (document. Na primer v jeziku JavaScript. Tako "iz nič" dobimo grafični objekt g. da vsebuje tekst. kjer se nenehno odvija veliko število dogodkov kot so premikanje miške. document. Dejansko je torej učinek isti. kakšne vse možnosti s tem imamo – verjetno bomo JavaScript uporabili. poimenovano kot menjajocaSlika: <img name=" menjajocaSlika " src="album1. Ko program zaženemo. Nas ne bodo zanimali. if (i == 6) i = 1. </script> pomeni. ki imajo lastnosti in metode.menjajocaSlika) tako.

V tej črni škatli (objektu) se skriva tako koda (torej zaporedje programskih stavkov). kar izvira iz object oriented) programiranju pa sta koda in podatki zduženi v nedeljivo celoto – objekt.setLocation(300. import javax. bi naš program sestavljalo na desetine ali celo stotine ustreznih ukazov. show in drugimi vplivamo nanju. Vedeti je potrebno le. okno. Ostane nam le še. Pisali smo metode. okno. da večina sodobnih jezikov prinaša v svojem izvajalnem okolje celo vrsto že pripravljenih objektov in metod za delo z njimi. kot tudi podatki (informacije nad katerimi se izvaja koda). ki je na primer poiskala največji element v tabeli števil. 250). Tako pa le uporabimo dana načrta za objekta JFrame in JTextArea. V objektno usmerjenem (včasih boste srečali tudi kratico OO ali O-O. Ko uporabljamo objekte nam nikoli ni potrebno pogledati v sam objekt. okno. ….awt. Če smo npr. Če ne bi imeli na voljo že ustreznih objektov. tabela in metoda nista bili združeni – tabela nič ni vedela o tem.*. Pri klasičnem programiranju imamo kodo in podatke ločene.setSize(250. spremenimo privzeto delovanje ukaza Print v izbiri File. kot so setSize. okno. tiskalnik. To prinaša določene prednosti. slika na spletni strani. Ti objekti so na primer spletna stran. kakšni so objekti določene vrste).200).getContentPane(). Tudi mi smo do sedaj programirali več ali manj na klasičen način. z ukazom new ustvarimo objekta ustrezne vrste in z metodami. ki dobiva in pošilja sporočila. ki smo jim podatke posredovali preko parametrov. da naj bi kdo npr. po kateri lahko pišemo. Tako s spodnjim zgledom v programskem jeziku Java ustvarimo okno z vnosno površino. grafično okno.*. da na problem gledamo kot na množico objektov. ki med seboj sodelujejo in vplivajo drug na drugega. S pripravljenimi metodami potem vplivamo na te objekte – na primer zamenjamo sliko na spletni strani. da naš program uporabniku omogoča vnos datuma preko posebnega okna z že izpisanim koledarjem. Za nas je pomembno to. da tak objekt ustvarimo in s pripravljenimi metodami nanj vplivamo. kaj se dogaja znotraj objekta. … Objektno usmerjeno programiranje – kaj je to Pri objektno (ali kot tudi rečemo predmetno) usmerjenem programiranju se ukvarjamo z … objekti seveda. NET 10 Ko torej pišemo programe.swing. public class JFrameTest { public static void main(String[] args) { JFrame okno = new JFrame("Moje okno"). izbire v menuju programov v okolju Microsoft Office. Ni nam potrebno pisati na stotine vrstic kode le za to.show(). da bi dosegli. da imamo v izvajalnem okolju že na voljo (načrt za) tovrstni objekt. na grafično površino narišemo krog.add(BorderLayout.CENTER. Programiranje 1 – VSŠ Informatika . Objektno usmerjeno programiranje nam omogoča. 40)). Parametri in metode niso bile prav nič tesno povezane. napisali metodo. po njej iskal največja števila. To je dejansko prvo pravilo OO programiranja – uporabniku ni nikoli potrebno vedeti. Objekt je nekakšna črna škatla. import java. imamo s samim izvajalnim okoljem ponavadi na voljo bogato zbirko različnih objektov (natančneje načrtov za to. } } In seveda imamo na voljo take objekte tudi v standardnih knjižnicah jezika C#. new JTextArea(10.C# .

Se vam zdi to zapleteno? No. kakšne podatke o objektu hranimo  Metode:  Kaj objekt zna  Kakšne metode lahko izvajamo nad njem Vsak objekt pripada nekemu razredu. kakšna sporočila lahko sprejme in kakšna lahko pošlje. Gre dejansko zato. da se programi ves čas spreminjajo. Kot uporabnikom nam je važno le. je to. da imamo določen objekt z imenom obj. Vse. ki predstavlja določeno osebo in vemo. To storimo tako. da nam. Omogočanje dostopa do objekta samo preko sporočil in onemogočanje uporabnikom. potem pravimo tudi da je x objekt tipa R. naši programi delujejo ne glede na morebitne spremembe v samih objektih. ta pa potem povzroči. ki je zapisan nekje v objektu. Če pripada objekt x razredu R. ko objekt povprašamo po IQ. kako objekt izračuna IQ (je to podatek. Ima:  Podatke:  kaj o objektu vemo. kot uporabnikom objekta. Če pa so tisti delčki varno zapakirani v kapsule. Če torej na objekte gledamo kot na črne škatle (zakaj črne – zato. da nad objektom izvajamo različne metode. nič ne vemo o tem. ki je neko celo število. Za vsak objekt se točno ve. kaj se na primer dogaja. Ker v programih. ampak se spremeni obstoječ program. kaj je znotraj škatle. In večina napak izhaja iz tega. je to rezultat nekega preračunavanja …). s katerim želimo upravljati kot s celoto. Objekti Objekt je skupek podatkov. se imenuje skrivanje informacij (information hidding) ali še bolj učeno enkapsulacija (encapuslation). da drug del programa ne deluje več. ki napišejo kodo s pomočjo katere se ustvari objekt in (če je zadeva seveda sprogramirana prav) uporabnik (programer. ni potrebno vedeti. da se z objektom lahko pogovarjamo o njegovem IQ. kaj je znotraj škatle. In za vsak objekt se točno ve. da vidijo (in brskajo) po podrobnostih. Vse "umazane podrobnosti" o tem. pa povejmo malo bolj "po domače". kaj je znotraj!) in z njimi ravnamo le preko sporočil (preko klicev metod). ki te objekte uporablja) se vanje ne more vtikati. Velika večina programov se dandanes ne napiše na novo.C# . katere metode zanj obstajajo in kakšne rezultate vračajo. se spremembe znotraj kapsule ostalega sistema prav nič ne tičejo. je določeno z vmesnikom objekta. da nad njem izvedemo metodo obj. Recimo. kar objekt zna narediti. Koliko je tvoj IQ ? 92 Tisto. kjer objekte uporabljamo. NET 11 Objekt Zakaj ni potrebno vedeti tega? Vsi objekti med samo komunicirajo preko sporočil. je prepuščeno tistim. Seveda se lahko zgodi.KolikoJeIQ() Objekt odgovori s sporočilom (metoda vrne rezultat). da nekdo spremeni določen delček kode. da se ne vidi. bodo programi navkljub spremembam znotraj škatle še vedno delovali. kar je pomembno. In zakaj je to pomembno? Velja namreč. In tu se izkaže prednost OO koncepta. da se kasneje ugotovi. ki piše drug program. da je potrebno "preurediti notranjost objekta". da ta objekt lahko povprašamo (mu pošljemo sporočilo) o tem. koliko je njegov IQ. Programiranje 1 – VSŠ Informatika .

Kadar želimo kaj izpisati na zaslon. Kadar želimo brati s tipkovnice ali z datoteke.Flush(). V omenjenem primeru to pomeni. prvi. naredimo tak objekt in kličemo njegovo metodo readLine za branje ene vrstice. } } Programiranje 1 – VSŠ Informatika .  Objekt tipa Random predstavlja generator naključnih števil. public MojR(string nekNiz) { mojNiz = nekNiz.Izpisi(). NET 12 Pravzaprav smo se že ves čas ukvarjali z objekti. ki so že pripravljeni v standardnih knjižnicah jezika C#. public class MojR { private string mojNiz. saj smo v naših programih uporabljali različne objekte. } public void Izpisi() { Console.C# . //kreiranje objekta StreamWriter pisanje. ki jih potem on sam in drugi uporablja. da bi le uporabljali te "črne škatle". ► StreamWriter pisanje = new StreamWriter(datoteka).  Objekt System. Seveda pa nismo omenjeni le na to. kot jih pripravi kdo drug (npr. da se bo metoda še vedno imenovala Next. In če se vrnemo na razlago v uvodu – kot uporabniki čisto nič ne vemo (in nas pravzaprav ne zanima). ker lahko programer definira nove razrede in objekte. jih dobimo v standardni knjižnici jezika). ki jih napišemo sami. //uporaba metode na objektu iz razreda Random Console.Console predstavlja standardni izhod. } } public class Pozdrav { public static void Main(string[] arg) { MojR prvi = new MojR("Pozdravljen. moj prvi objekt v C#!"). Metoda Next(a.WriteLine(mojNiz). da bo imela dva parametra. PRVI 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: OBJEKTNI PROGRAM using System.Next(1. b). kjer smo objekte razreda Random uporabljali. če se bo kasneje "škatla" Random spremenila in bo metoda Next delovala na drug način. In tudi. nismo pa se še naučili izdelave svojih razredov. kako metoda Next določi naključno število. //uporaba metode WriteLine na objektu Console ► ► ► Naučili smo se torej uporabnosti objektnega programiranja. ki jo izvedemo nad objektom tega tipa pa nam vrne neko naključno celo število med a in b. torej sam ustvarja te nove črne škatle. pokličemo metodo Write na objektu System. Oglejmo si nekaj primerov objektov iz standardne knjižnice jezika:  Objekt tipa StreamReader predstavlja vhodni kanal.WriteLine(). //uporaba metode objekta new Random(). Objekti so uporabni predvsem zato. če bo sporočilni sistem ostal enak. ki bosta določala meje za naključna števila in da bo odgovor (povratno sporočilo) neko naključno število z želenega intervala. ki uporablja objekte. Seveda.Console.100). Oglejmo si primer programa v C#. to ne bo "prizadelo" programov.

V vrsicah 15 – 20 je naš "pravi program". Vnesene vrstice kar vse pobrišimo in napišimo zgornjo kodo. Ko program prevedemo in poženemo. ki ga hranimo v njem). NET 13 Program napišimo kar na običajni način v okolju SharpDevelop – torej New Solution/Windows Applications/Console Application. je.C# . moj prvi objekt v C#!". ki ga hranimo v njem (vrstica 4). V vrstici 17 naredimo primerek objekta iz razreda MojR in vanj shranimo niz "Pozdravljen. ki ga objekti tega razreda imajo. da se znajo odzvati ne metodo Izpis(). Vse znanje. Ta je tak. Objekti o stanja: Programiranje 1 – VSŠ Informatika . da o vsakem objektu te vrste poznamo nek niz. ki opravi dejansko neko delo. V vrstici 18 pa temu objektu naročimo. torej tisti del rešitve. "kaj smo se šli". naj izpiše svojo vsebino. dobimo Na kratko razložimo. V vrsticah 3 – 13 smo definirali nov razred z imenom MojR. ko izpišejo svojo vsebino (torej niz.

Jedro objekta sestavljajo njegove spremenljivke. podatki. okrog katerih se nahajajo njegove metode.C# . lepo izpiši. Objekt je "črna škatla“. seštej. … Razred je abstraktna definicija objekta in če želimo nek razred uporabiti. položaj v prostoru. ki si medsebojno pošiljajo sporočila. NET 14 o o o  Lastnosti. mora običajno obstajati vsaj en primerek razreda. s katerimi želimo upravljati. ki sprejema in pošilja sporočila. Razlika med žogo kot “idejo žoge” in “mojo žogo” (konkretni primerek – realizacija ideje žoge) oziroma med ulomkom “kar tako” in ulomkom ¾. Osnovni pristop objektnega programiranja:  objekt = podatki + metode za delo s podatki. kaj naj se zgodi:  Pokličemo ustrezno metodo v objektu. kaj naj počnejo  Objekt za izpolnitev določene naloge potrebuje druge objekte in njihove metode Začetek:   Glavni razred (ki ima metodo Main) Izvajanje metode Main – ustvarjanje objektov. Ko želimo kak podatek (objekt) obdelati.. Če želimo izvesti metodo f na podatku x: o Klasično: Programiranje 1 – VSŠ Informatika . ImeRazreda primerek = new ImeRazreda(). ki naj jih obdela. proženje dogodkov. Klasično/objektno programiranje Klasično programiranje: program = metode Ko želimo kak podatek obdelati v klasičnem programiranju:  pokličemo ustrezno metodo z argumenti  argumenti: podatki. odzive pa z metodami. imenovalec  Metode: spremeni števec. odzivanje na dogodke. datum…). Objekt je računalniški model predmeta ali stvari iz vsakdanjega življenja (avto. Stanje objekta opišemo s spremenljivkami. Objekti Objekt je kakršenkoli skupek podatkov. njihovo obnašanje oz. objektu (podatku) signaliziramo. odzive objektov na sporočila. Za rešitev problema uvedemo množico objektov. Lastnosti objektov so zapisane v razredih (class). barva. sprememba položaja. spremeni imenovalec. komponente “znanje”  Odzivanje na dogodke Združeno v celoto  Podatki in metode. . ki opisujejo neko stvar/objekt  Žoga:  Podatki: velikost. Primerek nekega razreda imenujemo objekt. …  Metode: sprememba velikosti. Programiranje v C# Sestavljanje razredov:  Opis lastnosti objektov  Opis metod (“znanja” objektov):  Ustvarjanje objektov in njihova uporaba  "Ukazovanje" objektom. metode oz. obratna vrednost. oseba. Ustvarimo ga s ključno besedo new.. ki vsebujejo: ► ► podatke in . …  Ulomek:  Podatki: števec.

kjer bo objekt (referenca na objekt) V pomnilniku se je naredil objekt tipa NekiObjekt() / po pravilih.  Objekt NE obstaja  a je IME objekta  natančneje  a je ime spremenljivke.C# . kjer hranimo NASLOV objekta vrste NekiObjekt C# in objekti Razred (class) je opis vrste objekta (načrt. definiranih v knjižnicah (zbirkah razredov) okolja .microsoft. da naj izvede metodo f  x. Primerek razreda (instanca) – konkretni objekt. kako naj bo objekt videti) – opis ideje objekta.  Ustvarjanje objektov Razred je šablona. Taki razredi so na primer Math. StreamReader. ki definira spremenljivke in metode skupne vsem objektom iste vrste. … o . Od kje razredi? Veliko razredov je že vgrajenih (so v standardnih knjižnicah) v C# in njegovo oklolje.   a je naslov. System. exe) Objekt in ime spremenljivke NekiObjekt a.IO … Razrede lahko dobimo tudi iz drugih virov: o Naši “stari” razredi o Drugi programerji Potrebujemo dostop do ustrezne datoteke (dll.com/sl-si/library/ms229335(en-us). class:  Načrt objekta.NET Framework   o C# je .NET Glej npr. šablona Primerek razreda (instanca) – konkretni objekt:  Ustvarimo ga z new  Brez tega objekta NE MOREMO uporabiti  NekiObjekt a. System. ki so določena z opisom razreda NekiObjekt V pomnilniku se je naredil objekt tipa NekiObjekt() in a kaže na ta novo ustvarjeni objekt new NekiObjekt(). Programiranje 1 – VSŠ Informatika .aspx Razporejeni v imenske prostore  System. NET 15 o  izvedi statično metodo f na podatku x  f(x). a = new NekiObjekt(). Objektno:  podatku/objektu x signaliziraj.f().NET jezik – ima dostop do vseh razredov. http://msdn2.

 int[] tabela = new int[3]. 3}. ki predstavlja ulomek ¾. ki … Prvi ukaz je dejansko spoj dveh stavkov: deklaracija in prireditev Ulomek ime. … o o Zgled Poglejmo si še en zgled. 4). namespace UlomkiKlasika { class Program { public static void Main(string[] args) { Programiranje 1 – VSŠ Informatika . NET 16 Ustvarjanje objektov Ulomek ime = new Ulomek(3. Rečemo: V objektu ime je shranjen ulomek ¾. Točneje: v spremenljivki ime je naslov nekega objekta tipa Ulomek. po Janezkovo. ime = new Ulomek(3. Denimo. 4). ki bo prebral nek ulomek in mu prištel 1/2. kako se seštevajo ulomki. da bi radi napisali program. ime: _2h11b11__ 2h11b11: ¾ Brez new objekta še NI včasih “skrito”  Nizi  string a = "bla". a takojle.  Tabele  int[] tabela = {1.C# . 2. "Klasično" se bomo tega lotili takole (seveda pisec ni pozabil. si je lažje zapomniti .  tabela[0] = 1.  string a = new string("bla"). Spremenljivka ime kaže na objekt tipa Ulomek.-) ) POVEČAJMO 1: 2: 3: 4: 5: 6: ULOMEK KLASIČNO using System.

Console. imenovalec = imenovalec + 2. // izpis Console.Write("Števec ulomka: "). Očitno bomo potrebovali razred Ulomek.ReadKey(true). 25: namespace UlomkiObjektno 26: { 27: class Ulomek { 28: public int stevec.Write("Press any key to continue . da vsebuje metodo. int stevec = int. Objekt tipa Ulomek hrani podatke o svojem števcu in imenovalcu. string beri = Console. da "se zna" povečati za drug ulomek. ki ta ulomek poveča za drug ulomek. Console. "). } } } + " / " + Sedaj pa to naredimo še "objektno".WriteLine("Nov ulomek je: " + stevec imenovalec). 30: Programiranje 1 – VSŠ Informatika . int imenovalec = int.C# .ReadLine(). . Njegovo znanje je. beri = Console.ReadLine(). . NET 17 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: // vnos podatkov Console. Console.Parse(beri). // "delo" stevec = stevec + 1. 29: public int imenovalec.Write("Imenovalec ulomka: ").Parse(beri). Shematsko bo program (kjer so določeni deli skriti) videti kot Cel program pa bo: POVEČAJMO ULOMEK - OBJEKTNO 24: using System. To pomeni.

imenovalec).imenovalec + a. 51: int imenovalec = int.stevec + a. 59: } 60: } 61: } Če posebej označimo ključne točke (poleg definicije razreda Ulomek v vrsticah 4 – 17): Objektno programiranje Imamo nek problem.Parse(beri). 47: string beri = Console.stevec = st. 34: } 35: 36: public void Pristej(Ulomek a) { 37: this. 39: } 40: } 41: class Program 42: { 43: public static void Main(string[] args) 44: { 45: // vnos podatkov 46: Console. 55: moj.stevec. 2).Parse(beri). Kako se torej lotiti načrtovanja rešitve s pomočjo objektnega programiranja? Programiranje 1 – VSŠ Informatika . NET 18 31: public Ulomek(int st. int im) { 32: this.C# . 50: beri = Console.WriteLine("Nov ulomek je: " + moj. 38: this.ReadLine(). imenovalec). 56: // izpis 57: Console.Write("Imenovalec ulomka: ").imenovalec = this. 48: int stevec = int.imenovalec = im.ReadLine().stevec = this. 53: // "delo" 54: Ulomek polovica = new Ulomek(1.stevec + " / " + 58: moj.imenovalec.Write("Števec ulomka: "). 52: Ulomek moj = new Ulomek(stevec.pristej(polovica). 49: Console. 33: this.

. Na ta način bomo tudi bolj ločili tisti del programiranja. kakšne objekte potrebujemo za reševanje  Pregledamo. Da pa boste vedeli zakaj gre.. da gre za nekakšne "poenostavljene" objekte. ko uporabljamo objekte določenega razreda. ki sestavljajo poljubnega zajca V zgledih do sem smo razrede pisali le za "lokalno uporabo". kjer s pomočjo objektov rešimo problem Objekti. A ker gre v bistvu le za posebni primer objektov. da pišemo program. če boste v kakšnem programu naleteli na ključno besedo struct. Sedaj se naučimo še. NET 19  Z analizo ugotovimo. V ta namen imamo v jeziku C# tako imenovane strukture. Vsebujejo elemente istega tipa. Za vsakega zajca poznamo:  serijsko številko  spol  težo Kako doseči. V okolju SharpDevelop tokrat ne izberemo Windows Applications/Console Application. da se podatki “držijo” skupaj:  Tabela ni ustrezna  Tabela je zbirka istovrstnih podatkov Pri tabelah smo omenili. ali že imamo na voljo ustrezne razrede  Standardna knjižnica  Druge knjižnice  Naši stari razredi  Sestavimo ustrezne manjkajoče razrede  Sestavimo “glavni” program. . da so sestavljen podatkovni tip.   Sestavimo razred Zajec Opis podatkov. Združevanje podatkov Denimo. ko gradimo razrede in tisti del. razredi. jih bomo kar preskočili in si rajši kar neposredno ogledali objekte.C# . Velikokrat pa želimo ustvariti tip. ki jih bomo uporabljali v različnih programih. ki je prav tako sestavljen. a iz različnih podatkovnih tipov. ki bo pomagal upravljati farmo zajcev. kako na najlažji način gradimo svojo knjižnico razredov. ampak C# / Class Library Programiranje 1 – VSŠ Informatika . si zapomnimo le. znotraj določenega programa.

Ti služijo za to.XMLCommentsInCSharp. Ker nam ime MyClass ni všeč. da pripravimo dokumentacijo o razredu. da je SharpDevelop pripravil okolje in naredil tako imenovam imenski prostor MojiRazredi. Znotraj tega imenskega prostora bomo zlagali naše razrede. bomo to spremenili v Zajec.softsteel.winnershtriangle. Ta je zelo pomembna. Vidimo. saj nosi tisto informacijo.co.csharphelp..com/w/Articles. Več o tem si lahko preberete:  http://www. RAZRED ZAJEC 21: public class Zajec { 22: public string serijska. da na ustrezno mesto napišemo kratek povzetek o tem.html    http://www.asp http://www.. 24: public double masa. V ta projekt bomo dodajali vse tiste razrede.uk/tutorials/cSharp/lesson19.C# .html . če želimo razred uporabljati. 23: public bool spol. ki jih bomo ustvarjali. To so tako imenovani dokumentacijski komentarji. ki se začno z ///. Zanekrat si zapomnimo le.com/archives3/archive598. NET 20 Kot ime bomo napisali MojiRazredi. čemu je razred namenjen. 25: } Programiranje 1 – VSŠ Informatika . ki jo kasneje potrebujemo. vključno z našim razredom Zajec. Omenimo še komentarje.

NET 21 S tem imamo napisan opis.C# .  Project / Add reference Programiranje 1 – VSŠ Informatika .. kjer bomo potrebovali Zajce. . referenco. S tem smo ustvarili ustrezno prevedeno obliko in sicer MojiRazredi. da sedaj pišemo nek program. V ta namen sedaj sestavimo program v C#. Obnašamo se tako kot smo pisali programe do sedaj. TA vsebuje med drugim tudi definicijo razreda Zajec. da bo naš program prepoznal naš razred. Ni namenjeno poganjanju kot program.  v SharpDevelop: File/New Solution/Winows applications/Console Application Sedaj moramo dodati še t.. Uporaba razreda Zajec Denimo.i. dejansko se NIČ ne izvede.dll. kako je določen poljuben zajec:  Načrt. kakšni so zajci  Ni to konkreten zajec Ni metode Main. Zato bo stvar potrebno prevesti drugače. V Build izberemo Build Moji Razredi (oziroma pritisnemo na F9).

C# . 62: Programiranje 1 – VSŠ Informatika . Če sedaj v programu potrebujemo konkretnega zajca.serijska = “BRGH_17_A”. ki se odpre. 27: using MojiRazredi. Da bomo krajše pisali.2.dll.  V spremenljivki rjavko je naslov.  rjavko. kje je novo ustvarjeni zajec (objekt) Dostop do podatkov v objektu  rjavko.spol = true. kje ta konkretni zajec je  Zajec rjavko = new Zajec().Net Assembly Browser. izberemo . dodamo sedaj imenski prostor MojiRazredi (ker vsebuje definicijo razreda Zajec) using MojiRazredi. Poiščemo imenik MojiRazredi/bin/Debug in v njem datoteko MojiRazredi.masa = 3. ga “ustvarimo” z new:  new Zajec()  Ustvaril se je konkreten zajec po navodilih za razred Zajec (ta zajec ima torej tri podatke / lastnosti / komponente)  Metoda je vrnila naslov. UPORABA RAZREDA ZAJEC 26: using System. NET 22 V oknu.  rjavko.

ReadKey(true). "). 37: i++. . 71: z1. // “rodil” se je nov zajec 34: zajci[i].12.spol = false. 36: zajci[i]. 73: z1.12. 74: Console. 35: zajci[i].WriteLine("Zajec ima ser. 78: } 79: } 80: } FARMAZAJCEV 28: public class FarmaZajcev { 29: public static void Main(atring[] ar) { 30: Zajec[] zajci = new Zajec[10]. 70: z1.masa + 0. NET 23 63: namespace TestZajec 64: { 65: class Program 66: { 67: public static void Main(string[] args) 68: { 69: Zajec z1 = new Zajec(). št..serijska). 40: } 41: } Programiranje 1 – VSŠ Informatika . 75: 76: Console.C# .serijska = "1238-12-0".masa = z1.Write("Press any key to continue .serijska = "1238-12-“ + i. 77: Console.3.. 32: while (i < 10) { 33: zajci[i] = new Zajec().masa = 0. 72: z1.masa = 0.spol = false.:" + z1. . // na farmi imamo do 10 zajcev 31: int i = 0. 38: } 39: .

C# . NET 24 Programiranje 1 – VSŠ Informatika .

84: } Potem. Kako “napolniti” stevec in imenovalec?  x.imenovalec : enako   x. ko z Build/Build MojiRazredi prevedemo stvar na novo. NET 25 Še en primer . Naš projekt MojiRazredi (seveda bi lahko naredili novo knjižnico razredov) dopolnimo z RAZRED ULOMEK 81: public class Ulomek { 82: public int stevec.imenovalec = x. je knjižnica z novim razredom Ulomek pripravljena za uporabo. Programiranje 1 – VSŠ Informatika . x. kot tudi pri sestavljanju drugih razredov. napišemo Ulomek x = new Ulomek().C# . To pomeni.stevec + 1.stevec = 1.Ulomek Denimo.stevec : spremenljivka tipa int!  x. 83: public int imenovalec. Ne pozabimo – če želimo narediti objekt vrste (tipa) Ulomek. da novi razred (če želite – novi podatkovni tip) lahko uporabljamo v drugih programih. da bi potrebovali še podatkovni tip Ulomek.

imeKomponente Konstruktorji Ob tvorbi objekta bi radi nastavili začetno stanje spremenljivk (in morda opravili še kaj – a o tem kasneje). public int prevozeniKilometri. moramo v programu dodati referenco na ustrezno prevedeno obliko (dll) tega razreda. } } Razlaga.proizvajalec = "Citroën". Objekt tega razreda ustvarimo z new ImeRazreda(). S tem dobimo naslov. … public podatkovni tip elementn. Do posameznih spremenljivk (rečemo jim tudi komponente ali pa lastnosti).WriteLine("Kilometri: " + mojAvto. Te so lahko različnih podatkovnih tipov. Povzetek Najenostavnejši razred kreiramo tako. } Če želimo tak razred uporabljati v nekem programu.prevozeniKilometri).prevozeniKilometri = 90000. public string proizvajalec. V glavnem programu kreiramo nov primerek (objekt) z imenom mojAvto razreda Vozilo (vrstica 12).C# . Sintaksa najenostavnejše definicije razreda je naslednja: public class ImeRazreda { public podatkovni tip element1. Najprej ustvarimo razred z imenom vozilo (vrstice 2-7). da določimo spremenljivke. Programiranje 1 – VSŠ Informatika . public class Vozilo { public int letnik. kje ta objekt je in ga shranimo v spremenljivko tipa ImeRazreda: ImeRazreda imeObjekta = new ImeRazreda(). ne pozabimo. PRIMER 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: IZDELAVE IN UPORABE RAZREDA using System. Console. public podatkovni tip element2. Objektu določimo vrednosti (vrstice 13-15) in izpišemo vrednosti (vrstice 16-18). Console. da če določen razred potrebujemo le v sklopu rešitev enega primera. Console.//kreiramo primerek mojAvto. mojAvto.WriteLine("Proizvajalec: " + mojAvto. mojAvto. } class Program { public static void Main() { Vozilo mojAvto = new Vozilo().letnik = 2000.proizvajalec). ki določajo objekte tega razreda. ga lahko ustvarimo tudi "lokalno". znotraj tistega programa. dostopamo z imeObjekta. NET 26 No.WriteLine("Letnik: " + mojAvto.letnik).

V konstruktorju je to objekt.10)).MetodaNeka(). ustvarimo dva objekta tipa MojRazred. To "zamenjavo" dosežemo z this. 89: 90: // konstruktor 91: public Zajec() { 92: this.MetodaNeka() pa starost objekta objC? Console. da gre:  Prvič za objekt z imenom objA  drugič za objekt z imenom objC Če se moramo v kodi metode metodaNeka sklicati recimo na komponento starost (jo recimo izpisati na zaslon). Napisali smo this. da se je vedelo.MetodaNeka() oziroma z objC. ki ga ustvarjamo. 88: public double masa.WriteLine("Starost je: " + this.serijska = “NEDOLOČENO”. da v nekem programu napišemo Zajec rjavko = new Zajec(). da konstruktor ne moremo klicati na poljubnem mestu (kot lahko ostale metode).starost). Random g2 = new Random(). ki se ustvarja (ki ga je ravno naredil new). da imamo razred MojRazred (v njem pa komponento starost) in v njem metodo MetodaNeka. da naj se ob klicu objA. pri drugem na belko. Zajec belko= new Zajec(). Konstruktor mora imenti ime nujno tako. ki ga "obdelujemo". Največja omejitev. this. da pri metodi Next mislimo na uporabo generatorja ng in ne na g2? Denimo. Je brez tipa rezultata. ki jih imenujemo konstruktorji.0. Napišemo Console. Kaj to pomeni? this označuje objekt. To ne smemo zamenjati z metodami.spol se torej nanaša na lastnost/komponento spol objekta. // in tehtajo 1kg 94: this.C# . kot je ime razreda. Na ta način (z this) se lahko sklicujemo na objekt vedno. Console. Pri prvem klicu se ob uporabi konstruktorja Zajec() this nanašal na rjavko. ki jo izvajamo nad nekim objektom.WriteLine(ng. NET 27 V ta namen imamo v C# posebne metode. Kličemo ga izključno skupaj z new:  Klic: new Zajec(). ob drugem pa objC. V programu. Razred Zajec RAZRED ZAJEC S KONSTRUKTORJEM 85: public class Zajec { 86: public string serijska. ki rezuultata ne vračajo – so tipa void). Ob prvem klicu so ???? objA.WriteLine("Starost je: " + ?????. Programiranje 1 – VSŠ Informatika . Naj bosta to objA in objC. ob klicu objC.starost). Konstruktor je metoda. kako povedati. 95: } 96: } this V zgornjem primeru smo v konstruktorju uporabili prijem. da smo napisali Random ng = new Random(). Kako so programerji.spol = true. ki ga doselj še nismo srečali. Denimo. Kako se znotraj metode MetodaNeka sklicati na ta objekt (objekt. tudi void ne.Next(1. Denimo. kadar pišemo metodo. nad katerim je izvajana metoda)? Če torej metodo MetodaNeka kličemo nad obema objektoma z objA. kjer razred MojRazred uporabljamo. ki so sestavljali knjižnico in v njej razred Random lahko napisali kodo metode.MetodaNeka() uporabi starost objekta objA. ki loči konstruktorje od drugih metod pa je ta.masa = 1. ki jo pokličemo ob tvorbi objekta z new. spol 93: this. Konstruktor tipa rezultata sploh nima. 87: public bool spol. kako v postopku za metodaNeka povedati. // vsem zajcem na začetku določimo m. Prav tako smo omenjeni pri izbirri imena te metode.

Dokler je bil naš razred zajec RAZRED ZAJEC 1: 2: 3: 4: 5: public class Zajec { public string serijska. Kombinacija new Zajec()je torej poskrbela. ampak le. 102: } je torej to enako. ga “naredi” prevajalnik sam (a metoda ne naredi nič). } je prevajalnik sam dodal privzeti kostruklor. Prat tako ne vsebujejo stavka return. nad katerim smo takoj potem izvdeli določeno akcijo po navodilih iz konstruktorja Zajec(). Privzeti konstruktor Če konstruktorja ne napišemo (kot ga nismo prej). ko tvorimo objekt z new. PRIVZETI KONSTRUKTOR RAZREDA ZAJEC 97: public Zajec() { 98: } Kakor hitro pa smo konstruktor Zajec() napisali sami. 101: public int imenovalec. 106: 107: public Ulomek() { 108: } 109: } Konstruktorjev ne moremo klicati posebej (kot ostale metode). public double masa. ob drugem pa objC. se seveda prevajalnik ni več "vmešaval": Ko smo napisali RAZRED ULOMEK 99: public class Ulomek { 100: public int stevec. Torej v metodi na tistem mestu. Ne pozabimo. da imajo enako ime kot razred. ki ima tri spremenjlivke za hranjenje podatkov). kot če bi napisali RAZRED ULOMEK S PRIVZETIM KONSTRUKTORJEM 103: public class Ulomek { 104: public int stevec. ga “ustvarimo” z new: new Zajec() S tem se je ustvaril konkreten zajec (torej tak. kako so videti objkekti določenega razreda. Nimajo tipa rezultata (tudi void ne!). nad katerim metodo izvajamo. da ima objekt tipa Zajec tri podatke z vrednostmi. Konstruktorje uporabljamo za vzpostavitev začetnega stanja objekta. Uporaba razreda: Kot smo povedali že večkrat. 105: public int imenovalec. public bool spol. napišemo this. Če potrebujemo konkreten primer. NET 28 Ob prvem klicu this pomeni objA.C# . v našem primeru Zajca. je razred le načrt. kjer potrebujemo konkretni objekt. kot je predpisano v konstruktorju. Programiranje 1 – VSŠ Informatika .

Podpis metode je sestavljen iz imena metode in tipov vseh parametrov. kakšen je. Krog ali Pravokotnik. a različnimi podpisi. bool spol. če dobimo še Programiranje 1 – VSŠ Informatika .. Seveda to ne gre. če je lik tipa Krog spet drugo . tipa Krog ali pa tipa Pravokotnik. Kako jo začeti? public static double Ploscina(X lik) Ker ne vemo. Prav tako enako velja Še enkrat – preobteženost označuje možnost. ki bi sprejela parameter tipa X.. tudi ni težav z uporabo pravilne forumule. da bi takoj. Konstruktor Zajec() ima torej podpis enostavno Zajec. če je lik tipa kvadrat. NET 29 Več konstruktorjev Uporabniki bi poleg privzetega zajca. double masa) pa podpis Zajec_string_bool_double Preobtežene metode Kot smo omenili. Imamo torej tri metode. ki kot parameter dobi objekt iz razreda Kvadrat. da bi zagotovil. da imamo metodo Ploscina. S preobteževanjem pa problem rešimo enostavno. konstruktor public Zajec(string serijskaStev. z enakim imenom. ki je bodisi tipa Kvadrat.. da mora biti metoda public Zajec(string serijskaStev. Krog ali Pravokotnik. bi morali napisati metodo. Prav tako je enostavneje. ko zajca naredijo. A ker morajo imeti vsi konstruktorji ime točno tako. ne da bi mu bilo potrebno razmišljati. da je X oznaka bodisi za tip Kvadrat. bool spol. ampak podpisu. uporabi to formulo. kjer je X bodisi Kvadrat. bool spol. temu določili še serijsko številko. Tako imamo lahko znotraj istega programa več metod z enakim imenom. Metode se morajo razlikovati ne v imenu. da imamo več enako poimenovanih metod. To ne velja le za konstruktorje. da bi imeli več metod z enakim imenom. Zakaj je to uporabno? Denimo. Pa tudi če bi šlo – kako bi nadaljevali? V kodi bi morali reči . kaj bi napisali za tip parametra. saj prevajalnik nima načina. da ima razred več konstruktorjev. double masa) Ker pa imamo že od prej metodo public Zajec() to pomeni. kakšno je pravilno ime ustrezne metode ravno za ta lik. Napišemo tri metode public static double Ploscina(Kvadrat lik) { … public static double Ploscina(Krog lik) { … public static double Ploscina(Pravokotnik lik) { … Ker za vsak lik znotraj ustrezne točno vemo. Torej potrebujejo še konstruktor public Zajec(bool spol) Včasih pa so zajci "nestandardni" public Zajec(string serijskaSt. to pomeni. kot je ime razreda. radi še možnost. smo napisali kar X.. recimo takole: public static double PloscinaKvadrata(Kvadrat lik) { … public static double PloscinaKroga(Krog lik) { … public static double PloscinaPravokotnika(Pravokotnik lik) { … A s stališča uportabnika metod je uporaba preobteženih metod enostavnejša. Če ima nik lik bla. tip Krog ali pa tip Pravokotnik. Je to sploh možno? Jezik C# podpria tako imenovano preobteževanje (overloading) metod. Če preobteževanje ne bi bilo možno. metodo pokliče z Ploscina(bla). double teza) Potrebovali bi torej. so lahko preobtežene tudi “navadne” metode (ne le konstruktorji). Radi bi torej konstruktor public Zajec(string serijskaSt) Poleg tega pa včasih na farmo dobijo tudi pošiljko samic. ampak tudi v splošnem.C# . Seveda bi lahko problem rešili brez preobteževanja. ki pa sprejemajo parametre različnega tipa.

masa = 1. lahko izpustimo Programiranje 1 – VSŠ Informatika .C# .0. // popravimo spol 75: } Ključna beseda this v zgornjem zgledu nastopa v dveh vlogah. KONSTRUKTORJI 62: 63: 64: 65: 66: 67: 68: 69: 70: RAZREDA ZAJEC public Zajec() { this. Klic pa je še vedno Ploscina(bla)! Podpisi metod Podpis metode:  Podpis: ime + število in tipi parametrov!  Tip rezultata (return tip) NI del podpisa!  public static int NekaMetoda(double x) Podpis metode:  public static int NekaMetoda(double x)  Podpis: NekaMetoda_double  “interno” ime Kaj je lahko sočasno:  public static int NekaMetoda()  public static int NekaMetoda(double y)  public static int NekaMetoda(double x)  public static double NekaMetoda(double x)  public static int nekaDrugaMetoda(double y) Konstruktorji razreda Zajec – navzkrižno sklicevanje Poglejmo. } 71: public Zajec(string serijskaStev. Enkrat je uporabljena za ime objekta. Še malo o this o this(  Za klic drugega konstruktorja pred vsemi ostalimi stavki drugega konstruktorja  this()  this(<parametri>) o this.spol = spol. kar že poznamo (this.spol = true.spol.serijska  Če ni možnosti zamenjave. kako bi kostruktorje razreda Zajec napisali "zares".serijska = serijskaStev. double masa) : this(serijskaStev) { 73: this. // popravimo maso 74: this.  Za dostop do lastnosti  this. 72: bool spol. // vsem zajcem na začetku določimo m.masa = masa. spol this. NET 30 četrti tip objekta – v “glavno” kodo ni potrebno posegati – naredimo le novo metodo z istim imenom (Ploscina) in s parametrom katerega tip je novi objekt. novo pa je uporaba this( takoj za seznamom parametrov nekega konstruktorja. this.serijska …).serijska = “NEDOLOČENO”. // in tehtajo 1kg this. } public Zajec(string serijskaStev) : this() { this.

priimek = "Mavko". 98: c.ime + " " 101: " " + a.WriteLine("Clan b:\n" + b. Podatki o članu obsegajo ime. Če je a objekt tipa Clan.vpisna_st = "4377". 89: a. 90: 91: Clan b = new Clan(). 96: 97: Clan c = b.WriteLine("Clan c:\n" + c. 99: 100: Console.priimek + + a.leto_vpisa + " (" 102: 103: Console.  Obstajalo je že DRUGO ime spol  Ločiti med spremenljivko spol.vpisna_st + ")\n"). Denimo. vsebuje štiri podatke: RAZRED CLAN 76: public class Clan { 77: public string ime. da napišemo a.ime = "Janez". vpisna_st. 80: public string vpisna_st.leto_vpisa + " (" 105: 106: Console. 78: public string priimek. 109: } 110: } Programiranje 1 – VSŠ Informatika + a. 93: b. ki vodi evidenco o članih športnega kluba. 86: a. priimek. + b. 88: a. .leto_vpisa = 2001.ime + " " 104: " " + b. 81: } S tem smo povedali. ki je parameter in lastnostjo objekta z imenom spol  "Prednost" ima bolj "lokalna" stvar – torej parameter  spol = spol.priimek + + b.priimek = "Starina".ReadLine(). da je vsak objekt tipa Clan sestavljen iz štirih komponente: ime. Nov objekt naredimo z ukazom new.leto_vpisa = 2000.leto_vpisa + " (" 108: Console.ime = "Mojca".ime = "Andreja". 94: b. 87: a.spol = spol. priimek. Zgled Oglejmo si še en primer sestavljanja razredov. 95: b.ime + " " 107: " " + c. Torej objekt. leto_vpisa. NET 31  serijska  this. 92: b. 79: public int leto_vpisa. potem lahko dostopamo do njegove komponente ime tako.vpisna_st + ")\n").vpisna_st = "2304". ki predstavlja člana kluba. da bi radi napisali program. + c.ime.priimek + + c. letnico vpisa v klub in vpisno številke (seveda je to poenostavljen primer).WriteLine("Clan a:\n" + a.vpisna_st + ")\n"). kot to kaže naslednji primer: TESTKLUB 82: public class TestKlub { 83: public static void Main(string[] args) { 84: 85: Clan a = new Clan().C# .

da se v 16. da kako komponento pozabimo nastaviti. 114: public string vpisna_st. Konstruktor uporabimo v ukazu new. string v) { 118: this. 115: 116: public Clan() { Programiranje 1 – VSŠ Informatika . da sta dva zadnja izpisa enaka? V programu smo naredili dva nova objekta razreda Clan. 121: this. da spremembe razreda ne vplivajo na programe. V ta namen si je dobro zapomniti. 113: public int leto_vpisa.leto_vpisa = l. C# najprej naredi nov objekt. Spremenljivka c pa je isti objekt kot b. Zato sedaj ni sam dodal konstruktor Clan(). kaj pa tisto govorjenje o tem. Kako.ime = i. Zato C# omogoča. string p. Ampak. se C# ne vmešava več. saj ga prej tudi ni bilo? Kako je pa prej delovalo? Kot smo rekli že prej. ki ima enako ime kot je ime razreda. Konstruktor je posebna metoda. Kot vedno. vrstici ni naredila nova kopija objekta b. Primer: 111: public class Clan { 112: public string ime. ki ga pa v razredu Clan nismo napisali. prevajalnik "protestira". nato pa pokliče konstruktor.priimek = p. ki sta shranjena v spremenljivkah a in b. Torej se ne bi smelo nič pokvariti! Razlog je v tem. 112: public string priimek.vpisna_st = v. da delamo nove objekte na bolj praktičen način s pomočjo konstruktorjev. 122: } 123: } Poskusimo – ali naše "pacanje" po razredu kaj vpliva na testni program. kako to. 120: this. int l. RAZRED CLAN 110: public class Clan { 111: public string ime. 113: public string priimek. ker se zlahka zgodi. C# sam doda konstruktor Clan(). Kakor hitro pa napišemo poljubni konstruktor. da v razredih vedno napišemo tudi konstruktor Clan().C# . da uporabimo privzeti konstruktor (Clan()). in testni program ne dela več prav. ampak se spremenljivki b in c sklicujeta na isti objekt. Se je kje spremenilo kaj na nivoju sporočil? Saj jih v prvotnem programu sploh nimamo. In zato smo z vrstico 23 vplivali tudi na ime objekta b! V vrsticah 4—8 smo naredili objekt a in nastavili vrednosti njegovih komponent. Takole nastavljanje je v praksi dokaj neprimerno. NET 32 Hm. 115: public string vpisna_st. če konstruktorja ne napišemo. Znotraj konstruktorja se pravkar narejeni objekt imenuje this. Ko poskusimo prevesti program. 114: public int leto_vpisa. 119: this. ki razred le uporabljajo. 116: 117: public Clan(string i. se pravi. Zato je prej zadeva delovala. se nove objekte naredi z ukazom new.

leto_vpisa = l. 142: 143: Console.vpisna_st = "Ne vem".ime + " " + a. this.ime + " " + b. 127: public int leto_vpisa. da namesto this.ime = "Katarina". Poglejmo ta testni program TESTCLAN 130: public class TestClan{ 131: public static void Main(string[] args) { 132: Clan a = new Clan("Janez". this. težav ni več in dobimo isti rezultat. "2304").vpisna_st + ")\n"). } public Clan(string i. če pa je stvar enaka kot prej.vpisna_st + ")\n").ime = i.leto_vpisa = 0.vpisna_st = v. je pa vsekakor bolj pregleden. string v) { this. 128: public string vpisna_st. this. 134: Clan c = b.leto_vpisa + " (" + a. NET 33 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: } this. da nastavi vrednosti komponent objekta.leto_vpisa + " (" + c.ime + " " + c.leto_vpisa + " (" + b. 139: 140: Console.WriteLine("Clan a:\n" + a. 132: priimek = "Ne vem". this.vpisna_st + ")\n"). 129: 130: public Clan() { 131: ime = "Ne vem". 126: public string priimek. A čemu smo potem pisali še drugi konstruktor in zakaj smo se sploh ubadali z njimi. 145: } 146: } Zgornji program deluje povsem enako kot prejšnji testni program. 2000.priimek + 141: " " + b. this. this. "Mavko". 133: Clan b = new Clan("Mojca".WriteLine("Clan b:\n" + b. 133: leto_vpisa = 0.C# . 2001. int l. Namen konstruktorja je. "4377").priimek = "Ne vem".priimek + 138: " " + a. 135: c. nam C# omogoča.priimek = p. Programiranje 1 – VSŠ Informatika . Ker konstruktorji (pa tudi druge metode znotraj razreda) zelo pogosto dostopajo do komponent. "Starina". string p. 136: 137: Console.komponenta pišemo kar komponenta: RAZRED CLAN (BREZ THIS) 124: public class Clan { 125: public string ime.WriteLine("Clan c:\n" + c.ime = "Ne vem". } Ko sedaj poskusimo izvesti naš testni program.priimek + 144: " " + c.

le s presledkom med začetnico imena in priimka.leto_vpisa + " (" + a. ki vsebuje ta razred). To bomo napisali takole: METODA V RAZREDU CLAN 148: public string Inicialke() { 149: return this. 154: string inicialnkeClanaA = a.ime[0] + " " + this.ime[0] + ". 157: Console. } public Clan(string i.Equals(primerjava) in tako dalje. Če želimo izvesti metodo Equals nad nizom besedilo. string p. Brez kakršnihkoli sprememb na strani uporabnika njihovi programi delujejo "popravljeno". kjer spremnimo metodo METODA V RAZREDU CLAN 160: public string Inicialke() { 161: return this. Programiranje 1 – VSŠ Informatika . vpisna_st = v. NET 34 134: 135: 147: 136: 137: 138: 139: 140: 141: 142: } vpisna_st = "Ne vem". "2304"). Denimo.".WriteLine("ima inicialke: " + inicialnkeClanaA). le vsem našim uporabnikom pošljemo novo različico prevedenega razreda (ali knjižnice.WriteLine("To naj se izpiše"). 162: } Ko razred ponovno prevedemo.vpisna_st + ") "). Kaj storiti? Potrebno je popraviti le razred Clan. Tako če želimo izvesti metodo WriteLine nad objektom System.priimek[1] + ". da je potrebno v razredu narediti kakšen popravek. leto_vpisa = l. string v) { ime = i.priimek[0].Console. 158: } 159: } Denimo. metoda sedaj deluje v skladu z v razredu narejenimi spremembami. Če torej opazimo. da smo kasneje ugotovili.priimek + 156: " " + a. da bi bili uporabniki razreda Clan veliko bolj zadovoljni." + this. torej znanje nekega objekta. da potrebujemo metodo. če bi metoda Inicialke vrnila niz brez pik. priimek = p. ki vrne inicialke nekega člana. piko in ime metode.Console napišemo System. ki uporabljajo ta razred. 150: } Oglejmo si še uporabo te metode v nekem testnem programu: TESTCLAN 151: public class TestClan{ 152: public static void Main(string[] args) { 153: Clan a = new Clan("Janez".Inicialke(). 2000. napišemo besedilo.Write("Clan a:\n" + a. da navedemo ime objekta. int l. metode nad nekim objektom kličemo tako. Kot že vemo iz uporabe vgrajenih razredov.C# .ime + " " + a. 155: Console. ko objektu pridružimo še metode. } Objektne metode Svoj pravi pomen dobi sestavljanje razredov takrat. Brez kakršnekoli spremembe v uporabniškem programu (in tudi brez ponovnega prevajanja tega programa). imamo že vse pripravljeno za "pravilno" izvajanje vseh tistih programov. "Starina".

priimek + " " + 178: this. 197: leto_vpisa = l. KOPIJA OBJEKTA 163: public Clan Kopija() { 164: Clan nov = new Clan().WriteLine("Clan:\n" + this.vpisna_stevilka. 175: } ali pa še OPIS OBJEKTA 176: public string Opis() { 177: return this. a = b. ki izpiše objekt IZPIS OBJEKTA 171: public void Izpis() { 172: Console.vpisna_st + ")\n").ime. NET 35 Vemo. 186: 187: public Clan() { 188: ime = "Ne vem".vpisna_st + "). ampak sedaj a in b označujeta isti objekt. string v) : this() { 195: ime = i. V a je nov objekt. 180: } Če sedaj navedemo celotni razred RAZRED CLAN 181: public class Clan { 182: public string ime. da z a = b.priimek = this. 170: } Uporabna je tudi metoda. kjer sta a in b obe spremenljivki tipa Clan. Programiranje 1 – VSŠ Informatika .leto_vpisa.vpisna_stevilka = 169: this.leto_vpisa = this. 191: vpisna_st = "Ne vem". 189: priimek = "Ne vem". 192: } 193: 194: public Clan(string i.priimek + " " + this.priimek. ki pa ima iste podatke kot b. 166: nov. v a ne shranimo kopije objekta b. int l. ki naredi kopijo objekta.leto_vpisa + 179: " (" + this. 185: public string vpisna_st. string p. 196: priimek = p. 167: nov. 184: public int leto_vpisa.Kopija().C# . 165: nov. 168: nov.ime = this.ime + " " + this. 190: leto_vpisa = 0.leto_vpisa + 174: " (" + this.ime + " " + 173: this. 183: public string priimek. Zato napišimo metodo.

ime + " " + this. return nov. 2000. 238: Console." + this.ime[0] + ". 233: 234: Console. "2304"). 237: Console.ime + " " + this.ime. nov.priimek.vpisna_stevilka. NET 36 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: } vpisna_st = v.ReadLine().priimek + " " + this.C# . nov. d. } In še zgled uporabe tega razreda UPORABA RAZREDA CLAN 225: public class TestKlub { 226: public static void Main(string[] args) { 227: 228: Clan a = new Clan("Janez".Izpis().vpisna_st + ").priimek[0] + ".Kopija(). 239: } 240: } Programiranje 1 – VSŠ Informatika .". "Starina".Opis()).ime = this.leto_vpisa + " (" + this. a.ime = "Andreja". } public Clan Kopija() { Clan nov = new Clan(). 232: Clan d = b. 2001. "4377").leto_vpisa + " (" + this. 236: Console.leto_vpisa = this. nov.Izpis().WriteLine("Clan:\n" + this. } public string Inicialke() { return this.vpisna_st + ")\n").priimek = this.WriteLine("Clan a").WriteLine("Clan d"). 231: c. 230: Clan c = b.priimek + " " + this.WriteLine("Clan c:\n" + c.leto_vpisa. 235: Console. } public void Izpis() { Console.WriteLine("Clan b:\n" + b.vpisna_stevilka = this. 229: Clan b = new Clan("Mojca".Opis()). "Mavko". } public string Opis() { return this. nov.

Kot prvno. Sedaj se moramo odločiti.m. NET 37 Zgledi Datum Denimo.l Sedaj se lahko lotimo metod. Najprej moramo pripraviti načrt razreda. povečali dan za 1. 247: mesec = "januar" 248: leto = 2000. so: o dan (število) o mesec (izbira: število ali pa niz) o Leto (število) Denimo. da bomo dan in leto hranili kot število. 243: public string mesec.mesec = m. Potem. .leto public Datum(int d.1.. Odločiti se moramo torej. verjetno bolj uporabna pa bop metoda. nad katerim bomo metodo izvedli. mesec pa kot niz (torej kot januar. 261: if (leto % 400 == 0) return true. ali je leto prestopno 258: public bool JePrestopno() { 259: int leto = this. To pomeni.. se lotimo sestavljanja razreda RAZRED DATUM 241: public class Datum { 242: public int dan. 262: if (leto % 100 == 0) return false. } // datum je torej d. ki bo dani datum povečala za en dan. // this je nujen } // datum je torej 1.leto. Lotimo se metode Programiranje 1 – VSŠ Informatika . Januar. februar.1. da v naših programih pogosto delamo z datumi. 244: public int leto.. No. Sveda ne smemo pozabiti na prestopna leta. int l) : this(l) { // leto smo ţe nastavili this. recimo 32. 260: if (leto % 4 != 0) return false. 263: return true. ko smo si pripravili načrt.. 249: } // privzeti datum je torej 1. saj s tem lahko naredimo neobstoječ datum. Podatki.C# . da se odločimo.2000 Dodajmo še dva konstruktorja 250: 251: 252: 253: 254: 255: 256: 257: public Datum(int leto) : this() { this. Zato bomo sestavili ustrezni razred. nas zanima.dan = d.leto = leto. 245: public Datum() { 246: dan = 1.). kako bi hranili podatke o datumu. Nekaj idej: o Lepo izpiši o Povečaj za 1 dan o Je datum smiselen o Je leto prestopno o Nov datum za toliko in toliko dni pred/za danim datumom o Dan v tednu o . katere metode bo poleg konstruktorjev poznal naš razred. 264: } Večjih težav ni bilo. Potem pa se lahko zaplete. ki sestavljajo datum. string m. da bomo objektu. // this ni nujen this.

283: public class JeLetosPrestopnoLeto { 284: Datum danes = new Datum(22.C# ."junij". je zagotovo Ko privandramo do sem. da bi šlo z manj truda. da smo razred Datum uspešno naredili. vidimo. 275: if (mesec == 13) { 276: mesec = 1. -1. Če si npr. 2. 4. 270: // lahko nehamo. 89.WriteLine("Ni prestopno leto"). če bi si tudi za mesec namesto imena meseca raje zapomnili kar številko. 289: } 290: } Fibonaccijevo zaporedje V naravi večkrat opazimo zanimive vzorce. Denimo. brovega storža. če je letošnje leto prestopno. Programiranje 1 – VSŠ Informatika . Tako če gremo šteti koliko je zrn v posamezni spirali sončničnega cveta pa tudi npr v številu lusk ananasa. bi morali namesto povečanja za 1 vzeti naslednje ime meseca.IndexOf(mesec) > 0){ 274: mesec = mesec + 1. ki ga imenujemo Fibonnaccijevo zaporedje. mesec in leto sta ok 271: string[] meseciPo30 = {"april"."september". NET 38 265: public void PovecajZaEnDan() { 266: dan = dan + 1... a pomensko povsem zgrešena). 277: leto++... Denimo. če le naredimo objekt. 1.ta naj za začetni pogoj postavi pogoj za običajna Fibonaccijeva števila.. kot tudi preostale metode z našega spiska. 278: } 279: return. 3. ki bo vseboval metodo public int VrniNto(int n). 11. Dovolj bo. Tudi vrstica 35 je narobe . dobimo zanimivo zaporedje.. JE LETOŠNJE LETO PRESTOPNO 282: using MojiRazredi. Fibonaccijevo zaporedje je torej 1. Ko še enkrat premislimo.JePrestopno()) return.. 267: if (dan < 29) return. Ker v spremenljivki mesec hranimo niz. Sedaj pa ga še koristno uporabimo.jePrestopno()) { 286: Console. 1. 7. 13.. za prvo število izberemo 3 in za drugo -1 dobimo zaporedje števil 3. prepustimo bralcu v izziv. 272: if (dan == 31) { 273: if (meseciPo30. 5.. Razred naj vsebuje dva konstruktorja:  publicPosploseniFibonacci() . Če želimo datum videti z imeni mesecev pa za to lahko poskrbimo denimo ob izpisu. 2. S temi podatki lahko izračunamo vsa ostala števila. 21. Če začetna pogoja spremenimo (rekurzivno pravilo pa ostane isto). 34. "november"}. da želimo ugotoviti. Zato se spodobi lotiti stestavljanja razreda datum znova. ki bo izračunal n-to posplošeno Fibonaccijevo število.WriteLine("Je prestopno leto"). 2008). 55. 287: } else { 288: Console. dobimo posplošena Fibonaccijeva števila. Vrstica 34 je pač napačna (sintaktično sicer pravilna. Fibonaccijeva števila definiramo z začetnima pogojema (prvo in drugo število sta enaka 1) ter z rekurzivno formulo (n-to Fibonaccijevo število je vsota prejšnjih dveh) . Vendar to. pa ugotovimo da imamo težave. v katerega shranimo katerikoli letošnji datum in pokličemo pripravljeno metodo JePrestopno(). 285: if (danes. Sestavimo razred PosploseniFibonacci. 3. . semen na jagodi . 268: if (dan == 29 && mesec != "februar") return. 280: } 281: // če je 32 dni. 8. 269: if (dan == 29 && mesec == "februar" && this. 1.

321: for (int i = 2. le pogledamo v tabelo. 1. Kje narediti tabelo? Seveda v konstruktorju. 302: this. 320: tabela[1] = d. ko potrebujemo kasnejše člene pa uporabimo rekurzijo.prvo = p. ostala pa bolj redko. NET 39  public PosploseniFibonacci(int prvo.drugo. 303: } Metoda bo enostaven primer uporabe rekurzije 304: public int VrniNto(int n) { 305: if (n == 1) return this. 293: public int drugo. i++) { 315: tabela[i] = tabela[i – 2] + tabela[i . int d) { 319: tabela[0] = p. i++) { 322: tabela[i] = tabela[i – 2] + tabela[i .VrniNto(n – 2) + 308: this. 306: if (n == 2) return this.tabela[n – 1]. 297: this. končali smo. da izboljšamo odzivnost? Naj objekt hrani tabelo prvih 20 členov. 307: return this. A ni nam preveč ušeč hitrost tega našega razreda. // če imamo ţe naračunanao 327: return this. 316: } 317: } 318: public PosploseniFibonacci(int p.VrniNto(n – 1).prvo = 1. Če torej ustvarimo objekta PosploseniFibonacci fibo = new PosploseniFibonacci() in PosploseniFibonacci splosni = new PosploseniFibonacci(3.drugo = d. -1) nam klica metod fibo. Če potem uporabimo VrniNto(i) in je i <= 20. Le v tistih izjemni primerih. Bi šlo hitreje? Zelo pogosto potrebujemo prvih 20 členov Fibonnacijevega zaporedja.temu podamo vrednosti prvega in drugega posplošenega Fibonaccijevega števila. i < 20. 314: for (int i = 2.VrniNto(n – 2) + // sicer uporabi rekurzijo 328: this. 309: } Tako.1].VrniNto(4) vrneta 3 oz. int d) { 301: this.1]. Hraniti bo potrebno začetna člena RAZRED POSPLOŠENIFIBONACCI 291: public class PosploseniFibonacci { 292: public int prvo.prvo. int drugo) .C# .drugo = 1. Kaj storiti.VrniNto(n – 1). 294: 295: public PosploseniFibonacci() { 296: this. Programiranje 1 – VSŠ Informatika . i < 20. saj mora ta poskrbeti za začetne nastavitve! IZBOLJŠANI RAZRED POSPLOŠENIFIBONACCI 310: public class PosploseniFibonacci { 311: public int[] tabela = new int[20] 312: public PosploseniFibonacci() { 313: tabela[0] = tabela[1] = 1. 323: } 324: } 325: public int VrniNto(int n) { 326: if (n < 20) return this. 298: } 299: 300: public PosploseniFibonacci(int p.VrniNto(4) in splosni.

ki naredi tabelo 100 različnih majic.C# . ki s pomočjo rekurzije izračuna dolžino vodoravne Kochove črte stopnje N. Razred mora tudi poznati metode za nastavljanje in branje teh vrednosti. T1 in T2 (ki sta tipa Tocka. 3/6. ki ima 5 parametrov: n.y1) do točke T2 s koordinatami (x2. da bo imela tri parametre: n (stopnjo črte). Če je npr. x1. ki v tabeli ulomkov poišče največji ulomek. ki gre od točke T1 s koordinatami (x1. ki v tabeli naključnih ulomkov velikosti 20 izpiše vse ulomke. Nato napišite še eno metodo. ki jo narišemo od koordinate x1 do koordinate x2. ki izračuna dolžino Kochove črte. ki vsebuje koordinato x in y in metodo iz naloge 1 prepiši tako. y2). Zato sestavi razred. Na osnovi prejšnje metode sestavi metodo. ki ustvari tabelo naključnih ulomkov s števci med 1 in 10 ter imenovalci med 1 in 10. Podpisi teh metod naj bodo: public int VrniVelikost() ter public void SpremeniVelikost(int velikost) o public string VrniBarvo() ter public void SpremeniBarvo(string barva) o public boolean ImaKratkeRokave() ter public void NastaviKratkeRokave(boolean imaKratkeRokave) o Napiši testni program. Vse skupaj pa zložite v program. Velikost tabele naj bo parameter metode. 5/10 in 4/8. Razred Točka in Kochova črta Pri prvi podtočki naloge 1 se koordinati x in y nista "držali" skupaj. NET 40 329: } 330: } Vaje Kochova črta Sestavi metodo. Programiranje 1 – VSŠ Informatika . naj program izpiše (seveda. y1 in y2. x2. največji ulomek 2/4. če so v tabeli) tudi vse pojavitve ulomkov 1/2. barvo: poljuben niz in ali ima majica kratke ali dolge rokave. Ulomek Sestavite razred Ulomek in napišite metodo. da podatke o vsaki majici zapišeš v svojo vrstico. ki si ga ravno sestavil). Potem prepiši to tabelo v datoteko tako. ki so (matematično) enaki največjemu ulomku. Razred Majica Sestavite razred Majica. Še tretja metoda pa naj zna izpisati ulomek. ki hrani osnovne podatke o majici: o o o velikost: število med 1 in 5. Namig: sestavi metodo.

da pišemo program. Izpiši serijsko številko najlažjega zajca. ki naredi tri zajce s težami. spol in maso. Razred Kolega Sestavi razred Kolega. ki vsebuje komponente:    //vrednost true. Enemu povečaj njegovo težo za 2kg. Oba objekta tudi izpiši na zaslon. naj se izpiše: "Noben moj kolega nima take telefonske številke. Testni program potem dopolni tako. če sta obe tabeli enaki! Razred Zajec Denimo. kot si podatke zapisal na datoteko in v skladu s podatki v tem nizu nastavi ustrezne podatke o majici.C# .2 in 5. moški šovinisti . če ženskega (kaj hočete. ki ima tri komponente:    ime priimek telefonska številka Vse tri komponente naj bodo tipa String in javno dostopne.) masa //masa zajca v kilogramih (tip double) serijska //serijska številka zajca (tip String) spol Sestavi program. Sestavi testni program. ki so naključna števila med 1. Izpiši vse tri teže zajcev. Uporaba razreda Kolega Napiši program. ki pa podatke o teh majicah prebere s pravkar ustvarjene datoteke. prebere telefonsko številko in izpiše tiste objekte iz tabele. Če takega objekta v tabeli ni." Programiranje 1 – VSŠ Informatika . v katerem ustvariš dva objekta tipa Kolega. Celotni program zaključi s tem. Za vsakega zajca poznamo serijsko številko. če je zajec moškega spola in false. NET 41 Nato razred Majica dopolni s konstruktorjem. ki kot parameter dobi niz v takšni obliki. ki imajo tako telefonsko številko. ko si podatke o majicah zapisal na datoteko. Napiši konstruktor:  ki vse tri komponente nastavi na "NI PODATKOV".. da potem. narediš novo tabelo 100 majic.5. ki preveri. ki bo pomagal upravljati farmo zajcev. ki sestavi tabelo 10ih objektov tipa Kolega.. da napišeš še metodo. Sestavi razred Zajec.

Ker ne moremo vedeti. da naj objekt sam poskrbi. Nadgradimo datum Razred Datum nadgradimo tako. Dodatna težava pri neposrednem dostopu do spremenljivk. ki ustvari farmo zajcev (tabelo n zajcev) in med njimi izpiše: 1. Ideja je v tem.2. ki opisujejo lastnosti objekta se pojavi . S tem bi "podrli" pravilno delovanje vseh starih programov. 2008. Datum najtežjega najcenejšega vse zajklje najtežjega samca Denimo. Programiranje 1 – VSŠ Informatika . da naj poleg kostruktorjev pozna naslednje metode         Lepo izpiši Povečaj za 1 dan Je datum smiselen Je leto prestopno Vrni nov datum za toliko in toliko dni pred danim datumom Vrni nov datum za toliko in toliko dni za danim datumom Vrni dan v tednu . ki v tem koledarskem letu še niso bili pregledani. 4. ki opisujejo objekt. NET 42 Uporaba razreda Zajec Sestavi program. Seveda potem moramo tak neposreden dostop do spremenljivk. preprečiti. da bo v pravilnem stanju. da v naših programih pogosto delamo z datumi. ki bi temeljili na prejšnji predstavitvi.masa = -3. Uporaba razreda Zajec z datumom Ustvari farmo zajcev in na njej poišči vse tiste zajce. Zajci z datumom Razred Zajec nadgradi tako. klo se je skotil in datum.C# . Zato bomo sestavili ustrezni razred. oziroma so naši programi bolj podvrženi napakam. so vsi postopki (metode) po nepotrebnem bolj zapleteni. Dostop do stanj objekta Možnost. Nato pa izpiši še tiste zajklje. 1. ki so bile se skotile v obdobju enega leta (torej med 23. da neposredno dostopamo do stanj/lastnosti objekta ni najboljši! Glavni problem je v tem.. ko je bil zadnjič pregledan. ali so podatki pravilni. da na ta način ne moremo izvajati nobene kontrole nad pravilnostjo podatkov o objektu! Tako lahko za našega zajca rjavka v programu mirno napišemo rjavko.. 2007 in 22. Vsebuje naj le dva konstruktorja. 1. 3. 2. da boš za vsakega zajca tudi hranil datum. če moramo kasneje spremeniti način predstavitve podatkov o objektu.

Pomembno nam je le. Zanima nas le to. nas kot uporabnike razreda Random ta sprememba nič ne prizadane. se za uporabnike razreda ne bo nič spremenilo.0 spremenili način hranjenja podatkov za določanje naključnih števi v objektih razreda Random.ime = "Katarina". da take tipkarske napake "polovimo". ki razred Random uporabljajo. 334: novClan. Zakaj je to dobro? Če malo pomilsimo. da delujejo enako). objekt res imeli za "črno škatlo". //leto je smiselno. 342: public string vpisna_st. 348: return true. le da dodamo metodo za nastavljanjen leta vpisa RAZRED CLAN Z METODOZA DOLOČANJE LETA VPISA 338: public class Clan { 339: public string ime. da če spremenimo razred (popravimo knjižnico). torej njegove notranje zgradbe ne bomo "pokazali javnosti". 336: } 337: } Problem s takim pristopom nam kaže ravno vrstica 5. kličemo iste metode. ki opisujejo objekt. ki so delovali prej. da uporabnik lahko neposredno dostopa do teh spremenljivk in morebiti objekt spravi v nemogoče stanje:  mojAvto. V našem primeru programiranja v C# bo to pomenilo. uporabnika razreda pravzaprav ne zanima. 335: novClan. napisali bomo metodo. a bistveno je. Skratka . Če podamo analogijo z realnim svetom:  Ko med vožnjo avtomobila prestavimo iz tretje v četrto prestavo. objekt novClan sedaj hrani napačen podatek. Seveda bi lahko rekli – v redu. Ko smo želeli v objekt zapisati kak podatek. nas ne zanima. Ker smo se zatipkali in vnesli nemogoč podatek. s katero bomo nastavljali leto vpisa in v metodi preverili.s tem ko "ne dovolimo" vpogleda v zgradbo objekta. 341: public int leto_vpisa. da programi. To pomeni.C# . Do sedaj smo spremenljivke.leto_vpisa = leto. kako so podatki predstavljeni. Radi pa bi. da še vedno v takih in takoh okoliščinah prestavimo iz tretje v četrto prestavo.prestava = -10.stanje = <izraz>. če ima ta drugačno vrsto menjalnika. hitreje. če je podatek smiselen. S "skrivanjem podrobnosti" omogočimo. da se stanje avtomobila (prestava) spremeni. Dostopi do stanj Do sedaj smo pisali programe tako. z drugačno tehnologijo. 340: public string priimek. DOSTOP DO PODATKOV 331: public class TestClan{ 332: public static void Main(string[] args) { 333: Clan novClan = new Clan(). kako so prestave realizirane. Ker dejansko nimamo vpogleda (neposrednega dostopa) v te spremenljivke.ni potrebno spreminjati programov. Programe še vedno pišemo na enak način. še vedno delujejo (morda malo bolje. In še enkrat . kazali navzven (imele so določilo public).. 343: 344: … // konstruktorji in metode kot prej! 345: public bool SpremeniLetoVpisa(int leto) { 346: if ((2000 <= leto) && (leto <= 2020)) { 347: this. Takega pristopa smo se do sedaj že večkrat poslužili v zgledih in vajah. lahko poskrbimo za zaščito pred nedovoljenimi stanji. da smo naredili objekt. smo uporabili zapis ime_objekta. Denimo. da so v C# 3. popravimo stanje objekta in vrnemo true Programiranje 1 – VSŠ Informatika . Ko kupimo nov avto nam je načeloma vseeno. da se način prestavljanja ni spremenil. kot smo omenjali že v uvodu. NET 43 Torej bomo.Še posebej je pomembno.leto_vpisa = 208. da če pride do spremembe tehnologije se za uporabnika se stvar ne spremeni. Če sedaj ponovno napišemo razred Clan.

NET 44 349: 350: 351: } return false. 373: } 374: 375: public Clan(string i. vrstici pa je bila sprmememba uspešna. Denimo. bi se vrstica veselo izvedla in spet bi imeli v objektu napačen podatek. 370: priimek = "Ne vem".stanje pojavi kjerkoli. 364: public string priimek.SpremeniLetoVpisa(208). 357: novClan. 377: priimek = p. vrstici ne bomo podatka popravili na napačnega. Po drugi strani pa tudi ni dobro. Programiranje 1 – VSŠ Informatika . bi to. 367: 368: public Clan() { 369: ime = "Ne vem". da je naša "zaščita" zelo pomanjkliva. string v) : this() { 376: ime = i. sprememba par vrstic kode knjižnice MojiRazredi v razredu Clan in že je tukaj nov razred Clan RAZRED CLAN Z DATUMOM 362: public class Clan { 363: public string ime. bi lahko poskrbeli. 365: public Datum datum_vpisa.leto_vpisa) { … Kasneje pa ugotovimo da moramo razred Clan spremeniti in namesto leta_vpisa hraniti kompleten datum vpisa. string p. Ni problema. Datum d. Če bi torej preprečili uporabo ime_objekta.leto_vpisa > drugClan. in bi se stanje spremenljivk. v 8.leto_vpisa = 20008. ki opisujejo objekt lahko spreminjalo le preko metod. 360: novClan. Sedaj v 7. Če bi želeli.SpremeniLetoVpisa(2008).stanje = <izraz>. ali je sprememba uspela. // leto ni smiselno. 359: novClan.leto_vpisa = 2007. lahko tudi preverili tako. Po drugi strani pa že iz vrstice 6 vidimo. da imamo v nekem programu napisano if (enClan. da bi pred spremembo podatka izvedli ustrezne kontrole in v primeru poskusa nastavljanja napačnih podatkov ustrezno reagirali. da se ime_objekta. 371: datum_vpisa = new Datum(). ker letnica ni ustrezna. ne spremenimo nič in vrnemo false } 352: } In še zgled uporabe tega razreda SPREMINJANJE Z METODO 353: public class TestKlub { 354: public static void Main(string[] args) { 355: 356: Clan novClan = new Clan().ime = "Katarina". 358: novClan. 366: public string vpisna_st. Če bi napisali še 361: novClan. 372: vpisna_st = "Ne vem". kakšno vrednost je vrnila metoda.C# . da bi pogledali.

nad katerim bomo izvajali metodo.datum_vpisa. je podobno. this.priimek + " " + this.Kopija(). bi se spremil za oba objekta. 399: } 400: 401: public string Opis() { 402: return this. ne spremnimo inč in vrnemo false } 412: } Preden nadaljujemo. This. popravimo stanje onbjekta in vrnemo true 409: 410: 411: } return false. 380: } 381: 382: public string Inicialke() { 383: return this. In če bi potem kasneje spremnili datum v kateremoli od teh objektov. 393: } 394: 395: public void Izpis() { 396: Console.priimek + " " + 403: this.datum_vpisa = this. 388: nov. saj gre za isti datum. 404: } 405: public bool SpremeniLetoVpisa(int l) { 406: if ((2000 <= leto) && (leto <= 2020)) { 407: this.datum_vpisa.OpisDat() Pa ni nič čudnega. 391: nov. 392: Return nov.datum_vpisa = this.OpisDat() + " (" + this. ki ju izvedemo nad tem objektom. kot ga vsebuje obstoječi objekt.ime.ime + " " + 397: this. 389: nov. vrstici naredili tudi kopijo datuma! Dodatno razlago morda zahtevata še zapisa this. Če bi tam napisali nov.priimek. //leto je smsielno." + this. V novem objektu bio namreč ne hranili novega datuma.vpisna_stevilka.datum_vpisa je objekt tipa Datum.ime + " " + this. // leto ni smsielno.datum_vpisa. opozorimo na vrstico 29. Programiranje 1 – VSŠ Informatika . in this. NET 45 378: datum_vpisa = d.priimek = this.vpisna_st + "). this pač označuje objekt.datum_vpisa.WriteLine("Clan:\n" + this.datum_vpisa je torej objekt tipa Datum.Datum_vpisa.". bi bilo to narobe. 408: return true. Pri vrstici 45 this.leto = l.Datum_vpisa. Zato smo v 29.ime[0] + ".ime = this. torej ima polje leto. 384: } 385: 386: public Clan Kopija() { 387: Clan nov = new Clan().C# .OpisDat() + 398: " (" + this.Kopija().priimek[0] + ". 379: vpisna_st = v.datum_vpisa. 390: nov.datum_vpisa.leto = l. V tem razredu imamo metodi Kopija() in OpisDat().vpisna_stevilka = this. ampak bi le kazali na isti datum. Ta objekt ima polje datum_vpisa.vpisna_st + ")\n").

da dostop do spremenljivk lahko nadziramo. 415: public string priimek.leto_vpisa) { … Če bi ta uporabnikov program sedaj poskusili uporabiti z našim razredom.leto_vpisa.datum_vpisa. zakaj ni dobro. popravimo stanje onbjekta in vrnemo true 423: 424: 425: } return false.  Uporabnik pozna predstavitev:  Kasneje je ni mogoče spremeniti No na srečo pa imamo možnost. delujejo pravilno. da ne bi napisal kar if (enClan. da je uporabnik razreda Clan v svojem programu napisal npr. 416: public int leto_vpisa. 422: return true.masa = -100. da ob še eni spremebi razreda Clan spet stvari ne bi delovale. da bi ustrezno popravili vse metode. Če torej povzamemo. 417: public string vpisna_st. // leto ni smsielno. pa seveda ne bi šlo. RAZRED CLAN Z METODAMA ZA DOLOČANJE/VRAČANJE LETA VPISA 413: public class Clan { 414: public string ime. NET 46 Vrnimo se k razlagi. Ker je metoda VrniLetoVpisa "na zunaj" (torej za uporabnike) enaka kot prej. saj polja leto_vpisa sploh ni več! Zaradi spremembe tehnologije (spremembe razreda Clan) torej stari programi (ki uporabljajo razred Clan) ne delujejo več. V C# poznamo 4 načine dostopa:  public  private Programiranje 1 – VSŠ Informatika .datum_vpisa. bi seveda lahko poskrbeli. ki vrne leto vpisa. ne spremnimo inč in vrnemo false } 426: 427: 428: public int VrniLetoVpisa() { return this.10. 418: 419: public bool SpremeniLetoVpisa(int leto) { 420: if ((2000 <= leto) && (leto <= 2020)) { 421: this. if (enClan. programi.leto) { … in morebiti kasneje spret povzročil.VrniLetoVpisa()) { … Če bi potem prišlo do omenjene zamenjave tehnologije (leto nadomeščeno z datumom). V razredu Clan bi seveda imeli nekaj dela.leto_vpisa > drugClan. a temu se ob "sprmemebi tehnologije" seveda ne da izogniti – saj ravno to hočemo! METODA VRNILETOVPISA 430: 431: 432: } V RAZREDU CLAN Z DATUMOM public int VrniLetoVpisa() { return this. Uporabniki razredov konstrukta ime_objekta.VrniLetoVpisa() > drugClan.letoa > drugClan. } 429: } "Pametni" uporabniki našega razreda bi potem seveda programirali z if (enClan. da bi prav delovali tudi pametno napisani programi. kli so jo uporabljali. Namreč pri tako sestavljenem razredu nihče ne preprečuje uporabniku.datum_vpisa.leto. Kako pa bi morali potem pisati? Že prej bi morali v razredu Clan ponuditi metodo.leto_vpisa = leto. Problem pa je v besedi "pametni uporabnik".C# . //leto je smsielno. Zakaj je to lahko problem?  “zunanji” uporabnik nastavi napačno vrednost:  z1.stanje naj sploh ne bi nikoli uporabljali.

Kakšen dostop velja takrat. NET 47  protected  internal Zadnjih dveh mi ne bomo uporabljali. ne pa vedno. public zamenjamo s private o private string serijska.javnaLastnost Ta način smo uporabljali do sedaj. vedno (ne glede na način dostopa) je možen dostop do komponent.. o private Datum datumRojstva. razen metod znotraj razreda. o private int[] tab. da znotraj razreda (torej ko sestavljamo razred in pišemo njegove metode) ni omejitev. da do lastnosti ne more dostopati nihče. Besedi public pomenita. ki označuje način dostopa (javen ali privaten) spustimo in napišemo le o bool spol.C# . polj . v kakšnih okoliščinah je ta spremenjlivka in kakšen bo potem dostop do nje. private Dostop private pomeni.lastnost  lastnost Denimo. da smo v razredu MojObjekt napisali public int javnaLastnost. Običajno bo to kar public. da smo v razredu MojObjekt napisali private int privatnaLastnost. Zato se opuščanju navedbe dostopa izogibajmo in ga pišimo vedno. Omejitve pri načinu dostopa veljajo le. da do teh dveh spremenljivk dostop ni omejen (je javen – public). Zavedati pa se moramo. public double masa. sevedda lahko napišemo  this. Dostop public smo že ves čas uporabljali. saj smo pisali na primer: o o public string serijska. da do lastnosti (komponent. Programiranje 1 – VSŠ Informatika . od kjerkoli (iz katerihkoli datotek (razredov)) in sicer z ime_objekta. je odvisno od okoliščin. Oglejmo si sedaj razliko med public in private. Kdorkoli naredi objekt vrste MojObjekt: MojObjekt x = new MojObjekt(). lahko dostopa do javnaLastnost: x. Zakaj bi zgubljali čas s premišljevanjem o tem. ko objekte določenega razreda uporabljamo – torej v drugih programih in razredih! public Če je način dostopa nastavljen na public. Če tega ne želimo ..) lahko dostopajo vsi. Včasih besedo. zato si njihov pomen in uporabo oglejte kar sami.lastnost Denimo. Ko pišemo načrt razreda. to pomeni. Če kdo naredi objekt vrste MojObjekt: MojObjekt x = new MojObjekt(). spremnljivk.

Če bodo želeli dostopati do lastnosti (podatkov) objekta (zvedeti.masa = 0.12. false = zenska 162: private double masa. z1. // true = moski. bodo morali uporabljati metode. // serijska stevilka zajca public bool spol. NET 48 bo ob poskusu dostopa do privatnaLastnost: x.masa + 0. // serijska stevilka zajca 161: public bool spol. 172: z1.:” + z1. 173: z1.12.serijska = "1238-12-0“. } } RAZRED ZAJEC2 159: public class Zajec2 { 160: public string serijska.masa = 0.WriteLine(“Zajec ima ser. z1.privatnaLastnost prevajalnik javil napako. // masa zajca ob zadnjem pregledu } public class Zajčnik { public static void Main(String[] ar) { Zajec z1 = new Zajec().3.masa + 0. 174: z1.11).spol = false. false = zenska private double masa. kakšne podatke v objektu hranimo) ali pa te podatke spremeniti.masa = x. št.Console. 177: System. 166: } 167: 168: } UPORABA RAZRED ZAJEC2 169: public class Zajčnik { 170: public static void Main(string[] ar) { 171: Zajec z1 = new Zajec2(). da bomo iz objektov naredili črne škatle.masa = z1.masa = z1. 176: z1. // true = moski. 175: z1.serijska).3.:” + z1.SpremeniTezo(0.C# . 178: } 179: } Dostop do stanj/lastnosti Odločili smo se torej.serijska = "1238-12-0“. Zgledi RAZRED ZAJEC 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: public class Zajec { public string serijska. // masa zajca ob zadnjem pregledu 163: 164: public SpremeniTezo(double x) { 165: this. Programiranje 1 – VSŠ Informatika . z1. Uporabnikom bomo s private preprečili. št.spol = false. In v teh metodah bo sestavljalec razreda lahko poskrbel. da bodo "kukali" v zgradbo objektov določenih razredov.WriteLine(“Zajec ima ser. z1.Console. da se s podatki "ne bo kaj čudnega počelo".serijska). System.

Razlogi. je sploh ne izvedemo. da jih uporabnik spreminja. ki zahtevajo. ko naredimo objekt (kasneje pa uporabnik spola sploh ne more spremeniti.  Dostop do določenih lastnosti lahko omejimo:  Npr. NET 49 Potrebujemo torej:  Metode za dostop do stanj (za dostop do podatkov v objektu)  Metode za nastavljanje stanj (za spreminjanje podatkov o objektu) Prvim pogosto rečemo tudi "get" metode (ker se v razredih. da jim napišemo metodi z imenom get in set in potem lahko uporabljamo notacijo imeObjekta.masa = 2.SpremeniTezo(2. bi videli. ki se tako težko poslovijo od javnih spremenljivk.masa = novaTeza. Na primer: zajcek. če je taka sprememba teže smiselna! Tako je zapis zajcek. kot bi imeli javne spremenljivke..  Možnost oblikovanja pogleda na podatke:  Podatke uporabniku posredujemo drugače.. za katere želimo. ki jih uporabnik sploh ne potrebuje . te 1 metode pogosto prično z Get (Daj) ). Ponovimo še enkrat. kot jih hranimo.SpremeniTezo(-12. V resnici pa je to le "zamaskiran" klic get oziroma set metode.5). Druge pa so t. Za tiste podatke.i. Nastavitve podatkov (stanj) Potrebujemo torej metode. ki bodo nadomestile prireditveni stavek. V bistvu smo s tem dosegli isto kot prej s prireditvenim stavkom zajcek. Tako denimo v razredu Datum mesec hranimo kot število. "set" metode (set / nastavi) . zakaj je pristop z get in set metodami boljši od uporabe javnih spremenljivk.5). RAZRED ZAJEC – SPREMENITEZO 433: public void SpremeniTezo(double novaTeza) { 434: // smiselna nova teza je le med 0 in 10 kg 435: if ((0 < novaTeza) && (novaTeza <= 10)) 436: this.5. Programiranje 1 – VSŠ Informatika . če bi šli v podrobnosti jezika C#. A metoda spremeniTezo lahko PREVERI. kot bi uporabljali besedni opis meseca. spol lahko nastavimo le. saj se ne spreminja . 437: // v nasprotnem primeru NE spremenimo teţe 438: } 439: 440: public bool SpremeniTezo(double novaTeza) { 441: // smislena nova teza je le med 0 in 10 kg 442: if ((0 < novaTeza) && (novaTeza <= 10)){ 443: this.C# . Pri spreminjanju teže zajca z metodo.. določene vrste živali . Vendar gre tu za bistveno razliko. Prireditveni stavek se bo zagotovo izvedel (in bo s tem zajec nevarno shujšal). Mi bomo lastnosti spustili in bomo pisali "svoje" get in set metode. če odmislimo kakšne operacije. načeloma nadomestek stavka zajcek.imeLastnosti.. da lahko določene komponente proglasimo za lastnosti (Property).masa = novaTeza. Na zunaj je videti. proti uporabniku pa je zadeva videti. zakaj je dostop do podatkov v objektu preko metod boljši kot neposredni dostop (preko javnih spremenljivk) so med drugim:  Možnost kontrole pravilnosti!  Možnost kasnejše spremembe načina predstavitve (hranjenja podatkov). seveda)  Hranimo lahko tudi določene podatke. 444: return true. // sprememba uspela 445: } 446: // v nasprotnem primeru NE spremenimo teţe 1 Mimogrede.masa = -12. napišemo ustrezno set metodo. ki jih sestavljajo angleško usmerjeni pisci. Spotoma pa bomo navedli še kak razlog in (upamo) prepričali še zadnje dvomljvce.5. pa lahko preprečimo postavitev lastnosti objekta v napačno stanje! V metodi SpremeniTezo lahko izvedemo ustrezne kontrole in če sprememba ni smislena..

Zato naj metoda SpremeniSerijsko pusti spreminjati le nedoločene serijske številke! RAZRED ZAJEC – SPREMENISERIJSKO public bool SpremeniSerijsko(string seStev) { // sprememba dopustna le. R A Z R E D Z A J E C – S P R E M E N I T E Z O VM E J A H 450: public bool SpremeniTezoVmejah(double novaTeza) { 451: // smislena nova teza je le med 0 in 10 kg 452: // in če ni več kot 15% spremembe od zadnjič 453: int sprememba = (int)(0. pa nam konstruktor brez parametrov ustvari zajca. In ker je spremenljivka spol zaščitena s private..C# . return true.serijska. Denimo da vemo.masa). Seveda. // sprememba uspela 459: } 460: // v nasprotnem primeru NE spremenimo teţe 461: // in javimo. da se teža zajca med dvema tehtanjima ne more spremeniti bolj kot za 15%. bo metoda poskrbekla tudi za to. Tudi serijske številke verjetno ne bomo spreminjali. če serijske štev. Lahko bi .. pa bo morda metoda SpremeniSpol potrebna.Equals("NEDLOČENO")) { this. // ne smemo spremniti ţe obstoječe! } Tudi tu lahko npr. da spremembe nismo naredili 462: return false. Zato set metode za spremninjanje spola sploh ne bomo napisali. ki ji potem zraven pripnemo poljuben niz.serijska = seStev.. ki ima za vrednost serijske številke niz "NEDOLOČENO"..Abs(this. da podpis sestavljajo ime metode in tipi parametrov.masa . da je metoda SpremeniSerijsko bolj kompleksna.5 + (100 * 454: Math. Ali imamo lahko obe metodi? Žal ne.masa – novaTeza) / this. ni if (this. saj imata obe enak podpis. da se vse serijske številke začno s predpono SN. mi pa nočemo imeti serijskih številk oblike SNSN.serijska. } return false. če serijske štev. kjer se gredo čudne stvari. da spremembe nismo naredili return false. je uporabnik ne bo mogel spremeniti. Metoda je seveda lahko bolj kompleksna. NET 50 447: 448: 449: } // in javimo. // this. No. Takim zajcem bomo verjetno želeli spremniti serijsko številko. Spomnimo se. ni if (this. poskrbimo. če bomo naš razred Zajec potrebovali za kakšen genetski laboratorij. če malo bolje premislimo.Equals("NEDLOČENO")) { Programiranje 1 – VSŠ Informatika . RAZRED ZAJEC – SPREMENISERIJSKO S PREDPONO public bool SpremeniSerijsko(string seStev) { // sprememba dopustna le. Tip rezultata pa ni del podpisa! Pri sestavljanju razreda se bomo torej odločili za eno teh dveh metod (odvisno od ocenjenih potreb). 463: } Kaj pa metodi za spreminjanje serijske številke in spola? Na zadnjo lahko mirno pozabimo.. 455: 456: if ((0 < novaTeza) && (novaTeza <= 10) && (sprememba <= 15) ){ 457: masa = novaTeza.. Lahko pa this spustimo! 458: return true. Lahko bi tudi vzdrževali seznam vseh podeljenih serijskih številk in bi metoda poskrbela. Zato lahko z metodo "polovimo" morda napačne poskuse sprememb. Zajec naj ima ves čas tak spol.. In ker so uporabniki pozabljivi in bodo nekateri že sami začeli niz s SN. Na primer lahko zahtevamo. kot mu ga določimo pri "stvarjenju" (torej v konstruktorju). da imajo vsi zajci različne serisske številke.

0.5. // ali return masa 182: } A ni nujno. Recimo. da smo napisali te set metode.PovejTezo() Večina tovrstnih get metdo je enostavnih in v telesu metode vsebujejo le ukaz return. Če torej težo povemo na 0.masa. 471: } Programiranje 1 – VSŠ Informatika . .. bo potrebno pripraviti ustrezno metodo. RAZRED ZAJEC – POVEJTEZO 180: public double PovejTezo() { 181: return this. Če bomo torej potrebovali težo zajca zajcek. S tem smo seveda onemogočili tudi enosatven način poizvedbe po vrednosti podatka v obliki rjavk.5 kg natančno 2.C# . 469: if (decim < 8) return tezaKg + 0.serijska = seStev. da so podatki pravilni.905  3. ki jo pri sestavljanju razreda pogosto pozabimo. A zardi zagortavljanja pravilnosti in možnosti kontrole sprememb podatkov.5. če uporabnik "vidi". a uporabnik je pozabil na decimalno piko v 1. Pogosto na to pozabimo in uporabnik lahko napiše npr. Zato je smiselno. 2. da bomo uporabniku vedno povedali le težo na pol kilograma. 467: int decim = (int)((this.masaČe bomo torej potrebovali težo zajca.Length > 1) && (seStev[0] == 'S') && (seStev[1] == 'N')) this. mi pa bomo interno težo zajca vodili na gram (ali še bolj) natančno. // ne smemo spremniti ţe obstoječe! } Opozorimo še na stvar. true.. da bi zagotovili. 105 kilogramskega zajca verjetno ni. Lahko pogled na podatke "oblikujemo". // nima predpone return true. 2. da je teža ustrezna že ves čas! A zaenkrat smo na nekaj pozabili! Kaj pa začetno stanje.masa – tezaKg) * 10). je.5 kg natančno 466: int tezaKg = (int)this. 105). da zagotovimo.5 K G NATANČNO 464: public double PovejTezo() { 465: // teţo bomo povedali le na 0. če se uporabnik "obnaša lepo". return false.721  2. prištejemo k celim kg 0. bomo napisali zajcek. da so metode get tako enostavne. Zajec neki = new Zajec("X532". smo dostop nastavili na private.5. 470: return tezaKg + 1. NET 51 if ((seStev.serijska = "SN" + seStev. Zato je kontrola smiselnosti podatkov potrebna tudi v konstruktorjih! Dostop do stanj Pogosto nem je vseeno. kako hranimo podatke v objektu. 468: if (decim < 3) return tezaKg + 0. Ustrezen podstopek bo:  Vzamemo težo v celih kg in pogledamo prvo decimalko decimalnega dela  Če je med 3 in 7.05. // ţe ima predpono else this.masa. Glavni razlog.0 RAZRED ZAJEC – POVEJTEZO NA 0. prištejemo k celim kg 1. ki ga nastavimo v konstruktorju! Tudi v konstruktorju preverimo.0.5  Če je več kot 7.502  2.

"Komercialno" zanimiva bi bila še metoda. S temi metodami določimo  odzive objektov  "znanje objektov" Če se na primer spomnimo na objekte tipa string:  Znajo povedati. če so enaki nekemu drugemu nizu: Zato bomo tudi v "naših" razredih sprogramirali znanje objektov določenega razreda s tem. "februar". "november". če ga je smiselno // napojiti. "december"}. ki bosta sprejeli bodisi številčni ali pa opisni podatek.mesec]. "marec". "maj". Prej (glej stran 37) smo ugotovili. da bo zajec znal povedati svojo vrednost. "oktober". Katere bodo te metode je pač odvisno od načrtovane uporabe naših razredov. čeoprav jo interno hranimo točno. Npr. "avgust". da bomo "ujeli" naslednjih pol kg // dejanska teţa je večja od "izmerjene" return (this.masa – this. če mu povemo ceno za kg žive teže. kje se v njih začne nek podniz: o   "niz".IndexOf("i") nekNiz. da podatke o mesecu hranimo kot niz.C# .PovejTezo().Equals("Lokar") Znajo vrniti spremiti črke v male in vrniti nov niz: o o Znajo povedati.povejTezo() > 0). Seveda so potrebne še spremembe v drugim metodah. uporabnik bo verjetno želel imeti metodi NastaviMesec. če je smiselno zajca tik pred tehtanjem (in prodajo) pošteno napojiti. } public bool MeNapojiti() { // ugotovimo. A uporabniku bi jih še vedno raje "servirali" kot februar in ne kot 2. NET 52 Zgled – razred Datum Kot primer oblikovanja pogleda na podatke si oglejmo še razred Datum. } Metoda ToString Poglejmo si naslednji program: Programiranje 1 – VSŠ Informatika . ki bi vrnila true.Spomnimo se namreč. Kot enostaven zgled recimo. "julij". da ni smiselno. "september". Ostale metode Poleg get/set metod in konstruktorjev v razredu napišemo tudi druge metode. RAZRED ZAJEC – 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: DODATNE METODE public double Vrednost(double cenaZaKg) { // pove vrednost zajca // zajce tehtamo na dogovorjeno natančnost return cenaZaKg * this. return imenaMesecev[this. da bomo napisali ustrezne metode. Zato bi metoda KateriMesec() bila lahko taka RAZRED DATUM – KATERIMESEC 1: 2: 3: 4: 5: 6: public string KateriMesec() { string[] imenaMesecev = {"januar". "junij". } "april". da težo zajcev uporabnikom povemo na pol kg natančno. saj objektov ne potrebujemo samo kot "hranilnikov" podatkov.toLower() mojPriimek.

. Console.Write("Press any key to continue . da v razredu. "). da ta metoda vedno obstaja. se metoda pokliče avtomatično.ToString() + "!". dejansko pomeni string niz = "Zajec " + zeko.PovejSerijsko().ReadKey(true). Namreč. Radi bi kakšne bolj smiselne informacije. A s pretvorbo nismo ravno zadovoljni. če na določenem mestu potrebujemo niz. kot na primer pri konstruktorjih? Zadeva je malček drugačna in jo bomo pojasnili v nadaljevanju.) pretvorijo v niz. saj je v razredu Zajec nismo napisali. double . sami napišemo metodo ToString. Zaenkrat bodi dovolj kle to. Od kje pride ta metoda. omogoča metoda ToString. } Programiranje 1 – VSŠ Informatika . NET 53 IZPIS OBJEKTA using System. In če napišemo string niz = "Zajec " + zeko + "!". in se torej po potrebi pretvorijo v niz. namespace Izpis { class Program { public static void Main(string[] args) { Zajec zeko = new Zajec(). zakaj? Očitno objekte lahko tudi izpišemo. na zaslon dobimo Od kod. ki ga definiramo (recimo Zajec). } } } Če ga izvedemo.C# . Torej string niz = "Zajec " + zeko + "!". prevajalnik tudi nič ne protestira. Gre spet za eno od tistih "čarovnij". Obnašanje. . Console..WriteLine("To je zajec: " + zeko). Metoda je nekaj posebnega. objekti .. ki smo ga opazili (da se števila. To storimo tako. Če to storimo. using MojaKniznica. Torej se tudi objekti "obnašajo" tako kot int. . in zaženemo isti program: V razred Zajec smo napisali METODA TOSTRING public override string ToString() { return "Zajec: " + this.. Console. tudi če je ne napišemo in omogoča pretvorbo poljubnega tipa v niz. saj se lahko "pokliče kar sama". a naletimo na objekt. ki jo počne prevajalnik.

Uporabiti jo moramo zaradi "dedovanja".C# . Če želimo napisati svojo metodo. string niz2 = "Zajec " + zeko + "!". da metoda ToString obstaja tudi. tudi če je ne napišemo. da smo z dedovanjem avtomatično pridobili metodo ToString. zato jo praktično vedno napišemo sami. da je ta metoda vedno na voljo v vsakem razredu. Celotni razred Zajec Oglejmo si sedaj celotno kodo razreda Zajec s spremembami. // vsem zajcem na začetku določimo m. kaj vse smo opravili:  Pripravili smo nekaj konstruktorjev      Zaščitili smo dostop do podatkov (private) Napisali smo ustrezne metode za spreminjanje podatkov o objektu Napisali smo metode za poizvedovanje po vrednosti podatkov Napisali smo metodo ToString.PovejSerijsko() . // in tehtajo 1kg Programiranje 1 – VSŠ Informatika . Več o tem. Če torej napišemo string niz1 = "Zajec " + zeko. } je v tem. string niz3 = "Zajec " + zeko. metoda ToString pa se kliče avtomatsko (če je potrebno). a povejmo. če jo ne napišemo. A verjetno z vrnjenim nizom nismo najbolj zadovoljni. kasneje. spol 479: this. na primer Opis. Razlika med METODA TOSTRING public override string ToString() { return "Zajec: " + this. S tem "povozimo " podedovano metodo. ki vrne opis objekta Napisali smo dve metodi.0. Spomnimo se. ki se imenuje enako kot podedovana metoda. NET 54 Opazimo novo neznano besedo – override. } in METODA OPIS public string Opis() { return "Zajec: " + this.masa = 1. To je razlog. ki smo jih naredili. kaj dedovanje je.PovejSerijsko() . so vsi trije dobljeni niz enaki! Zapomnimo si torej.spol = true. ki pomenita "znanje" objektov RAZRED CELOTNI ZAJEC 472: public class Zajec { 473: private string serijska. Seveda bi lahko napisali tudi neko drugo metodo. ki bi prav tako vrnila niz s smiselnim opisom objekta. 475: private double masa. 476: // konstruktor 477: public Zajec() { 478: this. da moramo metodo Opis poklicati sami. 474: private bool spol.ToString() + "!". moramo napisati besedico override.Opis() + "!".

return tezaKg + 1. // sprememba uspela } // v nasprotnem primeru NE spremenimo teţe // in javimo.serijska. this. // poklicali smo konstruktor Zajec() this.serijska.5 kg natančno int tezaKg = (int)this. } public double PovejTezo() { // teţo bomo povedali le na 0. } public Zajec (string serijskaStev) { this(). } public Zajec(string serijskaStev. bool spol. double masa) { this().SpremeniTezo(masa). } public bool SpremeniSerijsko(string seStev) { // sprememba dopustna le.C# .spol = spol.serijska = "NEDOLOČENO". da spremembe nismo naredili return false. // poklicali smo konstruktor Zajec() this. // uporabimo metodo za sprem.5. // ne smemo spremniti ţe obstoječe! } public bool JeSamec() { return this. if (decim < 3) return tezaKg + 0. } public bool SpremeniTezo(double novaTeza) { // smislena nova teza je le med 0 in 10 kg if ((0 < novaTeza) && (novaTeza <= 10)){ masa = novaTeza. return true. if (decim < 8) return tezaKg + 0. this. } public string PovejSerijsko() { return this. } // ker se spol naknadno NE spremeni.spol.Equals("NEDLOČENO")) { this. če serijske štev.0. metode za // spreminjanje spola sploh ne ponudimo uporabniku! public double Vrednost(double cenaZaKg) { Programiranje 1 – VSŠ Informatika .masa – tezaKg) * 10). int decim = (int)((this. NET 55 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: this.serijska = serijskaStev.serijska = seStev.masa.0. } return false.serijska = serijskaStev. return true. ni if (this.

214: } 215: } +  Ko sestavljamo razred.masa = 0. št.WriteLine("Teţa je spremenjena na " 210: + z1.Console.12).masa + 0. ki smo jih naredile.masa = z1.:" + z1.povejTezo() > 0). 200: z1. 208: if (z1.3)) 209: System. } } // Zajec Uporaba razreda Zajec Poglejmo si. da razreda Zajec ne bi nikoli "zares" napisali tako.SpremeniTezo(z1. 201: z1.WriteLine("Zajec ima ser. 0.serijska). 199: z1. 211: else System. UPORABA NOVEGA RAZREDA ZAJEC 205: public class ZajčnikNov { 206: public static void Main(string[] ar) { 207: Zajec z1 = new Zajec("1238-12-0".12.PovejSerijsko()). št.3.spol = false. če ga je smiselno // napojiti. 203: } 204: } Z novim razredom Zajec seveda se način uporabe povsem spremeni.WriteLine("Zajec ima ser. 202: System. NET 56 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: // pove vrednost zajca // zajce tehtamo na dogovorjeno natančnost return cenaZaKg * this.masa – this.Console.Console. saj ne moremo pričakovati. kako opravljene spremembe vplivale na uporabo rezreda Zajec v uporabniških programih. } public bool MeNapojiti() { // ugotovimo. 213: System. da bodo tako drastične spremembe.Console. da bomo "ujeli" naslednjih pol kg // dejanska teţa je večja od "izmerjene" return (this. } public override string ToString() { return "Zajec: " + this.:" z1.PovejTezo() + 0.PovejSerijsko(). pustile uporabniške programe nespremenjene. Še enkrat povejmo.serijska = "1238-12-0“. kot objektne spremenljivke lahko uporabimo tudi spremenljivke istega razreda Programiranje 1 – VSŠ Informatika . Prej so bili ti takšni: UPORABA STAREGA RAZREDA ZAJEC 195: public class Zajčnik { 196: public static void Main(string[] ar) { 197: Zajec z1 = new Zajec().C# .PovejTezo(). kot smo ga po starem (z javnimi spremenljivkami). 198: z1.WriteLine("Teţa je nespremenjena!" 212: + " Prirastek je prevelik! Preveri!"). false.PovejTezo()).

NET 57  Npr.serijska = "NEDEOLOČENO".  this.  private Zajec oce.mama = new Zajec()..  mama = null.  .  private string serijska.: starsi Zajca  Razred Clan  public class Clan {  private string ime. ki bi lahko določili ustavitveni pogoj  "Privzeti" zajec ne pozna staršev  oce = null.masa = 1.  Rekurzija brez ustavitve  Tudi konstruktor je metoda  Ustavitveni pogoj  A pri konstruktorju brez parametrov ni parametrov. morata starša ţe obstajati  Ju nima smisla ustvarjati na novo Programiranje 1 – VSŠ Informatika .  private Clan gaJePriporocil..  this.0. Še konstruktor  Sestavimo privzeti konstruktor  public Zajec() {  this.C# .  Če malo pomislimo – ko zajca "naredimo". A ob poskusu  Zajec rjavko = new Zajec(). je vse v redu.  this.oce = new Zajec().  Ţelimo hraniti tudi starše zajca  public class Zajec {  private double masa.  this. }  Ko stvar prevedemo.  private zajec mati.spol = true.  private bool spol.

Kako se tega lotimo? Skica postopka z opombami bi bila: o Analiza:  Pa ne matematični predmet  Katera so stanja/lastnosti:  Kaj hočemo o objektih te vrste vedeti  Kakšne lastnosti imajo  Katere so metode:  Kakšno je “znanje” objektov  Na katere “ukaze” se odzovejo o Predstavitev razreda (priprava class)  Način predstavitve lastnosti objekta (podatke o objektu) skrijemo:  private  enkapsulacija  Odločitev o načinu predstavitve  Pisanje metod o Preverjanje delovanja posameznih metod  Pisanje testnih programov. ali se posamezna metoda obnaša na predpisan način o S pomočjo ustreznih orodij izdelamo dokumentacijo (na podlagi dokumentacijskih komentarjev) Najprej torej pošteno proučimo naš problem in analiziramo zahteve. kaj hočemo o objektih vrste Kovanec vedeti – torej kakšne podatke bomo o posameznem kovancu hranili. če ustrezen razred že obstaja v standardnih knjižnicah jezika C#. s katerimi preverimo. Morda je kdo drug pripravil knjižnico.zgled Ustvarjanje objektov Razred je šablona. ki jih mora izpolnjevati razred Kovanec. In ta naslov bomo shranili v a. s katerim rešujemo problem. Z ustvarjanjem razredov si pripravljamo sestavne dele. NET 58 Gradnja razredov . Za besedo instanca obstaja čisto lep slovenski izraz – primerek. Seveda premislek o možnih metodah lahko vpliva tudi na to. s pomočjo katerih bomo reševali nek problem. Šele new bo naredil objekt in vrnil naslov. če na tržišču ni niti približno ustreznega razreda. pa na podlagi teh pripravljenih načrtov (razredov) ustvarimo primerek razreda – konkretni objekt. a je ime spremenljivke. da objekt s tem še ne obstaja. Potrebujemo torej razred Kovanec. objekta ni in ga seveda ne moremo uporabiti. Ko pa sestavljamo program. Po nekajmesečnih pogovorih ugotoviš. kjer bomo hranili naslov objekta vrste NekiObjekt. Spremenljivka a je samo ime objekta. kaj bi z objekti vrste Kovanec radi počeli – torej kakšne metode naj bi lahko izvajali nad objekti te vrste. a to je nepotrebno "pačenje" slovenskega jezika. da bomo v programih potrebovali objekte vrste Kovanec. Dokler new ne uporabimo. Med drugim bo potrebno nakovati nove kovance. Potem ugotovimo. Ne pozabimo. Če torej napišemo NekiObjekt a. šablono po kateri bomo ustvarjali objekte. katere podatke bomo o kovancih hranili. Primerek razreda (konkretni objekt) ustvarimo ga z new. da začeno pisati načrt objekta. kje ta objekt je. se splača pogledati okoli. Pogosto bomo prebrali.C# . oziroma natančneje . Ko torej napišemo class gre za to. Problem Banke Butale Banka Butale se intenzivno pripravlja na prihod nove valute arve. Takrat moramo narediti razred sami. ki definira spremenljivke in metode skupne vsem objektom iste vrste. Programiranje 1 – VSŠ Informatika . Kaj pa. v kateri je iskani razred. da je objekt instanca nekega razreda. Če ga tam ni. Za ustrezno informacijsko podporo kovačnici najamejo tebe. Kaj pa sedaj? Kako do svojega razreda Najlažje je. Prvenstveno moramo ugotoviti. ki predstavlja algoritem.

. da uporabnik mere lahko zve.polj . ki to dokumentacijo avtomatično ustvarijo na podlagi dokumentacijskih komentarjev. Torej vedeti moramo kje in kako bomo podatke (polmer. Sedaj se moramo odločiti o načinu predstavitve podatkov. Anjprej se moramo odločiti. Kakšne bodo spremenljivke (kakšnega tipa). da vemo. ki nastavijo in vrnejo vrednosti lastnosti in za pretvorbo v niz. v akterih hranimo podatke o objektu. Naredimo analizo:  Ugotovimo. kjer točno opišemo parametre vseh metod. s katerim predstavimo kovance v obliki.. Praviloma vse spremenljivke.komponent . koliko jih bo . Ko smo se odločili o načinu predstavitve lastnosti. public class Razred { // deklaracija lastnosti . Za zunanje uporabnike jih napravimo nevidne z določilom private. Pa tudi tu še ne pride takoj na vrsto kodiranje. kako bo videti tipični razred.. višina) hranili. V drugem programu (ki pa je tudi razred. da je v razredu tudi metoda Main.. Denimo. a se največkrat držimo prav takega. a kot zelo pomembno zadevo.. ki ga bomo sestavljali.) pa pač objekte pripravljenih razredov uporabljamo. NET 59 Ko smo z analizo končali. Pri pisanju komentrajev soi pomagamo z orodji. Ko smo končali. objektnih metod . Ker se mere kovancev lahko spreminjajo in ker je smiselno. tip rezultata ter namen posamezne metode. ki jo uporabljamo za preverjanje delovanja razreda. Razred naj bo pač načrt za objekte nekega tipa. A načeloma to ni najbolje. da so to vedno cele vrednosti. kako bomo željene podatke hranili. Poleg konstruktorjev in standardnih metod. 219: private int visina. kot jih bomo potrebovali za butalsko banko. KOVANEC - SKICA 216: public class Kovanec { 217: 218: private int polmer. da so kovanci okrogli.C# . bomo pripravili tudi dve set in dve get metodi. int v) {} 224: 225: // "SET" metode 226: public void NastaviPolmer(int r) { } 227: public void NastaviVisino(int visina) { } 228: 229: // "GET" metode Programiranje 1 – VSŠ Informatika . "skrijemo".. Okostje razreda Oglejmo si. pa pripravimo še dokumentacijo o razredu. // konstruktorji // metode // ToString } Razred Kovanec Sestavimo sedaj razred Kovanec. dobro preverimo delovanje vseh metod. z danim polmerom in višino. 220: 221: // konstruktorji 222: public Kovanec() {} 223: public Kovanec(int r. Pohosto sicer vidimo. zato se odločimo kar za dve celoštevilski spremenljivki. kar "zamegljuje" sliko. Pripravimo skico razreda. Vrstni red sicer ni pomemben. se lotimo pisanja ustreznih metod.. se lotimo pisanja razreda. Na koncu. a brez komponent. To seveda ni edina možna odločitev.. ki vrneta površino in volumen kovanca. kjer bomo vsebino metod izpustili. naj razred pozna še metodi.

Programiranje 1 – VSŠ Informatika .PovejVisino().PovejPolmer() + “\nvisina = “ 272: + this. ali je uporabnik te metode navedel smiselne parameter.visina = visina. Če parameter ni v teh mejah. 268: } 269: 270: override public string ToString() { 271: return “r = “ + this.C# . 252: } 253: 254: public void NastaviVisino(int visina) { 255: // smiselna visina je le med 1 in 100 256: // drugace jo pustimo pri miru 257: if ((1 <= visina) && (visina <= 100)) 258: this. 244: 245: // konstruktorji 246: public Kovanec() {} 247: public Kovanec(int r. int v) {} 248: 249: // "SET" metode 250: public void NastaviPolmer(int r) { 251: polmer = r. Pri slednji smo preverili. Denimo. potem metoda ne spremeni stanja objekta. Zato metoda to preveri. 243: private int visina. 264: } 265: 266: public int PovejVisino() { 267: return visina. 259: } 260: 261: // "GET" metode 262: public int PovejPolmer() { 263: return polmer. Iz analize problema vemo. NET 60 230: 231: 232: 233: 234: niz 235: 236: 237: 238: 239: 240: } public int PovejPolmer() { } public int PovejVisino() { } // tostring overide public string ToString() { } // kako je objekt “videti” kot // "znanje" public double Volumen() { } public double Povrsina() { } Lotimo se pisanja metod. da je smiselna višina kovancev med 1 in 100. 273: } 274: } Primerjajmo metodi NastaviPolmer in NastaviVisino. da napišemo nekaj takega: KOVANEC – DEL METOD 241: public class Kovanec { 242: private int polmer.

saj je arhitekt. In če smo dostop do lastnosti polmer povsod izvajali preko metode PovejPolmer() ustrezno spremembo napravimo le na enem mestu. V prvi vrstici piše r – xx. le navzven naj se "pretvarja" da je dvakrat večji) . ki reši naslednji problem.Opazimo tudi. To sicer ni potrebno in bi metodo lahko napisali tudi kot METODA TOSTRING 1: 2: 3: 4: Z NEPOSREDNIM DOSTOPOM override public string ToString() { return “r = “ + this.Volumen(). Torej neprevidni programer lahko "naredi kovanec" z negativnim polmerom. 287: else 288: System. NET 61 Pri metodi NastaviPolmer pa zgolj vrednost parametra zapišemo v spremenljivko in s tem spremenimo lastnost objekta. kot jih naredi konstruktor Kovanec()). da napišeš program.polmer + “\nvisina = “ + this. 285: if (volumenKvadra > n * volKovanca) 286: System. 2 Lahko pa in si s tem zagotovimo možnost nadaljnih "izboljšav" (in novih zaslužkov) Programiranje 1 – VSŠ Informatika .. v drugi pa visina – xxx. da bo javljal 2x večji polmer (podatek o polmeru naj bo v objektu za vsak primer zapisan kar pravi. da bodo vrli butalski kovači že nekako nakovali n kovancev in odgovorimo DA. 282: int n = int. Kovino za izdelovanje kovancev imajo v kovnici obliki enega samega velikega kvadra z merami 20 x 12 x 30 (za več ni prostora. Povprašajmo ga. jih zanima. “običajni” kovanec. 281: Console. Če n kratnik volumna presega volumen kvadra. Z new Kovanec() ustvarimo nov.m ki pove. 278: int kvader_y = 12.. je problem njihove državne kovnice.WriteLine("NE").Console. 280: int volumenKvadra = kvader_x * kvader_y * kvader_z. .C# . odpadke spet zlijemo skupaj in ponovno kujemo. vemo. Vemo. da "popraviš" razred Kovanec tako. Uporaba razreda Kovanec Prvi problem. 283: Kovanec en = new Kovanec(). da se Butalci pogosto radi malo postavijo nasproti Veržejcem. Zato bi radi imeli program. ko (ki je povsem slučajno isti kot arhitekt neke fakultete) je risal načrte za kovnico pozabil na skladišče. Vsekakor pri "pravem 2 programiranju" metode ne bomo napisali na ta način. } Torej z neposrednim dostopom do spremenljivk. Pri metodi za opis objektov vrste kovanec smo se odločili. 279: int kvader_z = 30. UPORABA RAZREDA KOVANEC 275: public static Drzava { 276: public static void Main(string[] a) { 277: int kvader_x = 20. da s kovanjem takšnega števila kovancev ne bo nič in dogovorimo NE. Ko Banka Butale potrebuje nekaj kovancev. če metodo napišemo na prej predstavljeni način.  ne: nikakor to ne gre  da: mogoče. 284: int volKovanca = en. In ker se Veržejci hvalijo. To lahko naredimo. V nasprotnem pa ostaja upanje. A je vseeno boljše. ki ga moraš rešiti za butalsko banko.Write("koliko kovancev potrebujemo: "). Državna kovnica želi. ali lahko naredimo n "običajnih" kovancev (torej takih.Parse(Console. Po e-pošti dobiš zahtevo. A če ga "razumemo prav" in upoštevamo da lahko kvader potem tudi malo preoblikujemo. da do vrednosti polmera dostopamo preko metod. da je smielen opis objekta dvovrstični. če bodo iz tega kvadra res lahko izdelali željeno število kovancev.ReadLine()). ni pa nujno Program bo enostaven.Console. kjer je namesto xx seveda ustrezna vrednost. saj smo znotraj razreda.WriteLine("DA"). Poleg tega moram. da so njihovi kovanci precej večji.o odgovore programa (DA/NE) pravilno tolmačiti. Problem sploh ni lahek. koliko je njegov volumen. jim Butalci ne bodo ostali dolžni.visina.

da pripravimo ustrezne metode. // stranica a private int b. Se še spomnimo. V uporabniške programe. torej tiste. kaj za nas kvader sploh pomeni.  Metode za ravnanje s podatki  Nastavi podatek  Vrni podatek  ToString Kvader – podatki Kvader kot geometrijsko telo je podan z dolžinami vseh treh stranci.. ki uporabljajo objekte določenega razreda. da vzamemo tabelo s tremi polji. ne da bi s tem "trpeli" obstoječi programi. kjer spremenimo delovanje konstruktorja brez parametrov. V njih bomo lahko tudi preverjali smiselnost podatkov. Odločiti se moramo torej kako bo imel objekt predstavljene stranice. da uporabniki tega razreda niso prizadeti ob morebitnih spremembah razredov  Glave metod pustimo enake (podpis + tip rezultata + način dostopa)  Uporabniški programi ostanejo enaki  Potrebujejo le nove dll datoteke razreda  Za uporabnika se s tem ne spremeni nič! Zgled . Zato bomo o njem hranili le njegove mere. Je potrebno spremeniti program? Kje so potrebne spremembe? Spremembe v programu niso potrebne. je vseeno. Kako pa potem pridemo do podatkov? S tem. Potem moramo pripraviti ustrezne metode za ravnanje s podatki ter predvideti "znanje " objektov. da podatke predstavimo kot niz oblike "a x b x c".. Spet četrta možnost . ki bo opisoval kvadre.C# .. A ne mine leto. // stranica c Vendar bomo razred sestavljali tako. Popraviti je potrebno seveda razred Kovanec. da ga potrebujemo zgolj kot geometrijsko telo. Če se pri spremembi razreda podpisi metod ne spreminjajo – ni težav s spreminjanjem razreda:  Vsi programi. Spet tretja. V našem zgledu se bomo odločili kar za prvo možnost. Z enkapsulacijo tem smo si omogočili tudi morebitno naknadno spreminjanje razreda. Skica našega razmišljanja bo torej: o Geometrijsko telo o Podatki  Komponente  opisujejo stanje objekta o Metode  Konstruktorji (posebne metode)  Kaj se zgodi ob new  “znanje” objektov tega razreda  volumen. Uporabili bomo torej private int a. v Butalah so nad njim navduzšeni. Denimo. . da uporabniški programi pri mrebitni kasnejši spremembi načina predstavitve podatko v ne bodo prizadeti. Najprej nas spet čaka analiza problema. ki razred Kovanec uporabljajo. Druga možnost bi bila. si podatke izmenjujejo le preko metod  Če se klic ne bo spremenil.. da uporabimo 3 spremenljivke tipa int. // stranica b private int c.? Način predstavitve uporabnika NE zanima – s private mu preprečimo dostop. Odločiti se moramo. Ena od možnosti je. ki ta razred uporavljajo.razred Kvader Naša naslednja naloga je sestaviti razred. ko državni zakladnik spremeni dimenzije "običajnih" kovancev. zakaj se s private "gremo" kapsuliranje (enkapsulacijo). A to je vse. NET 62 289: 290: } } Program je napisan. kako je spremenjen razred! Programiranje 1 – VSŠ Informatika . se ni potrebno vtikati! Razrede sestavljamo tako. površina.

za katerega sestavljamo razred. ker je prevajalnik sam namesto nas pripravil konstruktor brez parametrov. ki naredi kocko   Konstruktor. Vse te odločitve (kaj storimo ob napšačnih podatkih) pa dobro dokumentiramo v dokumentaciji. Programiranje 1 – VSŠ Informatika . za katere je smiselno.Tudi tu je vprašanje. da potem podatek objekta spremenimo na neko vnaprej določeno vrdnost . b = 1. da objekt ob klicu 3 konstruktorja še nima nastavljenih smiselnih podatkov .C# . da je vrstni red metod v razredu povsem poljuben. Tak konstruktor naredi “privzeti” objekt. da se zanašanje na to. da bodo shranjeni podatki smiselni. Če želimo narediti drugačen kvader. za katere je smiselno. Pri tem ne smemo pozabiti. Denimo. ki smo jih imeli. RAZRED KVADER doloceni konstrukcijski prijemi 291: public class Kvader { 292: // z /* . takoj nastavljene privzete vrednosti. Na ta način želimo opozoriti. lče privzete vrednosti opisujejo "legalno" stanje objekta. vnaprej dogopvorjenimi (in v dokumentaciji dobro opisanimi) vrednostmi. kjer podamo stranice Konstruktor. da bi v primeru napačnih poarametrov v konstruktorju ne naredili nič. ki spreminjajo podatke. pač naredimo osnovni kvader in mu z ustreznimi metodami spremenimo stranice. Še posebej pa moramo biti pazljivi na to. pa pripravimo metode. Kaj pa. običajno ne konča najbolje. če podatek ni smsielene. napišemo metode. kaj lahko pričakujejo. */ so oznaceni komentarji za razlago zakaj 293: // v "pravem" razredu jih ne bi bilo! 294: 3 Rsnici na ljubo imajo vse komponente. če je podatek smiselen. da skoraj vedno pripravimo konstruktor brez parametrov. . da mora tudi konstruktor poskrbeti.. ki opisujejo objekt. Ustrezni konstruktor bo KONSTRUKTOR public Kvader(){ a = 1. Z njimi najpogosteje nastavimo začetne vrednosti podatkov v objektu. če bi uporabniku radi ponudili več možnosti “začetnega” kvadra? Denimo  Konstruktor. Sem in tja bomo kodo prekinili z razlago. kot niz. da podatka enostavno ne spremenimo in morda to javimo. V našem razredu bomo napisali metode oblike PovejA(). Tako se na primer lahko odločimo. je odvisno od namena. Ob tem običajno preverimo. ki bi vrnila ta podatek. c = 1. da bo za nekaj poskrbel prevajalnik. Včasih določenih podatkov sploh ne bomo "pokazali" upotrabniku. A do sedaj smo se že naučili. V njem smo napisali cel kup komentarjec. .. … Kvader – konstruktorji K metodam. ki povejo vrednost podatka. amapak zamenjamo napačne vrednosti parametrov z nekeimi. Že pri razlagi uporabe konstruktorjev smo omenili. NET 63 Kvader – metode za delo s podatki Za podatke. ki spremenijo vrednost podatka. preko izhodnega rezultata tipa int ali bool. V tem primeru pač ne napišemo nobene get metode. Spomnimo se le težav. Kaj pa naredimo. da smo lahko pripraili ustrezne komentarje. le zato.. da jih uporabnik vidi. na določen način spadajo tudi konstruktorji. Pri tem lahko prikaz podatkov oblikujemo (npr. določene zadeve smo po nepotrebnem pisali drugače. Lahko v primeru napačnih podatkov privzamemo.... da je naš privzeti objekt– kvader s stranicami: 1 x 1 x 1. vrnemo podatek le na eno decimalno mesto. } BREZ PARAMETROV Načeloma ta konstruktor zadostuje. da jih uporabnik spremeni. … Za podatke. Zato si običajno ne privoščimo tega. V našem razredu bomo napisali metode oblike StranicaA(). Opazili boste.). ki naredi kopijo objekta Navedimo sedaj kar celoten razred. Tako bodo uporabniki tega razreda vedeli. da smo namenoma malo premešali vrstni red.

Navada je. da uporabnik neposredno vidi ti dve kolicini .MIN_DOL_STR Gre za razredno spremenljivko . če bi jih uporabniku radi predstavili drugače (prego get metod) ali jih pred njim skrili. private int c. zato private */ // preverimo. 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: /* Ker menimo. } Tu smo napisali pomožno metodo. da metoda za uporabnika ni uporabna. s tem povemo. ko bomo na dolgo govorili o statičnih (razrednih) podatkih. // maksimalna dolzina stranice public const int MAX_DOL_STR = 100. ki preveri. lahko pa rečemo. Če pred spremenljivko ob deklaraciji napišemo const. da vrednosti.dostop public. smo jo s private pred njim skrili. če je podatek v mejah. Ker smo ocenili. ki vsebuje same velike črke.več kasneje */ // vrni podatek public int PovejA() { /* omogocimo uporabniku dostop do vrednosti zanj zanimivih podatkov */ return a. } private bool Kontrola(int x){ /* pomozna metoda. Gre za tako imenovane razredne (statične) podatke . kako imamo shranjene podatke */ private int b. ne gre za lastnost posameznega razreda .C# . kot jih določata konstanti.1 kopija za vse objekte. da gre za konstanto. ce velja MIN_DOL_STR <= x <= MAX_DOL_STR return ((MIN_DOL_STR <= x) && (x <= MAX_DOL_STR)). To pomeni. da jih poimenujemo z imenom. } public int PovejB() { return b. // minimalna dolzina stranice public const int MIN_DOL_STR = 1. da je smiselno. NET 64 295: 296: 297: 298: 299: 300: 301: 302: 303: private int a. potem ne moremo več spreminjati. Tako je ne more uporavljati in je na voljo izključno znotraj tega razreda. Tudi konstante so lahko javne ali privatne. } public int PovejC() { return c. 331: 332: // nastavi podatek Programiranje 1 – VSŠ Informatika . Seveda pa. da obstajajo neodvisno od obstioja kakšnega primerka in da do njih dostopamo (če so public) z ImeRazreda. saj so konstante. da so to lastnost razreda (in jih napišemo izven vseh metod. Spreminjati ju ne more zaradi const. lahko uporabimo private. saj jih uporabnik tako ali tako ne more spreminjati. To pomeni. /* uporabnika ne zanima.IME_KONSTANTE Več o tem v razdelku. tja kot objektne spremenljivke. Pogosto jim določimo javni dostop. ki jo priredimo ob deklaraciji. Lahko jih pišemo lokalno (znotraj metod). Dostop: Kvader.

. } //. ki jo sicer vrne kot vrednost izraza. kot je if (Kontrola(s)) /* na ta nacin bi verjetno "zares" sprogramirali tudi zgornji metodi */ c = s. //drugace pustimo // taksnega. še stranski učinek.. //ga postavimo na 1 a = b = c = s....b = a..... kjer smo tudi naleteli na prireditveni izraz.. da spremenjlivko nastavi na to vrednost.. da smo namesto napačne vrednosti kar sami določili ustrezni podatek (1). /* this v nasprotju s prejsnjo metodo tu ni potreben.a = a. če podatek ni // v redu ..... kot je if (Kontrola(a)) this.. int s2.npr. drugace pustimo // taksnega..... da vrne vrednost. Ta je. // ce podatek ni v mejah.C# ... //ga spremenimo...... je to izraz.. Če se spomnimo iz poglavja o datotekah. } Tu smo spet enkrat za spremembo uporabili kombinacijo prireditvenega stavka in prireditvenega izraza. s */ } public void StranicaC(int s) { // Ce je podatek v mejah med 1 in 100. int s3) { // kvader s1 x s2 x s3 Programiranje 1 – VSŠ Informatika .. // ga spremenimo.kocka z robom 1 if (!Kontrola(s)) s = 1.. drugace pustimo // taksnega. 371: 372: 373: 374: 375: 376: public Kvader(int s) { // kocka s stranico s. kot je if (Kontrola(a)) this.. /* this je potreben. Konkretno vrstica 79 vse tri stranice nastavi na 1. ki ima poleg tega. Neklaj takega moramo storiti.. da so privzete vrednosti v jeziku C# ustrezne za naš razred). ga spremenimo.. se vedno pa velja.. da locimo med imenom podatka objekta in parametrom a */ /* verjetno bi bilo bolj smiselno namesto a parameter poimenovati s ali kako drugače */ } public void StranicaB(int a) { // Ce je podatek v mejah med MIN_DOL_STR in MAX_DOL_STR. NET 65 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: public void StranicaA(int a) { /* omogocimo uporabniku spreminjanje podatkov */ // Ce je podatek v mejah med MIN_DOL_STR in MAX_DOL_STR.. da bi bilo boljse... 377: public Kvader(int s1... // konstruktorji public Kvader() { a = b = c = 1. } Tu vidimo. da bi parameter a poimenovali drugace . saj konstruktor mora nastaviti podatke o objektu na neke smiselne vrednosti (in jih ne moremo kar pustiti nenastavljen – oziroma upati....

Posamičnim lastnostim objekta vedno določimo privatni način dostopa (da so torej dostopni le metodam znotraj razreda). A ne pozabimo. 411: /* tudi znotraj razreda se splaca uporabljati metode za 412: delo s podatki 413: ceprav imamo neposreden dostop do spremenljivk. kje je tukaj new. 402: 403: // 404: // --------------. /* this ni potreben */ StranicaB(sk. Konkretni objekt je primerek nekega razreda . /* ceprav imamo neposreden dostop do spremenljivk. ki "skrije" uporabo operatiorja new! Podobno je pri tabelah ko uporabimo inicializacijo začetnih vrednosti.to string 405: // 406: override public String ToString(){ /* prekrivanje metode iz razreda 407: Object */ 408: // Metoda vrne podatek v obliki Kvader: a x b x c 409: return "Kvader: " + PovejA() + " x " + PovejB() + " x " 410: + PovejC(). gre le drugačen zapis.a = sk. da uporabnika ne zanima način hranjenja lastnosti objekta. S tem tudi omogočimo tudi bolj kontrolirano delo s podatki v objektu. napštetih v zavitih oklepajih. Torej se je objekt ravnokar naredi (prav z new) in mi le nastavljamo njegove podatke. Ko smo v enem od prejšnjih zgledov sestavljali metodo. // ga postavimo na 1 a = s1. if (!Kontrola(s2)) s2 = 1. // ce podatek ni v mejah. A dejansko ne gre za izjemo. To povemo tako. Nastane z new. NET 66 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: // Ce kak podatek ni v redu . } public Kvader(Kvader sk) { // Novi objekt je kopija // obstojecega objekta sk this. // ce podatek ni v mejah.c).C# .b). da ob deklaraciji napišemo private. V ta namen pripravimo metode za delo s podatki/lastnosti kot so :  VrniPodatek. smo še posebej poudarili. Izjema so na prvi pogled objekti razreda string. da smo v konstruktorju. saj 414: nam ob morebitni 415: spremembi predstavitve ni potrebno toliko popravljati! */ 416: } 417: } // class Kvader Ustvarjanje razredov in objektov: povzetek Nredimo sedaj povzetek vsega povedanega. // ga postavimo na 1 c = s3.a. ampak le smiselna uporaba objektov. NastaviPodatek Programiranje 1 – VSŠ Informatika . /* tudi znotraj razreda se splaca uporabljati metode za delo s podatki */ StranicaC(sk. ki vrne kopijo objekta. da ne smemo pozabiti na new znotraj metode. // ga postavimo na 1 b = s2. saj nam ob morebitni spremembi predstavitve ni potrebno toliko popravljati! */ } Morda se sprašujete. Razlog za to je v tem. // ce podatek ni v mejah. if (!Kontrola(s3)) s3 = 1.ga postavimo na 1 if (!Kontrola(s1)) s1 = 1.

Uporabljamo jo za “predstavitev” objekta. Seveda pa lahko metode izkoristimo.0 in 5. bool tip. } public Avto(string barvaKatera. večjih zapletov ne gre pričakovati. double velikost) { this. Avto Izdelujemo spletno anketo o priljubljenosti različnih avtomobilov. // true pomeni.tip = tip. se začno z določilom public. Ko pišemo metode.0. da imamo lahko več metod. // vsem privzetim avtom na začetku // določim tip limuzine this. razlikjejo pa se v seznamu parametrov. Metoda za nastavljanje velikosti avta naj poskrbi tudi za to.barva = barvaKatera. da bo velikost vedno ostala znotraj sprejemljivih meja! Če uporabnik poskusi določiti napačno velikost.tip = true.. Tiste. kaj se zgodi ob kreaciji novega objekta. katerih uporaba je namenjena uporabnikom. // in so 4 m veliki this. da so vsi podatki o objektu takoj nastavljeni na smislene vrednosti. s katerimi nastavljamo vrednost (set). Vsak naš razred naj bi imel tudi metodo ToString. Poleg metod za nastavljanje/vračanje podatkov in metode ToString imamo v razredu običajno še več drugih metod. da je kupe // konstruktor public Avto() { this. Programiranje 1 – VSŠ Informatika . get metode.i. Predvsem ori konstruktorjih smo uporabili tehniko preobteževanja (overloading). // false. Možna rešitev: RAZRED AVTO public class Avto { private double velikost. ki naj hrani tri osnovne podatke o velikosti (dolžini). vrnemo na drug način. morajo tudi ti poskrbeti. To so metode. Vse spremenljivke razreda morajo biti privatne. “interne” (pomožne) metode pa s private. ki povedo.0. barvi in o tipu (limuzina ali kupe): • velikost (dolžino): decimalno število med 4. Kot smo omenili. NET 67 V razredu moramo obvezno imet tudi konstruktorje. this. private string barva. Ker zaradi mehanizma dedovanja ta metoda avtomatično obstaja v vsakem razredu. Gre za to. Ta poskrbi. Prvenstveno podskrbijo.C# . Ne smemo pozabiti na ustreno preverjanje parametrov že pri pisanju konstruktorjev. da je novoustvarjeni objek v "smiselenem stanju") Pri metodah. private bool tip. bodisi avtomatično (če se na tistem mestu namesto objekta pričakuje niz) objekt pretvori v niz.barva = "nedoločena". ki jih v objektu hranimo na en način. da gre za limuzino. ne smemo pozabiti na preverjanje pravilnosti parametrov. da podatke. Stanje objekta mora biti ves čas pravilno. moramo na začetek dodati še besedo override.velikost = 4. Zgledi Ogledali si bomo nekaj postopkov pri katerih uporabimo objektno programiranje. V ta namen bomo sestavili razred Avto. s katerimi vračamo vrednost (t. ki se imenujeo enako. da se bodisi ob klicu. naj se obdrži prejšnja vrednost. • barvo: poljuben niz in • ali je avto tip limuzine ali kupeja. razred pa mora tudi poznati metode za nastavljanje in branje teh vrednosti.

SpremeniVelikost(velikost)) //če metoda spremeni velikost ni uspela //moramo "ročno" nastaviti velikost this. if (decim < 4) return velikostMetri + 0. } public string KaksenTip () { if (this.JeLimuzina()) return "limuzina". } public double PovejVelikost () { // velikost bomo povedali le na 0.velikost = 4. if (decim < 5) return velikostMetri + 0. } public string PovejBarvo () { return this. } public bool SpremeniVelikost (double novaVelikost) { //smiselna nova velikost je le med 4 in 5 metri if ((4 < novaVelikost) && (novaVelikost <= 5)) { this.velikost .0. return true.5. // metode za spreminjanje tipa sploh ne ponudimo uporabniku! // metoda ToString Programiranje 1 – VSŠ Informatika .barva = b. return velikostMetri + 4. } // ker se tip avta naknadno ne spremeni.velikost = novaVelikost.C# .barva. int decim = (int) ((this.0.velikost. return "kupe". da spremembe nismo naredili return false. } public void SpremeniBarvo (string b) { this.tip.velikostMetri)*10).0.5 metra natančno int velikostMetri = (int) this. // sprememba je uspela } // v nasprotnem primeru ne spremenimo velikosti in // javimo. NET 68 if (!this. } public bool JeLimuzina () { return this.

3m to sploh ni nujno možno. S tem smo ustvarili enak avto.JeLimuzina() + ".3). da je dolg 5m.SpremeniVelikost(a1. a1.WriteLine("Avto je barve: " + a1. ki predstavlja količino evrov v njej celoštevilsko spremenljivko. da bomo uporabnikom velikost avtomobila sporočali na pol metra natančno. Dodajmo še vrstico. Console. Program tudi izpiše.C# . Vrstica 6 postane a1. a1.5m Od kje pa to – ali ne znamo več računati? 4m + 0. ki vsebuje ime lastnika denarnice. kot bi bile spremenljivke. } Kaj je narobe s tem programom? V programu se obnašamo.tip = false. 4.SpremeniBarvo("rdeča").barva = "rdeča". – 5. In ker je torej za poizvedovanje po velikosti na voljo le ta metoda. Ker pa niso (so privatne (private)).barva). Z našim znanjem računstva ni nič narobe.8m. Pobrisali bomo tudi 3.0).5m.PovejBarvo() + " in je tipa: " this. kot so jih prej vrstice 3.3m z a1.PovejVelikost()). je v vsaki od vrstic od 4 do 7 kakšna napaka.PovejVelikost() + 0. ko ustvarimo nov objekt.5m. da smo rekli. vrstica 7 pa Console. Le pozabiti ne smemo.velikost = a1.PovejBarvo()). ki izpiše novo velikost avtomobila Console. Programiranje 1 – VSŠ Informatika . } } } //class Avto Uporaba razreda: Spodaj je naveden program. a1.").3m je vendar 4. Do ustreznih podatkov moramo dostopati preko metod. Popravimo program. bo njegova dejanska velikost 4.SpremeniVelikost(a1. S četrto vrstico ne bo težav a1. public static void Main(string[] args) { Avto a1 = new Avto(). vrstico zamenjali z Avto a1 = new Avto("rdeča". ki vsebuje tri komponente:    celoštevilsko spremenljivko.WriteLine("Avto je dolg: " + a1. – 5. ki ustvari en avto in mu naknadno podaljša dolţino za 30cm. Zato bodo potrebne malo večje spremembe. Sedaj lahko spremenimo velikost.3m in ne 4. saj se izpiše Avto je dolg: 4.3). In če sedaj avto podaljšamo še za 0. čeprav bo metoda PovejVelikost() sporočala.PovejVelikost() + 0. Tip avtomobilu lahko nastavimo le. ki opisujejo objekte tipa Avto javne (public). Denarnica Sestavi razred Denarnica. kakšne barve je avtomobil.velikost + 0. false. Naš avto je sedaj dejansko dolg (vsaj podatek je tak) 4.PovejVelikost() + "m. ki predstavlja količino centov v njej spremenljivko tipa String. NET 69 override public string ToString () { return ("Podatki o avtu so naslednji: Velikost je " + this.3. ima to lahko zanimive posledice. Kaj pa 5 vrstica? Ustrezne metode za spreminjanje tipa ni. smo preseneči. Tako če naš avto poskušamo povečati za 0. vrstico in 3. barva: " + this.WriteLine("Avto je barve: " + a1. Ko pa program poženemo.

//če smo vnesli negativno vrednost. } public Denarnica(int e. ki ustvari denarnico z e evri.NastaviEvre(e). this. } //set. ki ustvari tabelo desetih denarnic z naključno mnogo denarja. ki količino evrov in centov v denarnici postavi na 0 in ime lastnika na "NEZNANO" konstruktor. string l) { //konstruktor. this.evri = 0. S pomočjo metode izpiši to tabelo. ki sprejme količino evrov v denarnici if (e >= 0) {//količina evrov mora biti pozitivno število this.//pogledamo če so podani podatki smiselni this. manjša od 0. metoda nam vrne false } Programiranje 1 – VSŠ Informatika . ki vrne niz V denarnici. NET 70 Napiši vsaj dva konstruktorja:   prazen konstruktor. ki naj bo v denarnici. ki ustvari prazno denarnico brez lastnika this. } return false. c centi in lastnikom l this().evri = e.centi = 0. ki sprejme koliko evrov in centov naj bo v denarnici in ime lastnika Napiši metode get in set. Napiši tudi metodo ToString. naj se vrednost komponente ne spremeni. // naredimo prazno denarnico in jo // potem poskusimo napolniti this.če je količina denarja. private int centi.NastaviCente(c). //ostane število evrov enako kot prej. Napiši program. int c. this. katere lastnik je #ime_lastnika je #st_evrov evrov in #st_centov centov. get metode public bool NastaviEvre(int e) {//set metoda.lastnik = "NEZNANO".NastaviLastnika(l). return true. V set metodi za evre in cente preveri smiselnost podatka . Rešitev: public class Denarnica { //komponente private int evri. private string lastnik.C# . //konstruktorji public Denarnica() {//prazen konstruktor.

} return false. } public string VrniLastnika() {//get metoda. return true. shranimo niz l // v ime lastnika denarnice ter vrnemo true return true. ki vrne koliko evrov je v denarnici return this.evri. "Sara". "Aleš". "Samo".C# . // nam metoda ne nastavi lastnika. ki sprejme količino centov v denarnici if (c >= 0) {//količina centov mora biti pozitivno število this. ki izpiše podatke o denarnici return "V denarnici.". katere lastnik je " + this. else { this. "Jure"}. //tabela lastnikov.lastnik = l.Equals(""))//če smo vnesli prazen niz.centi. "Bor". "Mojca".//če niz l ni prazen. } //metoda ToString override public string ToString() {//metoda. vrne nam false return false. "Andreja".lastnik. "Anţe". ki sprejme ime lastnika if(l. } public int VrniCente() { return this. je " + this.VrniEvre() + " evrov in " + this.VrniCenti() + " centov. iz katere bomo jemali lastnike denarnic Programiranje 1 – VSŠ Informatika . //ustvarimo tabelo desetih denarnic string[] lastniki = {"Ana".centi = c. ki pove ime lastnika denarnice return this. } public bool NastaviLastnika(string l) {//set metoda.VrniLastnika() + ". NET 71 public bool NastaviCente(int c) {//set metoda. } } public int VrniEvre() {//get metoda. } } Še program public class TestDenarnica { public static void Main(string[] args) { Denarnica[] d = new Denarnica[10]. "Ema".

lastniki[i]). kot so vrsta.C# .toString()).Length) { Console. private string ime.Next(0. Ustvari objekt Zival s stirimi nogami vrste pes in imenom Pika. Vsebuje tudi konstruktor brez parametrov. while (i < 10){//ustvarimo i-to denarnico z lastnikom iz tabele lastniki in s poljubno mnogo denarja med 0 in 10 evri in 0 in 150 centi d[i] = new Denarnica( (int)(random. (int)(random.150)). private string ime. Programiranje 1 – VSŠ Informatika . while (i < t. ki vsebuje spremenljivke    private int steviloNog. OGRODJE RAZREDA ZIVAL: public class Zival { /*Razred predstavlja objekte tipa Zival.//izpišemo lastnosti denarnice i = i + 1. stevilo nog in ime zivali.WriteLine(d[i]. */ //objektne spremenljivke private int steviloNog. Vsebuje osnovne podatke o zivali.10)). } // izpis IzpiTabeleDenarnic(d). } public static void IzpisTabeleDenarnic(Denarnica[] t) { int i = 0. NET 72 Random random = new Random(). } } } Vaje Zival V ogrodju se nahaja razred Zival. ki postavi spremenljivke na smiselno začetno vrednost. /* Edini razredni konstruktor. i++. in metode za nastavljanje in spreminjanje le-teh. int i = 0.Next(0. private string vrsta. private string vrsta.

Izpišite jih! Programiranje 1 – VSŠ Informatika . ime = "Pika". ki naj izpiše podatke o objektih v obliki: #Ime: je vrste #vrsta in ima #steviloNog nog.C# .ime. Nato napišite testni program. public string VrniVrsto() { return this.vrsta = vrednost.*/ public void NastaviIme(string vrednost) { if(vrednost != null) { this. kjer ustvarite 5 živali in jim nastavite smiselno vrsto in imena ter število nog. } // Vrne ime zivali.steviloNog = vrednost.*/ public void NastaviSteviloNog(int vrednost) { if(vrednost > 0) { this. Pri tem seveda zamenjajte #vrsta in #steviloNog z vrednostmi v istoimenskih spremenljivkah. } // Vrne vrsto zivali. NET 73 */ public Zival() { steviloNog = 4.vrsta. vrsta = "pes". } /* Vrne stevilo nog zivali. } } /*Nastavi vrsto zivali. public string VrniIme() { return this.ime = vrednost.steviloNog. da bo stevilo nog vedno vecje od 0. */ public int VrniSteviloNog() { return this. } } } Naloga: Dopolnite razred z metodo override public String ToString(). } } /*Nastavi stevilo nog zivali. Zagotovljeno je. } /*Nastavi ime zivali.*/ public void NastaviVrsto(string vrednost) { if(vrednost != null) { this.

C# . drugega s konstruktorjem. 558: } 559: } 2. V spodnji kodi je napaka. v katerem ustvariš dva objekta tipa Kolega. ki vrne niz s smiselnim izpisom podatkov o objektu tipa Kolega (ime. Oba objekta tudi izpiši na zaslon. priimek in telefonska številka). ki vse tri komponente nastavi na "NI PODATKOV". ki sprejme tri parametre. int col) { 565: x = row." Naloge brez računalnika Sledeče naloge rešuj brez uporabe računalnika! 1. 555: 556: override public ToString() { 557: return "a = " + a + " b = " + b.3). Z NAPAKO KODA 552: public class X { 553: public int a = 0. prebere telefonsko številko in izpiše tiste objekte iz tabele. ki ima tri komponente:  ime  priimek  telefonska številka Vse tri komponente naj bodo tipa string in javno dostopne. Če takega objekta v tabeli ni. naj se izpiše: "Noben moj kolega nima take telefonske številke. Programiranje 1 – VSŠ Informatika . Poišči jo in jo odpravi. Preizkus razreda Kolega Sestavi testni program. 562: private int y. 567: } 568: } Kateri izmed spodnjih konstruktorjev je pravilen: a.  konstruktor. Napiši vsaj dva konstruktorja:  prazen konstruktor. ki sestavi tabelo 10ih objektov tipa Kolega. ki sprejme vse tri podatke in ustrezno nast avi komponente Napiši tudi metodo public string ToString(). 554: public int b = 2. ki imajo tako telefonsko številko. Dana je koda: 560: public class Y { 561: private int x. En objekt ustvari s praznim konstruktorjem. 566: y = col. NET 74 Razred Kolega Sestavi razred Kolega. Uporaba razreda Kolega Napiši program. 563: 564: public Y(int row. y1 = new Y(2.

y4 = new Y(). c. in sicer z1 = new Z(5. i++) 585: a[i] = a[i] + 2.Length.3). int bb) { 574: a = aa. f. NET 75 b. d. y3 = new Y. 572: 573: public Z(int aa. 4. y5 = new Y(10. če sta dva objekta »enaka« ? Namig: metoda equals. 571: private int b =0. y2 = new Y(2). 4). Dana je koda 569: public class Z { 570: private int a = 0.0. 3). y6 = new Y[5].  Ali lahko metodo »equals« takoj uporabiš v zgornji kodi. e. Dana je koda razreda Povecaj: 578: public class PovecajR { 579: public void Povecaj(int a) { 580: a++. i < a. Y(). 581: } 582: 583: public void Povecaj(int[] a) { 584: for(int i =0. jo odpravi! Kaj izpiše sledeča koda? 588: 589: PovecajR inc = new PovecajR().  Kakšno vrednost nam vrne test z1 == z2 ? Trditev obrazloži. 3.C# .0. 4) ter z2 = new Z(5. d. Programiranje 1 – VSŠ Informatika . 3). y2 y3 y4 y5 y6 = = = = = new new new new new Y(2). b. f. 576: } 577: } Ustvarimo dva objekta tipa Z. 575: b = bb. ali moraš razred kaj spremeniti? 5. Razredu Y dodamo še konstruktor public Y(int row) { x = row. Y. c. e. Y[5]. } Kateri izmed konstruktorjev pa so sedaj pravilni? a. 586: } 587: }   Ali je v kodi kakšna napaka? Če je. Y(10. y1 = new Y(2.  Kako »pravilno« preveriti. y = 80.

Console. int[] b = {5}. Razred preizkusi tako. ki je primerna za branje. ki predstavi osebo z String Polno_ime().C# . Programiranje 1 – VSŠ Informatika . Preveri. in sicer:  ime  priimek  datum rojstva Za predstavitev datuma uporabi razred Datum iz prejšnje naloge. mesec in leto). inc. ki predstavlja tebe. ki vrne datum predstavljen z nizom znakov.Povecaj (b).WriteLine("a = " + a). inc. Metoda shrani(w) zapiše na w v eno vrstico podatke o osebi v obliki. da narediš osebo. Definiraj metodo override public string ToString(). ki vrne polno ime osebe. če je this pred d  0.WriteLine("b = " + b[0]). ki primerja this in d ToString(). če je this enak d  > 0. NET 76 590: 591: 592: 593: 594: 595: 596: 597: Datum int a = 5. Definiraj ustrezne komponente in konstruktorje. ki predstavlja datum (dan. se Oseba in datoteke Razredu Oseba dodaj metodi public void Shrani(StreamWriter ime) in konstruktor public Oseba(StreamReader ime) za zapisovanje in branje osebe z datoteke. če je this za d Oseba Oseba 1 Sestavi razred Oseba. ločena s presledkom. Oseba 2 Razredu Oseba dodaj metodo public pravi ime in priimek. Datum 2 Razredu Datum dodaj metodo public ter vrne celo število:  < 0. ali metoda in konstruktor pravilno delujeta. če je datum this enak datumu d. in zapiše podatke v komponente objekta this. Sestavi razred Datum. Definiraj ustrezne konstruktorje in metodo public string nizom znakov.Povecaj (a). ki vsebuje podatke o osebi. Definiraj metodo public bool Equals(Datum d). ki je bila predhodno zapisana s Shrani. ki vrne True. na primer nekaj takega kot Miha:Novak:23:7:1982 Konstruktor Oseba(r) prebere z r eno vrstico. int CompareTo(Datum d). Console.

Tvoja naloga je:  sestaviti razred. Kandidat za direktorja banke V banki je direktor uspel povzročiti politični škandal takšnih razsežnosti.številka med 3 in 8 (vključno) Banka želi izbrati direktorja. Vse spremenljivke razreda morajo biti privatne. ki shranita in naložita tabelo oseb na datoteko z imenom dat. Preveri.dat Miha:Novak:23:7:1982 Josip:Broz:7:5:1892 Josip:Plemelj:11:12:1873 Britney:Spears:12:2:1981 Kurt:Goedel:28:4:1906 Alan:Turing:23:6:1912 Leonhard:Euler:15:4:1707 Carl Friedrich:Gauss:30:4:1777 Oseba in datoteke 3 Napiši statično metodo public static void rojeni_pred(string dat. da bo velikost vedno ostala znotraj sprejemljivih meja! Če uporabnik poskusi določiti napačno velikost. Majica Sestavite razred Majica. ali metodi pravilno delujeta. od katerih je vsak predložil sledeče podatke: o ime o priimek o starost (v letih) o stopnjo izobrazbe . NET 77 Oseba in datoteke 2 Razredu Oseba dodaj statični metodi public static void ShraniSpisek(Oseba[] spisek. ki bo hranil podatke o kandidatih za direktorja  dopolniti priložen testni program tako. Datum d). da bo našel primerne kandidate za to mesto in jih izpisal Razred Kandidat mora poleg ustreznih spremenljivk (ki naj bodo privatne!) vsebovati vsaj javne metode: Programiranje 1 – VSŠ Informatika . ki iz datoteke z imenom dat prebere spisek oseb in na zaslon izpiše tiste osebe. o barvo: poljuben niz in o ali ima majica kratke ali dolge rokave. ki ne bi bil starejši od 50 let (da bo lepo izgledal v medijih) in ima vsaj 6. ki so rojene pred datumom d. ali metoda pravilno deluje. naj se obdrži prejšnja vrednost. Podpisi teh metod naj bodo: o public int VrniVelikost() ter public void SpremeniVelikost(int velikost) o public string VrniBarvo() ter public void SpremeniBarvo(string barva) o public boolean ImaKratkeRokave() ter public void NastaviKratkeRokave(boolean imaKratkeRokave) Metoda za nastavljanje velikosti majice naj poskrbi tudi za to.C# . stopnjo izobrazbe. Za to službo se je prijavilo kar nekaj kandidatov. Preveri. da je moral odstopiti (seveda z odpravnino v višini 50 povprečnih plač) in zato sedaj isčejo novega direktorja. ki hrani osnovne podatke o majici: o velikost: število med 1 in 5. string dat) in public Oseba[] static NaloziSpisek(string dat). razred pa mora tudi poznati metode za nastavljanje in branje teh vrednosti. V pomoč naj ti bo spisek naslednjih oseb: osebe.

konstruktor brez parametrov .če ni. "Zevnik". Metoda naj vrne seznam nizov dolžine 2 .C# . ki vrne ime in priimek kandidata.. priimek). int starost = 42. "Bernarda". "Koci".Next(3. } public static void Main(string[] args) { public string[] imena = {"Jana".NastaviStarost(starost). "Primoţ". Random gen = new Random(). public int VrniIzobrazbo() . public void NastaviStarost(int starost) . // prišli podatki o najprimern.metoda. public string[] priimki = {"Mali".90). int kolikoKandidatov = 30.8). stopnjo izobrazbe 6 in imenom in priimkom ko Neznani Neznanec. tmp. int randizobrazba = gen. tmp. Starost mora biti v mejah med 20 in 80 let . priimek enak null.NastaviImePriimek(ime.če ni.metoda. public string[] VrniImePriimek() . "Matija"}. imena. priimek. "Lokar"}. Kandidat nov = new Kandidat(). "Danijel". public Kandidat[] kandidati = new Kandidati[kolikoKandidatov]. "Ankimer". "Zupan". ki nastavi ime in priimek kandidata.1). "Bogataj". tmp. string priimek) metoda. int randime = gen. da bodo v ime. for(int i=0. int randpriimek = gen.. "Vilis". ki vrne starost kandidata. return nov.NastaviIzobrazbo(izobrazba). . nov. 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: public static Kandidat NajPrimernejši(Kandidat[] tabelaKandid) { // tu poskrbi. naj se stara izobrazba ne spremeni. ki nastavi izobrazbo kandidata. int izobrazba = 6. naj se stara starost ne spremeni. i < kolikoKandidatov. "Tina". o o o o o o public string ToString() Dano je okostje programa. kandidati[i] = tmp.Length . public void NastaviIzobrazbo(int izobrazba) . NET 78 o o public Kandidat () . Izobrazba mora biti v mejah med 3 in 8 . ki vrne izobrazbo kandidata.metoda.v prvem polju naj bo zapisano ime. "Anita". v drugem pa priimek kandidata.ustvari kandidata s starostjo 20.NastaviStarost(randstarost).Next(0.Next(20.Length . string priimek = "Prijatelj".1).metoda. "Anţe". ki nastavi starost kandidata.Next(0. public int VrniStarost() .NastaviIzobrazbo(randizobrazba). nov. "Jure". i++) { Kandidat tmp = new Kandidat(). public void NastaviImePriimek(string ime. Če je slučajno ime oz. int randstarost = gen.priimki. nov. ki obravnava prijavljene kandidate. } Programiranje 1 – VSŠ Informatika . "Jerše".NastaviImePriimek(randime. naj starega imena in priimka ne spremeni. randpriimek). kandidatu string ime = "Moj".metoda.

ki predstavlja količino denarja. da v razred dodaš javno metodo public int KolicinaDenarja(). NET 79 632: // tu poišči najprimernejšega kandidata in ga izpiši 633: Console. "). 634: 635: 636: Console. Poišči ga! Denarnica Sestavi razred Denarnica. iz nje odvzameta denar. ker pa je količina denarja privatna spremenljivka razreda. po pomoti vstavil v spremenljivko. ki v denarnico dodata oz. Sestavi tudi testni program. Dopolni razred s konstruktorjem public Denarnica(int denar). ki količino denarja v denarnici nastavi na vrednost (in pri tem seveda pregleda. da so si v banki premislili in bi radi namesto mladega neizkušenega direktorja zaposlili najstarejšega (ne glede na izobrazbo). 637: Console. "set" metodo: public void SetVrednost(int vrednost). ki predstavlja količino denarja v njej kot javno spremenljivko (v centih) in metodo public string ToString().Write("Press any key to continue . Zato moramo razred popraviti! Namesto javne spremenljivke vzemimo privatno. poleg tega pa dopišimo še metodi dvigni in placaj.C# . . Kandidat . je od zunaj nikakor ne moreš prebrati! Ta problem se reši tako. S pomočjo metode KolicinaDenarja Programiranje 1 – VSŠ Informatika o o o . če je ta vrednost pozitivna).ReadKey(true). da je v njej pravilna količina denarja.WriteLine("Najprimernejsi je: NajPrimernejsi(kandidati)). . negativno vrednost. V denarnico dodaj nekaj denarja. Ustvari tudi tabelo desetih denarnic z naključno mnogo denarja in jih izpiši. če bi programer s firme Nekaj pacamo d. kjer preizkusiš delovanje tojega razreda. Ampak glede na naš razred je izbira dveh metod bolj naravna. o o Ali lahko na ta način zagotoviš. da v denarnici nikoli ne bo negativno mnogo denarja? Seveda ne. ki nam vrne količino denarja v denarnici.najstarejši Recimo.i. da vrne kandidata. ki vrne niz "V denarnici je # centov".o. Če želimo plačati več. nekaj ga odvzemi in se prepričaj. kot imamo denarja v denarnici. To bi se na primer zgodilo. ki ustvari denarnico z dano količino denarja. ki je najmlajši in ima zahtevano stopnjo izobrazbe (ali višjo). tako.o. ki vsebuje celoštevilsko spremenljivko. Preveri tudi plačilo prevelikega zneska in ustrezno odreagiraj! Ali prejšnjo nalogo sploh lahko v celoti izpolniš? Denar res lahko dodaš in ga odvzameš. naj metoda placaj vrže napako! Opomba: namesto teh dveh metod bi lahko napisali samo t. 638: } 639: } " + Spremeni metodo NajPrimernejsi.

 public string VrniIme() . ki predstavlja medij za shranjevanje podakov. ki vrne ime lastnika denarnice. da ustvariš tabelo desetih denarnic z naključno količino denarja med 0 in 1000. če metode razreda Denarnica v tem primeru vržejo napako.nastavi kapaciteto medija v bajtih. Ustvari tudi denarnico z negativno mnogo denarja in preveri. tako da izpis vključuje tudi ime lastnika denarnice.vrne ime proizvajalca medija. Vsebovati mora vsaj javne metode:  public PodatkovniNosilec() . če ženskega (kaj hočete. enota je bajt).  public void NastaviIme(string ime) . naj se ne spremeni.gigabajti Pazi na to. da je en kilobajt 1024 (in ne 1000) bajtov!  public override string ToString() .vrni kapaciteto v enoti.  public int VrniOsnovnoCeno() . proizvajalca "neznan".)  masa //masa zajca v kilogramih (tip double)  serijska //serijska številka zajca (tip string) Programiranje 1 – VSŠ Informatika . Za vsakega zajca poznamo serijsko številko. Dopolni konstruktor tako. Sestavi tudi testni program.  public void NastaviObdavcitev(int pocent) .konstruktor. Ne pozabi je tudi ujeti v glavnem programu. da pišemo program.  public double VrniKapaciteto(char enota) .bajti o 'k' ..vrne niz. enota je evroCent) in stopnji obdavčitve (celo število. moški šovinisti . Če so procenti izven meja 0-100. sicer se ti bo program sesul! Denarnica ima tudi svojega lastnika.  public void NastaviKapaciteto(int bajti) . če se je tvoja denarnica pravilno inicializirala. spol in maso Sestavi razred Zajec. Dopolni testni program tako. Če je negativna. Če je ime enako null.megabajti o 'G' . Vsebuje naj informacije o kapaciteti medija (celo število. ki stane 800 centov? Podatkovni nosilec Sestavite razred PodatkovniNosilec.  public void NastaviCeno(int cena) .C# . int cena. Dodaj privatno spremenljivko lastnik tipa string. ki vsebuje komponente:  spol //vrednost true..nastavi ceno. Razred Zajec Denimo. s ceno 100 centov in 20% davkom. int davek) . da poleg količine denarja sprejme tudi ime lastnika. ki smiselno opisuje razred. Razredu dodaj tudi metodo VrniLastnik. naj se ne spremeni. int kapaciteta.vrne osnovno ceno medija (brez davka). Če je kapaciteta negativna.vrne osnovno ceno + davek (v evrih). Izpiši jih! Kdo izmed lastnikov si lahko privošči nakup banjice sladoleda. če je zajec moškega spola in false.nastavi obdavčitev v procentih. v katerem preveriš delovanje tvojega razreda. naj se ne stara vrednost ne spremeni. ki jo določa znak enota: o 'b' . ki ustvari nosilec kapacitete 650Mb.  public double VrniProdajnoCeno() . enota je procent). NET 80 o o o preveri.  public double VrniDavek() . ki bo pomagal upravljati farmo zajcev. osnovni ceni (celo število. Popravi tudi metodo ToString.koliko davka je potrebno plačati za ta medij (v evrih).konstruktor s parametri.nastavi ime izdelovalca medija.kilobajti o 'M' .  public PodatkovniNosilec(string ime. ki vsebuje ime lastnika denarnice. izdelovalcu (niz ). naj se ne spremeni.

dodaj še get in set metode za vračanje in nastavljanje vrednosti vseh treh komponent. da moraš točko ustvariti tudi v konstruktorjih. naj metoda nastavi komponento na to vrednost in vrne true.0) in širino ter višino 100 metrov. razred Zajec Napiši metodo VrednostZajca. ki sprejme ceno za kg žive teže v evrih. ki sprejme samo spol in serijsko številko zajca. Če je podana vrednost smiselna. V tam namem napiši razred Tocka. ki jih je povzročila odločitev glede načina hranjenja podatka o spolu. Sestavi program. Set metode napiši tako. Dodaj ustrezen konstruktor in upoštevaj. ki določa lego na travniku. takega. Dopolni razred Zajec z metodama za branje in spreminjanje lege zajca.0 kg. ne false ampak m in f. recimo v kvadratu s spodnjim levim krajiščem v točki (0. Ker pa je travnik velik. Dopiši tudi metodi za nastavljanje in spreminjanje lege točke (vsake kompomente posebej). jim kmet vsak dan dovoli par ur skakljanja po travniku. smislena nova masa je le med 0 in 10 kg). lahko dodaš še kakšne konstruktorje. Metoda VrednostZajca. da v njih preveriš. ki sprejme maso (spremenljivka tipa double). Sicer naj se vrednost komponente ne spremeni in metoda naj vrne false. Programiranje 1 – VSŠ Informatika . Kaj vse moramo spremeniti v razredu Zajec? Get in set metode v razredu Zajec Vsem trem komponentam v razredu Zajec spremeni način dostopa iz public v private. da v spremenljivki spol ne bomo več hranili true za samca. Izpiši vse tri teže zajcev.5.serijska). Napiši ustrezne konstruktorje . ki si ga napisal pri nalogi Uporaba razreda Zajec? Spol ni ne true. ki ustvari farmo zajcev (tabelo 10 zajcev) in med njimi poišče:  najtežjega  najcenejšega  vse zajklje najtežjega samca Spol je true za samico.osnovni konstruktor (brez parametrov) naj točko postavi v koordinatno izhodišče. kjer lege ne dobiš kot podatek. Konstruktor. in vrne vrednost zajca v €. če je podana vrednost smiselna (npr. se zajci lahko nahajajo samo znotraj v naprej znanega območja. Točka Da bi se zajci bolje počutili. ki naj vsebuje spremenljivki x in y tipa double. Zato bomo spremenljivko spol spremenili v tip char in tam hranili 'm' za samca in 'f' za samico. Zajci na travniku Popravi razred Zajec tako. Uporaba razreda Zajec Sestavi program. Metoda toString. ki naredi tri zajce s težami. ki sprejmejo podatke od uporabnika. Metode za nastavljanje vrednosti komponent uporabi tudi v tistih konstruktorjih. da mu dodaš parameter tipa Tocka. ampak za samico. npr. Izpiši serijsko številko najlažjega zajca. smo se odločili. Kaj vse moramo spremeniti v razredu Zajec? Kakšen vpliv ima to na program. Zajci na travniku II Ker je kmet travnik ogradil z ograjo. v katerem zajcu nastavimo težo na 1. NET 81 Razred Zajec naj vsebuje vsaj dva konstruktorja: Prazen konstruktor. Ker sedaj ni več mogoče dostopati do komponent neposredno (npr. Če želiš. spol (spremenljivka tipa boolean) in serijsko številko (spremenljivka tipa string) zajca. serijske številke in mase zajca.C# . Prejšnji program spremeni tako.2 in 5. ki vrne niz s smiselnim izpisom spola. da vedno izpišeš kompletne podatke o zajcu. razred Zajec V razredu Zajec napiši metodo public String ToString(). je moral spremljati položaj vsakega zajca (da jih ne bi kdo ukradel in snedel). določimo moški spol in nastavimo serijsko številko na "NEDOLOČENO". razred Zajec Po spremembi opisani zgoraj je ponorel moški del populacije. zajcek. razred Zajec Zaradi demostracij (žal tudi nasilnih). ki so naključna števila med 1. V takem primeru naj bo zajec v koordinatnem izhodišču. Enemu povečaj njegovo težo za 2kg.

Razdalja med dvema točkama Ker velikokrat pride prav. ki jo metoda dobi kot parameter.C# . NET 82 Popravi konstruktor in metodo za nastavljanje pozicije zajca tako. da ne bo dovolil vnosa napačne lege zajca (izven dovoljenga območja)! Pri tem bodi pozoren na to. da generira zajce na naključnih položajih.torej novo točko na istih koordinatah. katerih števec in imenovalec naj bo naključno število med med 1 in 9 (vključno z mejama). Pazi tudi na pravilnost podatkov. saj bo drugače uporabnik lahko v točko od zunaj vnesel napačne podatke! Mogoče se ti splača napisati metodo public static Tocka Kopija(Tocka t) v razredu Tocka. ki je: 1. Ulomka seštej in rezultat izpiši na zaslon. public void Pristej(Ulomek u) { // DOPOLNI! } // Metoda zmnoţi trenutni ulomek z ulomkom u ter // zmnoţek vrne kot rezultat. ki kot parameter sprejme drugega zajca in vrne razdaljo med njima. ki vrne razdaljo med trenutno točko in točko t. da izračunamo razdaljo med dvema točkama. public DOPOLNI Zmnozi(Ulomek u) { Programiranje 1 – VSŠ Informatika . 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: // Privzeti konstruktor ustvari ulomek 1/1 // DOPOLNI! // Ustvari podani ulomek. public Ulomek(int stevec. da moraš pri branju lege zajca vrniti duplikat točke. Uporaba razreda Zajec II Oboroženi z novimi metodami dopolnimo naš program za gojenje zajcev tako. // Ce so napačni. Dopolni manjkajoče metode ter v glavnem programu (metoda Main) ustvari dva ulomka. Nazadnje poiščimo zajca. dopolni razred Tocka z metodo public double Razdalja(Tocka t). najbolj oddaljen od prvega zajca 2. Razdalja med dvema zajcema Dopolni razred Zajec z metodo RazdaljaMedZajcema. RAZRED ULOMEK public class Ulomek { 640: int stevec. int imenovalec) { // DOPOLNI! } // Metoda prišteje ulomek u k trenutnemu ulomku. Trenutni ulomek ter // ulomek u se pri tem ne smeta spremeniti. ustvari enak ulomek kot v privzetem // konstruktorju. ima največji produkt med maso in oddaljenostjo od zhodišča Razred Ulomek Podana je koda razreda Ulomek. ki vrne kopijo točke t . najbolj oddaljen od koordinatnega izhodišča 3. 641: int imenovalec.

priimek = priimek. } public string VrniIme() { return this. RAZRED OSEBA public class Oseba { private string ime. this. } public string VrniPriimek() { return this.C# . 681: public void Obrni() { 682: // DOPOLNI 683: } 684: } TESTNI PROGRAM public class TestUl 685: public static void Main(string[] argc) { 686: // DOPOLNI po navodilih naloge! 687: } 688: } Razred Stranka Na osnovi kode spodaj podanega razreda Oseba sestavite razred Stranka.priimek. mora hraniti tudi podatke o tekočem računu (niz). so enake kot v razredu Oseba. } Programiranje 1 – VSŠ Informatika . Poleg lastnosti.ime. private string priimek. ki predstavlja bančno strankoega komitenta. številki EMŠO (niz) ter povprečnem mesečnem prilivu na tekoči račun (realno število).ime = ime. string priimek) { this. public Oseba(string ime. NET 83 663: // DOPOLNI! 664: } 665: // Metoda vrne vrednost ulomka kot realno število. 666: public DOPOLNI Vrednost() { 667: // DOPOLNI! 668: } 669: 670: // Vrne niz oblike »stevec/imenovalec« 671: DOPOLNI string ToString() { 672: // DOPOLNI! 673: } 674: 675: // Metoda okrajša dani ulomek 676: public void Okrajsaj() { 677: // DOPOLNI 678: } 679: 680: // Obratna vrednost.

vrniKoeficient(0)).c = c.  Metoto ToString. public Polinom (double a. Če to ni izpolnjeno.vrniKoeficient(2). this. this.a = this. ki obstoječi polinom pomnoži s skalarjem (spremeni torej obstoječi objekt in ne ustvari novega).a. Kubični polinom Na osnovi razreda Polinom. prvi štirje pa neprazni nizi. NET 84 } Pri tem mora razred zadoščati naslednjim pogojem:  Vse spremenljivke v njem morajo biti privatne. ki sprejme pet parametrov: ime. int c. } //Ustvari polinom z danimi koeficienti.C# . this. številke EMŠO ter povprečnega priliva na račun. RAZRED POLINOM //razred predstavlja polinom oblike ax^2 + bx + c public class Polinom { private double a. public Polinom() { this. priimek. ki v razredu Polinom manjka. številko EMŠO ter podatek o povprečnem mesečnem prilivu na račun.b = b.b. //Ustvari ničelni polinom.a = a. ki jih hrani: imena. Nazadnje sestavite testni program.b = this. ki bo lahko hranil kubične polinome ter bo poleg vsote podpiral tudi operacijo. priimka.vrniKoeficient(0) + p.c = 0.  Poznati mora metode za vračanje podatkov. this. int b. Pri tem mora biti zadnji podatek pozitivni+o realno število. ki na smiselen način izpiše podatke o stranki. } public Polinom Sestej(Polinom p) { return new Polinom(this. ki hrani polinome do stopnje dva in pozna operacijo seštevanja dveh polinomov (njegovo kodo glej spodaj) sestavi razred KubicniPolinom. številke tekočega računa. ter med njimi poščite stranko z najvišjim mesečnim prilivom na račun ter tistega z po leksikografski urejenosti prvim imenom (če jih je več z enakim največjim prilivom ali enakim prvim imenom poiščite kateregakoli) ter izpišite njune podatke na zaslon (z uporabo metode ToString). številko tekočega računa. ustrezno reagiraj. Programiranje 1 – VSŠ Informatika . kjer ustvarite tabelo desetih strank z izmišljenimi podatki. } //metoda nam vrne koeficient pred x^i public int VrniKoeficient(int i) { if (i == 2) return this.vrniKoeficient(1) + p. double c) { this.  Poznati mora javni konstruktor. Seveda naj tvoj razred ne pozabi na metodo ToString.vrniKoeficient(1). double b.vrniKoeficient(2) + p. if (i == 1) return this.

} public void ImePsa(string ime) { ime = this.NastaviSteviloPik(100). ki vsebuje metodo. Razred naj pozna enake metode kot razred KubicniPolinom. double k) { if (i == 2) this. kaj in zakaj ni pravilno. public Dalmatinec() { this. this. Koda razreda je: RAZRED DALMATINEC public class Dalmatinec{ public string ime. ki zna odšteti dva kubična polinoma (vrne polinom. private int steviloPik. NET 85 if (i == 0) return this.a = k. da smo želeli sestaviti razred Dalmatinec. else if (i == 0) this. Programiranje 1 – VSŠ Informatika .steviloPik = steviloPik. ki je razlika dveh polinomov). Polinom Sestavi razred s pomočjo katerega predstaviš poljubni polinom.C# .b = k. p1 – p2 lahko izračunaš kot p1 + ((-1)*p2).ime = ime. } public void NastaviSteviloPik(int steviloPik) { this. } //Metoda nastavi koeficient pred x^i na k. naj ne stori nič public void NastaviKoeficient (int i.c = k. //Če je i napačen. } } Sestavi testni program.steviloPik = 0. Namig: koeficiente hrani v tabeli. Pregledno izpiši nekaj računov s polinomi. } private void NastaviIme(string ime) { this. else if (i == 1) this. ki ima lastnosti ime psa in število njegovih pik.c. Kateri način je pravilen? Pri nepravilnih povej.ime.NastaviIme("Pika"). } } V glavnem programu smo ustvarili objekt Dalmatinec z imenom d in mu želimo nastaviti število pik na 100 in ime na Pika.ime = "Reks". d. Dalmatinci I (brez računalnika) Denimo. a) d. return 0. Namig.

da bo zadoščal naslednjim trem pogojem:    Spremenljivka spol naj ne bo dostopna izven razreda Dalmatinec obstaja naj metoda KaksenSpol. ki sprejme kot parameter znak za spol. ki zadošča kriterijem naloge Dalmatinci III. ki ima podatke enake kot najdena oseba. da razred. d. ker tega sploh ne moremo storiti Dalmatinci II Sedaj želimo našemo razredu Dalmatinec dodati tudi podatke o spolu psa. katerih skupna dolžina imena in priimka presega k znakov. V tabeli tipa Oseba[].C# . da bo parameter zagotovo znak 'm' ali 'f'.steviloPik = 100.steviloPik = 100.imePsa("Pika"). b. ki: a. ter kot rezultat metode vrnite referenco na to osebo. Če takšna oseba ne obstaja. v primeru samice pa 'f'. spol se nastavi le ob ustvarjanju objekta.imePsa("Pika"). Sestavi metodo public static int SteviloSamcev(Dalmatinec[] dalmatinci). c) d. false pa moški spol. že imamo. Oseba Podan imamo razred Oseba z objektnima metodama VrniIme() ter VrniPriimek() (ki nam vrneta niza. ki v primeru samca vrne 'm'. Če takšna oseba ne obstaja. Zgoščenka Pesem na zgoščenki je predstavljena z objektom razreda Pesem: public class Pesem { public string naslov. d) d.NastaviIme("Pika"). priimek osebe). f) d. učinkovito poiščite osebo Janez Novak. kjer so osebe urejene po priimkih (ter nato po imenih). NET 86 b) d. ki predstavljata ime oz. kjer so osebe urejene po priimkih. Ta podatek bomo hranili v spremenljivki spol. d. priimek osebe).NastaviSteviloPik(100). ter kot rezultat metode vrnite nov objekt. vrnite null. ki predstavljata ime oz.ime = "Pika". iz tabele tipa Oseba[]. učinkovito poiščite poljubno osebo s priimkom Novak (ime torej ni pomembno). e) d. Oseba II Podan imamo razred Oseba z objektnima metodama VrniIme() ter VrniPriimek() (ki nam vrneta niza. Interno (znotraj razreda) naj logična vrednost true pomeni ženski. d. iz tabele tipa Oseba[] izpiše vse osebe z imeni dolgimi 5 znakov. public int sekunde. Dalmatinci III Predpostavimo. Sestavite metodi.steviloPik = 100. vrnite null. Predpostavite.NastaviSteviloPik(100).ime = "Pika". kjer je k parameter metode. Sestavite statični metodi. Morali boste torej napisati konstruktor razreda Dalmatinec. d. Programiranje 1 – VSŠ Informatika . Dopolnite razred tako. Za dano tabelo tipa Oseba[] izpiše priimke vseh oseb. ki: a. d. b. Ta naj bo kot zgoraj 'm' za samca in 'f' za samico. ki prešteje število samcev v tabeli dalmatincev. public int minute. g) nobeden.

minute = min. ki traja 15 minut in 24 sekund. Foo t2 = new Foo(30). o Vsak objekt vsebuje svojo kopijo objektnih komponent. vsaka statična komponenta pa vedno obstaja v eni sami kopiji. objekt new Pesem("Echoes".24) predstavlja pesem “Echoes”. ki vrne skupno dolžino vseh pesmi na zgoščenki. (b) Razredu Zgoscenka dodaj objektno metodo Dolzina().15. Foo t1 = new Foo(42). Ker je komponenta x statična. tudi če nimamo nobenih objektov razreda Foo: Programiranje 1 – VSŠ Informatika . } } o x: statična komponenta. izraženo v sekundah. public int y. y: objektna (nestatična) komponenta o Statične komponente: vsebovane v razredu. int min.C# . Predpostavi. sekunde = sek.y = z. Definiraj ustrezne komponente s pravilnim dostopom in konstruktor. že poznamo o static  Obstajajo neodvisno od obstoja objekta tega razreda  Le en primerek za cel razred!  Math.dve kopiji komponente y. (a) Sestavi razred Zgoscenka. public Foo(int z) { this. izraženo v sekundah. o final  gre za konstanto  Nič novega. ime izvajalca in tabelo pesmi na zgoščenki. Statično in objektno Statične komponente o V razredu Kvader  public static final int MIN_DOL_STR = 1. vedno obstaja v eni sami kopiji. da vse podatke (naslov. o Dva objekta . int sek) { naslov = nasl. NET 87 public Pesem(string nasl. } } Na primer. (c) Razredu Zgoscenka dodaj objektno metodo PovprecnaDolzina(). izvajalca in tabelo pesmi) obvezno dobiš s konstruktorjem in jih naknadno nikoli ne smeš (moreš) spremeniti. ki vsebuje naslov zgoščenke. ki vrne povprečno dolžino vseh pesmi na zgoščenki. objektne komponente: v objektih. po eno v vsakem objektu.PI Statične spremenljivke public class Foo { public static int x = 13.

ampak cele skupine objektov o Vedno. ko ustvarimo novega zajca  new  V konstruktorju! o Serijska številka naj bo zagotovo enolična  Določimo jo le enkrat – ob rojstvu (konstruktor)  ZAJEC_n (če je to n-ti zajec) Programiranje 1 – VSŠ Informatika .ime_komponente ali ime_razreda. koliko zajcev imamo o Števec ustvarjenih objektov  NI lastnost posameznega zajca  SKUPNA lastnost  private static int kolikoZajcev = 0. da bi sploh obstajal kak objekt te vrste Zajec o Radi bi vedeli.  Na začetku 0  Spreminjamo takrat.ime_komponente  Izogibamo se ime_objekta. ko je določen podatek skupen za vse objekte tega razreda o Kako vemo. če jih želimo "skriti" pred uporabniki Statične komponente – naslavljanje Naslavljanje (če je dostop public):  ime_objekta. saj ta komponenta ni vezana na objekt!  Ni potrebno.ime_komponente ali (znotraj razreda) ime_komponente  Praviloma: ime_razreda. da so te številke zaporedne  Vedeti. če gre za konstante  zaradi final ni težav s pravilnostjo podatkov  konstante imajo način dostopa private.ime_komponente.C# . ki so skupne za celoten razred – niso posebna lastnost enega (ali nekaj) primerkov objektov tega razreda. ali naj bo komponenta statična ali objektna?  Statične komponente so tiste. Statične komponente – dostop o public ali private (odvisno od željenega načina dostopa) o public praviloma le. NET 88 Uporaba statičnih spremenljivk o Različne konstante o Enolična identifikacija  Objekt naj ima svojo serijsko številko  Denimo. katera je bila dodeljena zadnja  Zadnja dodeljena številka: ni lastnost objekta.

številko 442: this.OsnovaSerijska + ZajecNov. // maksmialna teţa 424: 425: // OBJEKTNE SPREMENLJIVKE 426: private string serijska. 452: if (decim < 3) return tezaKg + 0.ta 440: // bo ţe povečal število zajcev + naredil 441: // nj. // NAREDILI SMO NOVEGA ZAJCA 436: this.0. 466: } 467: 468: public string PovejSerijsko() { 469: return this.tezaKg) * 10).masa .5 kg natančno 450: int tezaKg = (int)this.masa = 1. double masa) { 439: this(). ser. // in tehtajo 1kg 435: ZajecNov. 427: private bool spol. NET 89 RAZRED ZAJEC 418: public class Zajec { 419: // SKUPNE SPREMENLJIVKE 420: private static string OsnovaSerijska = "ZAJEC_".C# . spol 434: this. 428: private double masa. 461: return true. 422: public static final int MIN_TEZA = 0. 451: int decim = (int)((this. 429: 430: // konstruktorji 431: 432: public Zajec() { 433: this. 421: private static int kolikoZajcev = 0. da spremembe nismo naredili 465: return false.masa = novaTeza.5. 444: } 445: 446: // get/set metode 447: 448: public double PovejTezo() { 449: // teţo bomo povedali le na 0. 455: } 456: 457: public bool SpremeniTezo(double novaTeza) { 458: // smislena nova teza je le med MIN_TEZA in MAX_TEZA 459: if ((novaTeza > MIN_TEZA) && (novaTeza <= MAX_TEZA)){ 460: this. // minimalna teţa 423: public static final int MAX_TEZA = 10.kolikoZajcev. // uporabimo metodo za sprem.kolikoZajcev++.serijska. 454: return tezaKg + 1.spol = spol. // vsem zajcem na začetku določimo m.spol = true.SpremeniTezo(masa).0. 453: if (decim < 8) return tezaKg + 0.0. 443: this. // poklicali smo konstruktor Zajec() .masa. 437: } 438: public Zajec(bool spol. // sprememba uspela 462: } 463: // v nasprotnem primeru NE spremenimo teţe 464: // in javimo.serijska = ZajecNov. 470: } Programiranje 1 – VSŠ Informatika .

520: Dostop: Kvader. 488: } 489: 490: public bool MeNapojiti() { 491: // ugotovimo. da je smiselno. /* uporabnika ne zanima. // serijska stevila objekta 509: 510: private static int kolikoNasJe = 0.MIN_DOL_STR Programiranje 1 – VSŠ Informatika . */ so oznaceni komentarji za razlago 500: // zakaj doloceni konstrukcijski prijemi 501: // v "pravem" programu jih ne bi bilo! 502: 503: private double a. 477: } 478: 479: // ker se spol naknadno NE spremeni. 495: } 496: 497: } // Zajec  Štetje ustvarjenih objektov  V konstruktorjih povečujemo števec RAZRED KVADER 498: public class Kvader { 499: // z /* .povejTezo() > 0). 473: // KER SE SER_ŠT NE SPREMINJA! 474: 475: public bool JeSamec() { 476: return this. Spreminjati ju ne more zaradi final.dostop 519: public. da bomo "ujeli" naslednjih pol kg 493: // dejanska teţa je večja od "izmerjene" 494: return (this.spol..C# .povejTezo(). 507: 508: private int serijskaStevilka. metode za 480: // spreminjanje spola sploh ne ponudimo uporabniku! 481: 482: // Ostale metode 483: 484: public double Vrednost(double cenaZaKg) { 485: // pove vrednost zajca 486: // zajce tehtamo na dogovorjeno natančnost 487: return cenaZaKg * this. kako 504: imamo shranjene podatke */ 505: private double b. da uporabnik neposredno 518: vidi ti dve kolicini .. NET 90 471: 472: // public void SpremeniSerijsko(string s) { TO IZLOČIMO. če ga je smiselno 492: // napojiti.this. 506: private double c.masa . // koliko je 511: // ustvarjenih objektov 512: 513: public static final int MIN_DOL_STR = 1. // minimalna 514: // dolzina stranice 515: public static final int MAX_DOL_STR = 100. // maksimalna 516: // dolzina stranice 517: /* Ker menimo.

zato private */ // preverimo. // drugace pustimo // taksnega. ga spremenimo.1 kopija za vse objekte */ // vrni podatek public int PovejA() { /* omogocimo uporabniku dostop do vrednosti zanj zanimivih podatkov */ return (int)this.gre za razredno spremenljivko . ga spremenimo. // drugace pustimo // taksnega. da locimo med imenom podatka objekta in parametrom a */ /* verjetno bi bilo bolj smiselno namesto a parameter poimenovati s ali kako drugače */ } public void StranicaB(int a) { // Ce je podatek v mejah med 1 in 100. kot je if (Kontrola(a)) this. da bi bilo boljse. } public int PovejC() { return (int)c. } // nastavi podatek public void StranicaA(int a) { /* omogocimo uporabniku spreminjanje podatkov */ // Ce je podatek v mejah med 1 in 100.npr. /* this je potreben.b = a. kot je if (Kontrola(s)) /* na ta nacin bi verjetno "zares" sprogramirali tudi Programiranje 1 – VSŠ Informatika . se vedno pa velja. da bi parameter a poimenovali drugace . /* this v nasprotju s prejsnjo metodo tu ni potreben. s */ } public void StranicaC(int s) { // Ce je podatek v mejah med 1 in 100.C# .a = a. kot je if (Kontrola(a)) this. } public int PovejB() { return (int)this. ga spremenimo.b. } private bool Kontrola(int x){ /* pomozna metoda. // drugace pustimo // taksnega.a. ce velja MIN_DOL_STR <= x <= MAX_DOL_STR return ((MIN_DOL_STR <= x) && (x <= MAX_DOL_STR)). NET 91 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: Določilo static .

. } public Kvader(int s1....... // ce podatek ni v mejah.. // ce podatek ni v mejah. } Programiranje 1 – VSŠ Informatika .. } //...... // ga postavimo na 1 c = s3. } public Kvader(Kvader sk) { // Novi objekt je kopija obstojecega objekta sk this.PovejC()).a.. // ga postavimo na 1 b = s2.kocka z robom 1 if (!kontrola(s)) s = 1. if (!Kontrola(s3)) s3 = 1.C# . kolikoNasJe++.a = sk. serijskaStevilka = kolikoNasJe. če podatek ni v redu ....ga postavimo na 1 if (!kontrola(s1)) s1 = 1. saj nam ob morebitni spremembi predstavitve ni potrebno toliko popravljati! */ kolikoNasJe++. // ga postavimo na 1 a = s1.. // ce podatek ni v mejah. /* ceprav imamo neposreden dostop do spremenljivk.PovejB()). kolikoNasJe++... /* tudi znotraj razreda se splaca uporabljati metode za delo s podatki */ StranicaC(sk... NET 92 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: zgornji metodi */ c = s.. serijskaStevilka = kolikoNasJe.. if (!Kontrola(s2)) s2 = 1... } public Kvader(int s) { // kocka s stranico s.. // ce podatek ni v mejah.. // konstruktorji public Kvader() { a = b = c = 1.. serijskaStevilka = kolikoNasJe. serijskaStevilka = kolikoNasJe...... kolikoNasJe++.. /* this ni potreben */ StranicaB(sk.... // ga postavimo na 1 a = b = c = s... int s3) { // kvader s1 x s2 x s3 // Ce kak podatek ni v redu . int s2..

polmer = OBI_POLMER. NAJ_VISINA)) 711: // mere so v redu 712: this. naredimo "obicajni" kovanec 709: if { (Vmes(polmer. 642: /* tudi znotraj razreda se splaca uporabljati metode za 643: delo s podatki ceprav imamo neposreden dostop do 644: spremenljivk. // obicajni polmer 694: public static final int OBI_VISINA = 1.C# .to string 636: // 637: public string ToString() { /* prekrivanje metode iz razreda 638: Object */ 639: // Metoda vrne podatek v obliki Kvader: a x b x c 640: return "Kvader: " + PovejA() + " x " + PovejB() + " x " 641: + PovejC(). int visina) { 707: // "drugacni" kovanec 708: // ce ni ustreznih dimenzij. 703: this. 1. NAJ_POLMER) && 710: Vmes(visina. 714: } 715: else { // ce ni ustreznih dimenzij 716: this. saj nam ob morebitni spremembi predstavitve 645: ni potrebno toliko popravljati! */ 646: } 647: 648: } // class Kvader Zgled 2:  Uporaba konstant  Meje pravilnosti podatkov so konstantne 689: public class Kovanec_nov { 690: 691: private int polmer.polmer = polmer. NET 93 629: 630: public static int PovejKolikoNasJe() { 631: return kolikoNasJe.visina = visina. 1. 713: this. 693: public static final int OBI_POLMER = 3. 704: } 705: 706: public Kovanec(int polmer. // največja moţna visina 697: 698: 699: // konstruktorji 700: public Kovanec() { 701: // "obicajni" kovanec 702: this. // največji moţni polmer 696: public static final int NAJ_VISINA = 1. Programiranje 1 – VSŠ Informatika . 692: private int visina. 632: } 633: 634: // 635: // --------------. // obicajna visina 695: public static final int NAJ_POLMER = 3.visina = OBI_VISINA.polmer = OBI_POLMER.

} // volumen in povrsina public double Volumen() { // volumen kovanca PI * r^2 * v return Math. } // tostring override public string ToString() { return "Polmer: " + this.visina = OBI_VISINA.polmer * this. NAJ_VISINA)) { this. ce smo visino spremenili if (vmes(visina. NAJ_POLMER)) { this.polmer + " visina: " + this.visina.PI * this. int a. 1. ce smo polmer spremenili if (Vmes(r. return true.visina = visina.polmer * this.polmer + this. } public int PovejVisino() { return visina. // visina je ostala nespremenjena } // "GET" metode public int PovejPolmer() { return polmer. int b) { Programiranje 1 – VSŠ Informatika . NET 94 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: this.polmer) * (this.visina.visina). } return false.polmer = r. // polmer je ostal nespremenjen } public bool NastaviVisino(int visina) { // smiselni polmer je le med 1 in NAJ_VISINA // drugace jo pustimo pri miru // metoda vrne vrednost true. } } // "SET" metode public bool NastaviPolmer(int r) { // smiselni polmer je le med 1 in NAJ_POLMER // drugace ga pustimo pri miru // metoda vrne vrednost true. return true.C# .PI * this. } // pomozne metode private static bool Vmes(int x. 1. } return false. } public double Povrsina() { // povrsina kovanca 2 * PI * r * v + 2 * PI * r^2 return (2 * Math.

Objektna metoda G ima dostop do komponente this. statične komponente pa se imenujejo "globalne spremenljivke". Dostopa do komponente y nima. Foo. 659: } 660: // ali return Foo.y.. Zgled 649: public class Foo { 650: static public int x = 12. Prav tako ima dostop do (statične) komponente x. na katerem je metoda g klicana. // q == -3 + 5 == 2 new Foo(100).F(5). Objektno metodo hej() v razredu Foo lahko izvedemo.x + a ALI y + x + y ALI .y + Foo.G(50).y = z. int p Foo. Znotraj metode hej() označuje this objekt. Statične/objektne metode Statično metodo bla() v razredu Foo lahko vedno izvedemo z ukazom Foo. 664: } 665: // ali y + Foo.. NET 95 771: // ali je x med a in b 772: return (a <= x) && (x <= b). če imamo neki objekt x razreda Foo. 652: 653: public Foo(int z) { 654: this. saj znotraj statične metode ne moremo pisati this. // p == 12 + 7 == 19 -3. 666: } Statična metoda F ima dostop do (statične) komponente x.x + a.bla(). new Foo(200). z ukazom x. na katerem je metoda poklicana.C# .x int q Foo t Foo s int r = = = = = = Foo. t.G(7). Znotraj statične metode objekt this ni definiran.hej(). ker se statična metode ne kliče na objektu.y. 661: 662: public int G(int a) { 663: return this. kjer je this objekt. 655: } 656: 657: public static int F(int a) { 658: return x + a.x + a. // r == 100 + (-3) + 50 == 147 Programiranje 1 – VSŠ Informatika . 773: } 774: } Statične metode Objekt:  Objektne komponente  Objektne metode Skupno vse objektom – na nivoju razreda:  statične metode  statične komponente Statične metode se v neobjektnih programskih jezikih imenujejo "funkcije" ali "procedure". 651: public int y.

naredimo "obicajni" kovanec 686: if (Vmes(polmer. o Main 667: public class Kovanec_nov { 668: 669: private int polmer. // polmer je ostal nespremenjen 707: } 708: 709: public bool NastaviVisino(int visina) { 710: // smiselni polmer je le med 1 in NAJ_VISINA 711: // drugace jo pustimo pri miru 712: // metoda vrne vrednost true. int visina) { 684: // "drugacni" kovanec 685: // ce ni ustreznih dimenzij. o Praviloma ne spreminjajo stanja nekega objekta.polmer = r.C# . 680: this. ce smo polmer spremenili 702: if (Vmes(r. 690: } 691: else { // ce ni ustreznih dimenzij 692: this. 670: private int visina. 681: } 682: 683: public Kovanec(int polmer.1. 694: } 695: } 696: 697: // "SET" metode 698: public bool NastaviPolmer(int r) { 699: // smiselni polmer je le med 1 in NAJ_POLMER 700: // drugace ga pustimo pri miru 701: // metoda vrne vrednost true.visina = OBI_VISINA. 705: } 706: return false. 1.polmer = OBI_POLMER. 689: this. 671: public static final int OBI_POLMER = 3. 1. // največji moţni polmer 674: public static final int NAJ_VISINA = 1.polmer = polmer. 704: return true. NAJ_POLMER)) { 703: this.NAJ_VISINA)){ 687: // mere so v redu 688: this.visina = visina. NAJ_POLMER) && Vmes(visina. o Vsi podatki podani preko parametrov metode.polmer = OBI_POLMER. 1. // največja moţna visina 675: 676: // konstruktorji 677: public Kovanec() { 678: // "obicajni" kovanec 679: this. // obicajni polmer 672: public static final int OBI_VISINA = 1.visina = OBI_VISINA. NAJ_VISINA)) { Programiranje 1 – VSŠ Informatika . 693: this. NET 96 Statične metode o Kadar za izvajanje ne potrebujemo objekta tega razreda. // obicajna visina 673: public static final int NAJ_POLMER = 3. ce smo visino spremenili 713: if (Vmes(visina.

. } // volumen in povrsina public double Volumen() { // volumen kovanca PI * r^2 * v return Math. o private static int metodaB{. } Privatne metode o Tudi metode so lahko privatne (glej prejšnji zgled)  objektne. int b) { // ali je x med a in b return (a <= x) && (x <= b). } // pomozne metode private static bool Vmes(int x. } // ToString override public string ToString() { return "Polmer: " + this.polmer + " visina: " + this.. } return false.}.visina). statične o private void metodaA() {..PI * this. return true..polmer * this.C# . } public int PovejVisino() { return visina.polmer) * (this.polmer + this.visina.visina. o Kadar metodo potrebujemo interno – uporabnikom ni potrebna! Dedovanje Pogosto uporabljani postopki I Imamo razred Ulomek: Programiranje 1 – VSŠ Informatika . // visina je ostala nespremenjena } // "GET" metode public int PovejPolmer() { return polmer. NET 97 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: } this.}. } public double Povrsina() { // povrsina kovanca 2 * PI * r * v + 2 * PI * r^2 return (2 * Math. int a.visina = visina.PI * this.polmer * this.

until you are completely desperate . 1). 765: boUl = new BoljsiUlomek(). 758: this. če izvorne kode nimamo? Dedovanje o "razširjanje" objektov o Naredimo načrt za razred boljših ulomkov  Boljši: Znajo spremniti predznak o public class BoljsiUlomek : Ulomek o Vsaka boljši ulomek "zna" vse. dopišemo metodo Popravljati dobro preizkušen razred?  . // lahko tudi brez this 759: // metoda pomnozi je podedovana iz razreda Ulomek 760: } 761: } Uporaba Boljšega ulomka 762: public class Test4 { 763: public static void Main(string[] args) { 764: BolsiUlomek boUl.C# . NET 98  Denimo.java:  Ni problem. 767: // spremenimo predznak navadnega ulomka 768: navadniUl.. jim spremnimo predznak Napišemo ustrezno metodo..SpremeniPredznak().. Do not fix.spremeniPredznak() Imamo Ulomek. moramo napisati to metodo:  Naredimo iz nje knjižnico – "zaprimo v svoj razred" Ampak to ni "objektno":  Znanje spreminjanja predznaka je ulomku želvi – objektu  Ulomek (objekt) naj bi znala spremniti predznak :  Odzvati se metodi spremeniPredznak:  nekUlomek. // "čaramo" 769: boUl.1)). Kaj pa.. ko želimo ulomkom spreminjati predznak. // "ustvarimo" boljši ulomek 766: Ulomek navadniUl = new Ulomek(). da z ulomki zelo pogosto izvajamo določen postopek:  npr.Pomnozi(pom). // pri "boljših" ulomkih je zadeva Programiranje 1 – VSŠ Informatika . Vedno. kar zna običpajni ulomek iz razreda Ulomek in morda še kaj o Ima ista stanja/lastnosti  Morebiti tudi dodatna Razred BoljsiUlomek 752: public class BoljsiUlomek : Ulomek { 753: // naredimo nov razred "boljših ulomkov" 754: public void SpremeniPredznak() { 755: // Vsaka boljši ulomek si zna 756: // spremeniti predznak 757: Ulomek pom = new Ulomek(-1.Pomnozi(new Ulomek(-1.

kako se nariše 777: // kvadrat s stranico velikost 778: int i = 1.. 783: // metoda rt je podedovana iz razreda Turtle Programiranje 1 – VSŠ Informatika .Fd(velikost). kar zna razred Turtle in morda še kaj o Ima ista stanja/lastnosti:  Morebiti tudi dodatna RAZRED PAMETNAZELVA 773: public class PametnaZelva : Turtle { 774: // naredimo nov razred "pametnih zelv" 775: public void Kvadrat(int velikost) { 776: // Vsaka pametna zelva ve. 779: while (i <= 4) { 780: base. da z želvo zelo pogosto izvajamo določen postopek. Vedno. Kaj pa. S tem razredom znamo ustvariti objekt.. until you are completely desperate . rišemo kvadrat. Napišemo ustrezno metodo. dopišemo metodo Popravljati dobro preizkušen razred?  .kvadrat(100) Imamo dostop do knjižnice :  Ni problem. želvo. // lahko tudi brez base 781: // metoda fd je podedovana iz razreda Turtle 782: base.C# .Rt(90). ki zna reagirati na ukaze (pozna metode):     Fd(int n) Rt(int st) PenUp() PenDown() Zgled: Denimo.. Do not fix.. da imamo na voljo razred Turtle. moramo napisati to metodo: Ampak to ni "objektno":  Znanje risanja kvadratov je lastno želvi – objektu  Želva (objekt) naj bi znala narisati kvadrat:  Odzvati se metodi kvadrat: nekaZelva. ko z želvo rišemo kvadrate. Npr. NET 99 770: 771: 772: } // elegantnejša } Pogosto uporabljani postopki Denimo. če izvorne kode nimamo? Dedovanje o "razširjanje" objektov o Naredimo načrt za razred pametnih želv:  Znajo risati kvadrate o public class PametnaZelva : Turtle o Vsaka pametna želva "zna" vse.

deljenje. čistočo zlata (podano z realnim številom med 0 in 1) in vrednost čistega zlata na masno enoto. Zlatnik ima poleg osnovnih lastnosti kovanca podano še gostoto materiala. // zelvak bo ime moje pametne ţelve 790: zelvak = new PametnaZelva(). NET 100 784: 785: 786: } } } Naredimo pametno želvo 787: public class Zelva4 { 788: public static void main(string[] args) { 789: PametnaZelva zelvak. 797: 798: } 799: } Dedovanje o Izpeljava novih razredov iz obstoječih o Uvajanje dodatnih metod o Lahko tudi dodatne lastnosti (podatki) o Primer:  matrike  Seštevanje. iz katerega je izdelan. // "ustvarimo" "pametno" ţelvo 791: 792: // naj ţelva zelvak nariše kvadrat 793: // ker je pametna. Razred naj pozna tudi metodo double Vrednost(). odštevanje. kar zna kovanec in morda še kaj o Vrednost čistega zlata je enaka za VSE zlatnike  razredna spremenljivka (static) Programiranje 1 – VSŠ Informatika . ji ni potrebno posredovati 794: // podrobnih navodil. ki vrne vrednost zlatnika. o "razširjanje" objektov o Naredimo načrt za razred Zlatnik  Kovanec s posebnimi lastnostmi o public class Zlatnik : Kovanec o Vsaka zlatnik "je in zna" vse. množenje  Kvadratne matrike / class KvMatrike : Matrike  Ker je razred izpeljan – ni potrebno na novo pisati metod za seštevanje.Kvadrat(40). … o Hierarična zgradba razredov o Vrhnji objekt:  Object  Iz njega izpeljani vsi drugi razredi  » : Object« (deluje iz razreda Object)  Ima metodo ToString()  Zato jo "imajo" vsi razredi o “specializacija” objektov Sestavi razred Zlatnik. ampak le ukaz za risanje kvadrata 795: 796: zelvak. ki deduje iz razreda Kovanec. odštevanje.C# . množenje  Možne dodatne operacije  Inverz.

// obicajna gostota g/cm^3 842: public static double OBI_CISTOST = 0. // obicajna cistost 843: 844: /* TA del NE spada v razred.C# .81. kar smo podedovali. ce se ni nobenega zlatnika! 816: 817: // "GET" metode 818: public int PovejPolmer() { } 819: public int PovejVisino() { } 820: public double PovejGostoto() { } 821: public double PovejCistost() { } 822: public static double PovejVrednostCistegaZlata() { } 823: // vrednost lahko zvemo tudi. 803: // za vse zlatnike je to enako! 804: 805: private int polmer. 841: public static double OBI_GOSTOTA = 19. ce se ni nobenega zlatnika! 824: 825: // tostring 826: override public string ToString() { } 827: // podedovana tostring metoda nam ne ustreza! 828: 829: // "znanje" 830: public double Volumen() { } 831: public double Povrsina() { } 832: public double Vrednost() {} 833: } S krepko. NET 101 ZLATNIK -SKICA 800: public class Zlatnik : Kovanec { 801: 802: private static double vrednostCistegaZlata = 125.4.pravi program ga NE BI vseboval !! 847: Programiranje 1 – VSŠ Informatika . Tega ne pišemo v razredu!! RAZRED ZLATNIK 834: public class Zlatnik : Kovanec { 835: 836: private static double vrednostCistegaZlata = 125. 808: private double cistost.3. je podedovan iz razreda Kovanec – 845: tukaj ga napisemo v komentar le zaradi preglednosti pri 846: učenju . ležečo pisavo smo označili tistio. 837: // za vse zlatnike je to enako! 838: 839: private double gostota. 809: // "SET" metode 810: public bool NastaviPolmer(int r) { } 811: public bool NastaviVisino(int visina) { } 812: public void NastaviGostoto(double x) { } 813: public void NastaviCistost(double x) { } 814: public static void NastaviVrednostCistegaZlata(int v) { } 815: // vrednost lahko spreminajmo tudi. 840: private double cistost. 807: private double gostota.4. 806: private int visina.

// pravilnost podatkov! } // "SET" metode /* TA del NE spada v razred. // pravilnost podatkov! } public static void NastaviVrednostCistegaZlata(int v) { // vrednost lahko spreminajmo tudi.gostota = OBI_GOSTOTA. double gostota. // obicajni polmer public static final int OBI_VISINA = 1. this. public static final int OBI_POLMER = 3.cistost = OBI_CISTOST. // največja moţna visina */ // konstruktorji public Zlatnik() : base() { // Ustvarimo običajni kovanec s klicem // konstruktorja razreda Kovanec ( : base() ) this.C# .pravi program ga NE BI vseboval !! public bool NastaviPolmer(int r) public bool NastaviVisino(int visina) */ public void NastaviGostoto(double x) { // ce uporabnik poskusi gostoto nastaviti na napačno vrednost // uporabimo privzeto gostoto this. double cistost) : base(polmer. visina)” this.cistost = SmiselnaCistost(cistost). // največji moţni polmer public static final int NAJ_VISINA = 1. visina) { // "drugacni" zlatnik // ce ni ustreznih dimenzij.gostota = SmiselnaGostota(x). // gostota in cistost sta posebej! // konstruktor v kovancu je poskrbel // za kontrolo mer! // Poklicali smo ga s kodo “: base(polmer. // obicajna visina public static final int NAJ_POLMER = 3. // pravilnost podatkov! this. ce se ni nobenega zlatnika! Programiranje 1 – VSŠ Informatika . naredimo "obicajni" kovanec. } public Zlatnik(int polmer. private int visina. int visina.gostota = SmiselnaGostota(gostota).cistost = SmiselnaCistost(cistost). je podedovan iz razreda Kovanec – tukaj ga napisemo v komentar le zaradi preglednosti pri učenju . } public void NastaviCistost(double x) { // ce uporabnik poskusi cistost nastaviti na napačno vrednost // uporabimo privzeto cistost this. NET 102 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: private int polmer.

je podedovan iz razreda Kovanec – tukaj ga napisemo v komentar le zaradi preglednosti pri učenju . } // tostring public override string ToString() { return "Polmer: " + base.Volumen()* gostota * cistost * vrednostCistegaZlata. } // pomozne metode private static double SmiselnaGostota(double gostota) { // vrne smiselno gostoto final double DOPUSTNO_ODSTOPANJE = 0.gostota + " cistost: " + this.gostota.polmer! " visina: " + base. } public static double PovejVrednostCistegaZlata() { return vrednostCistegaZlata.1.cistost.PovejPolmer() + // zakaj ne gre // this.pravi program ga NE BI vseboval !! // volumen in povrsina public double Volumen() public double Povrsina() */ public double Vrednost() { // vrednost je volumen * gostota * cistost * vrednost enote // metodo volumen dobimo iz Kovanca! return base. NET 103 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: if (v > 0) vrednostCistegaZlata = v. je podedovan iz razreda Kovanec – tukaj ga napisemo v komentar le zaradi preglednosti pri učenju .C# . } public double PovejCistost() { return this. // vsaka pozitivna vrednost je OK } // "GET" metode /* Ta del NE spada v razred.PovejVisino() + " gostota: " + this. Programiranje 1 – VSŠ Informatika .pravi program ga NE BI vseboval !! public int PovejPolmer() public int PovejVisino() */ public double PovejGostoto() { return this.cistost. } /* Ta del NE spada v razred.

visina) { 991: // "drugacni" zlatnik 992: // ce ni ustreznih dimenzij. double gostota.cistost = SmiselnaCistost(cistost).gostota = SmiselnaGostota(x). 987: } 988: 989: public Zlatnik(int polmer. brez robnih vrednosti cistost = OBI_CISTOST. int visina.Abs(gostota .cistost = OBI_CISTOST. 975: // za vse zlatnike je to enako! 976: 977: private double gostota.gostota = OBI_GOSTOTA. // pravilnost podatkov! 997: } 998: 999: // "SET" metode 1000: public void NastaviGostoto(double x) { 1001: // ce uporabnik poskusi gostoto nastaviti na napačno vrednost 1002: // uporabimo privzeto gostoto 1003: this. return cistost. // pravilnost podatkov! 996: this. } // ce so podatki "neumni" RAZRED ZLATNIK - ZARES 972: public class Zlatnik : Kovanec { 973: 974: private static double vrednostCistegaZlata = 125.C# . 1004: } 1005: 1006: public void NastaviCistost(double x) { 1007: // ce uporabnik poskusi cistost nastaviti na napačno vrednost Programiranje 1 – VSŠ Informatika .gostota = SmiselnaGostota(gostota).OBI_GOSTOTA) / OBI_GOSTOTA). naredimo "obicajni" kovanec.3. 986: this. 978: private double cistost. // obicajna cistost 981: 982: // konstruktorji 983: public Zlatnik() : base() { 984: // "obicajni" zlatnik 985: this. NET 104 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: } double rel_razlika = (Math. // obicajna gostota g/cm^3 980: public static double OBI_CISTOST = 0.4. 993: // gostota in cistost sta posebej! 994: // konstruktor v kovancu je poskrbel za kontrolo mer! 995: this. // ce so podatki "neumni" return gostota. } private static double SmiselnaCistost(double cistost) { // vrne smiselno cistost if ((cistost <= 0) || (cistost >= 1)) // cistost naj bo med 0 // in 1.81. if (rel_razlika > DOPUSTNO_ODSTOPANJE) gostota = OBI_GOSTOTA. 979: public static double OBI_GOSTOTA = 19. 990: double cistost) : base(polmer.

1. // pomozne metode private static double SmiselnaGostota(double gostota) { // vrne smiselno gostoto final double DOPUSTNO_ODSTOPANJE = 0. // lokalna konstanta double rel_razlika = (Math. // ce so podatki "neumni" return gostota.PovejPolmer() + " visina: " + base.gostota. } public static double PovejVrednostCistegaZlata() { return vrednostCistegaZlata. } Programiranje 1 – VSŠ Informatika .Volumen() * gostota * cistost * vrednostCistegaZlata.cistost.gostota + " cistost: " + this. } private static double SmiselnaCistost(double cistost) { // vrne smiselno cistost if ((cistost <= 0) || (cistost >= 1)) // cistost naj bo med // 0 in 1.PovejVisino() + " gostota: " + this. ce se ni nobenega zlatnika! if (v > 0) vrednostCistegaZlata = v. } // tostring public override string ToString() { return "Polmer: " + base. // pravilnost podatkov! } public static void NastaviVrednostCistegaZlata(int v) { // vrednost lahko spreminajmo tudi. } public double PovejCistost() { return this. brez robnih vrednosti cistost = OBI_CISTOST. // vsaka pozitivna vrednost je OK } // "GET" metode public double PovejGostoto() { return this.C# .OBI_GOSTOTA) / OBI_GOSTOTA). // ce so podatki "neumni" return cistost.Abs(gostota . } public double Vrednost() { // vrednost je volumen * gostota * cistost * vrednost enote return this.cistost = SmiselnaCistost(cistost). NET 105 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: } // uporabimo privzeto cistost this.cistost. if (rel_razlika > DOPUSTNO_ODSTOPANJE) gostota = OBI_GOSTOTA.

Osnova: razred ZajecNov Kakšne spremembe so potrebne? Napačne lastnosti:  OsnovaSerijska ni OK  Prav tako MAX_TEZA Dodati lastnosti:  Barva kožuha  Get/set metodi:  denimo. 1065: z1.PovejSerijsko()).WriteLine(z1). Programiranje 1 – VSŠ Informatika .WriteLine(z1). da mu zanj pripravimo podoben program. ampak pri nas zajci postanejo ovce.nastaviBarvo("rdeča"). ampak farmo ovac. NET 106 Iz muhe slon Ne. 1064: System.Console. 1063: System.C# .metoda bi vračala serijsko iz zajcev!! Uporaba 1060: public class Ovce { 1061: public static void Main(string[] ar) { 1062: Ovca z1 = new Ovca().WriteLine(z1. Poleg tega. da ovce redi za zakol.Console. iz muhe ne bomo naredili slona.Console. 1067: System.Console. da si tudi ovce barvajo kožuhe Popraviti konstruktor in dodati metodo ToString:  V razredu ZajecNov smo nanjo pozabili! Prekrite metode o o o o o o V predniku (neposrednem ali posrednem) definirana metoda nam ne ustreza Predefiniranje: prekrite metode Overriding Enak podpis metode kot pri predniku – velja naša definicija ToString() določilo override "Umazane" podrobnosti o o o o o o o base() serijska ponovno! ker zaradi private ne moremo do serijska iz ZajecNov PovejSerijska() na novo enaka že v ZajecNov Razlog: nova spremenljivka serijska če ne navedemo . da hoče. da vodimo še barvo njihovega kožuha. zato bi rad.spremeniTezo(12). ki je bil tako navdušen nad našim programom za vodenje farme zajcev.  Posebno nad metodo MeNapojiti() je bil navdušen! A žal on ne vodi farme zajcev. Pri nas se je oglasil bogati Rus. prodaja tudi njihove kožuhe.PovejSerijsko()). 1068: z1. 1066: System.WriteLine(z1.

Ustrezno popravi konstruktorje. le da upoštevaš zahteve vladarja Fiksnije. ki bo tak. s katerim predstavimo kovance. da mu zanj pripraviš podoben program.WriteLine(z1 z1. 1070: } 1071: } + " Vredna sem " + Zgledi Vaje Razred Kovanec Sestavi razred Kovanec. da si tudi ovce barvajo kožuhe ). ohraniš vse metode razreda Zlatnik na zunaj enake. ampak farmo ovac. da pripraviš razred BoljsiZlatnik. kjer je bila osnovna enota zlatnik. da vodimo še barvo njihovega kožuha. ki bo prekrila metodo toString iz razreda Zajec in bo vrnila smiselen izpis podatkov o ovci. Svetovalci so ga opozarjali. a le navidezno. torej tako. prodaja tudi njihove kožuhe. Denimo. ki vsebuje spremenljivke o private int steviloNog. Iz razreda Zajec izpelji razred Ovca. a na koncu le popustil. da hoče. da ne bodo omogočale sprememb. z danim polmerom in višino. Zlatnik ima poleg osnovnih lastnosti kovanca podano še gostoto materiala.8)). da bo vse ostalo nespremenjeno. iz katerega je izdelan. Razred Ovca Pri tebi se je oglasil bogati Rus. da ovce redi za zakol. ki vrneta površino in volumen kovanca. Zato so mu svetovali. Napiši get in set metode za nastavljanje in branje dodanih komponent. o private String vrsta. naj obdrži vse možnosti razreda Zlatnik. Poleg tega. torej je razredna spremenljivka ( static) Razred BoljsiZlatnik V deželi Fiksniji so se odločili prevzeti finančni sistem dežele Spremenije.Console. Tvoja naloga je. da bo vsa stvar videti preveč diktatorska. NET 107 1069: System. Vladar Fiksnije se je temu dolgo upiral. kot Zlatnik iz Spremenije. ki nastavijo in vrnejo vrednosti lastnosti in za pretvorbo v niz. Napiši tudi metodo toString . Zival Sestavi razred Zival. o private String ime. naj razred pozna še metodi. Namig: Vrednost čistega zlata je enaka za VSE zlatnike. zato bi rad. Vsebuje tudi konstruktor brez parametrov. ki je bil tako navdušen nad tvojim programom za vodenje farme zajcev. Vendar on ne vodi farme zajcev. in metode za nastavljanje in spreminjanje le-teh. da so kovanci okrogli. ki vrne vrednost zlatnika. Programiranje 1 – VSŠ Informatika . razredu Ovca dodaj lastnost barvaKoţuha in napiši get in set metodo za to lastnost (recimo. čistočo zlata (podano z realnim številom med 0 in 1) in vrednost čistega zlata na masno enoto. Zahteval pa je: V deželi bodo le ene vrste zlatniki in njihove lastnosti se ne smejo spreminjati. ki postavi spremenljivke na smiselno začetno vrednost. a jih predrugačiš tako. Razred Zlatnik Sestavi razred Zlatnik.C# . Poleg konstruktorjev in standardnih metod. opisan v razredu Zlatnik. Razred naj pozna tudi metodo double Vrednost(). če ne bo na voljo vsaj navideznih možnosti sprememb.Vrednost(12. ki deduje iz razreda Kovanec.

} //metoda vrne globino kvadra public int VrniGlobinO() { return globina. sirine in globine ena public Kvader() { sirina = visina = globina = 1. NastaviGlobino(globina). da lahko uporabnik od zunaj preko metod NastaviSirino. //ustvarimo kvader visine. } } //nastavi sirino kvadra . 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: public class Kvader { private int sirina.zaenkrat to pustimo ob strani. globina. Izpišite jih! Vzemi razred Kvader in iz njega izpelji razred Kocka.C# . } //ustvarimo kvader dane sirine. int globina. } //metoda vrne visino kvadra pub lic int VrniVisinO() { return visina. visina. kjer ustvariš nekaj kock in izpišeš njihovo površino in volumen. Seveda obstaja problem. da so podatki pravilni public Kvader(int sirina. Dodaj mu konstruktor.pazi na pravilnost podatkov! public void NastaviGlobino(int globina) { if(globina >= 0) { this. kjer ustvarite 5 živali in jim nastavite smiselno vrsto in imena ter število nog. } //metoda vrne sirino kvadra public int VrniSirino() { return sirina.globina = globina. NET 108 Dopolnite razred z metodo public string toString(). NastaviGlobino in NastaviVisino spremeni našo kocko v kvader . višino in globino (objektne spremenljivke v razredu Kvader).pazi na pravilnost podatkov! Programiranje 1 – VSŠ Informatika { . ki naj izpiše podatke o razredu v obliki: #Ime: je vrste #vrsta in ima #steviloNog nog. NastaviVisino(visina). Pri tem seveda zamenjajte #vrsta in #steviloNog z vrednostmi v istoimenskih spremenljivkah. } //nastavi globino kvadra . Nato napišite testni program. int visina) NastaviSirino(sirina). globine in visine //pri tem pazimo na to. ki sprejme le en parameter in pravilno nastavi širino. Sestavi tudi testni program.

Nato vsakemu objektu nekajkrat (naključno mnogokrat) spremenite pasmo in število nog. da bo starost vedno med 1 in 25 let.sirina = sirina. Razred naj vsebuje dodatne metode: o o public void NastaviSteviloPik(int pike): poskrbi za to. Razred Dalmatinec Iz razreda Pes izpelji razred Dalmatinec. da bo število pik med 1 in 1000. Namig: razredne spremenljivke (ključna beseda: static).VrniGlobino() * this. Razred naj vsebuje dodatne metode: o public void NastaviPasmo(String pasma): če uporabnik "podtakne" prazen niz.VrniSirino() * this. da vam namesto petih živali ustvari pet objektov tipa Pes. } } public int Volumen() { return this.VrniSirino() * this. public int VrniSteviloPik() Programiranje 1 – VSŠ Informatika . Poskrbi tudi. } } //nastavi visino kvadra .C# . dopolnite testni program tako. da bo osnovni konstruktor razreda Pes nastavil vrsto na pes.VrniGlobino(). Razred Pes Iz razreda Zival izpelji razred Pes.VrniSirino() * this. Denimo. NET 109 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: public void NastaviSirino(int sirina) { if(sirina >= 0) { this. število nog na štiri ter pasmo in starost postavil na smiselno vrednost (naredite tabelo vsaj desetih pasem in izbirajte med njimi). o public int VrniStarost() Seveda boste za hrambo dodatnih podatkov rabili nekaj dodatnih objektnih spremenljivk. Ko boste ustvarili razred. in sicer: o o o koliko objektov smo tekom delovanja programa ustvarili? kolikokrat smo prebrali število nog? kolikokrat smo spremenili pasmo? Dopolni program tako.VrniVisino() * this.visina = visina. } public int return 2 2 2 } } Povrsina() { * this.pazi na pravilnost podatkov! public void NastaviVisino(int visina) { if(visina >= 0) { this. naj vrže napako! o public String VrniPasmo() o public void NastaviStarost(int starost): poskrbite. da bo na koncu delovanja te podatke izpisal. da nas zanima statistika ustvarjanja objektov.VrniVisino() + * this.VrniVisino() + * this.VrniGlobino().

izpiši vse. Console.name = name. numMexicans. 868: else if(country. 864: this. string country. 858: private string country. a = new CharZ('a'). public class CharZ { private static char c = 'a'. več naj bo vreden.c = c. metodami v razredu? Katere izmed spodnjih trditev o dinamičnih/statičnih spremenljivkah v razredu so pravilne?  Za dostop do statične spremenljivke oz.GetChar() + ". 860: private static int numCanadians.equals("Canada")) 867: numCanadians++. Ali se sledeča koda prevede? Kaj izpiše? 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 3. Več ko ima pik. 865: this. in sicer naj bo vsaka pika vredna 1000 . 859: private int age. Naloge brez računalnika 1. Dopolni testni program tako. b = new CharZ('b').GetChar()).C# .country = country. public CharZ(char c) { this. NET 110 o public int VrniVrednost(): vrne vrednost dalmatinca glede na njegovo starost in število pik. numOther = 0. Poleg tega je še omejitev na zgornjo in spodnjo ceno: dalmatinec ne more stati več manj kot 10000SIT in ne več kot 1000000 SIT. Poišči med njimi najdražjega in ga izpiši! Če je taki dalmatincev več. } } public static void Main(string[] argc) { CharZ a.equals("Mexico")) 871: numMexicans++.age = age. } Sledeča koda predstavlja razred atleta na olimpijskih igrah. Kakšna je razlika med statičnimi in dinamičnimi spremenljivkami oz.  Za dostop do dinamične spremenljivke oz.  Če posebej ne poudarimo.#steviloLet tolarjev. b. 2. } public char GetChar() { return c. dostopa do statične spremenljivke. metode ne potrebujemo primerka razreda. 870: else if(country. 856: public public class Athlete { 857: private string name. Programiranje 1 – VSŠ Informatika . int age) { 863: this.  Objekt razreda lahko kliče statično metodo oz. metode ne potrebujemo primerka razreda. numAmericans. 861: 862: public Athlete(string name. da ustvariš 100 dalmatincev z naključnim številom pik.WriteLine("a: " + a.equals("USA")) 869: numAmericans++. " + " b: " + b. 866: if(country. je metoda statična.

"Canada". NET 111 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: } else numOther++. če bi bila spremenljivka country v zgornji kodi javna? Napiši funkcijo public void setCountry(String country).GetAge(). } public String GetCountry() { return country.  a1 = a3.39).  a2.  a1.  Athlete a3 = new Athlete("Hamm".  a1.age + 1."USA".IncreaseAge().GetAge()."Canada".IncreaseAge().  a2.IncreaseAge().country = "Mexico". ali je potrebno paziti na še kaj drugega? Razred Pes II Razred Pes ima nekaj pomankljivosti. } public void IncreaseAge() { age++. ki bo spremenila vrednost države.  a1 == a2.  Athlete a1 = new Athlete("Gretzky".31).age = a2.  a1.  a2. } Ustvarimo dva nova objekta Athlete a1 = new Athlete("Lewis"."USA".  a4.30).  a2. Kateri izmed spodnjih stavkov niso v pravilni obliki? Zakaj?  a1. Ali je dovolj popraviti le spremenljivko country.GetAge(). in sicer: o o uporabnik lahko spremeni število nog uporabnik lahko spremeni vrsto živali Programiranje 1 – VSŠ Informatika .GetAge(). } public string GetName() { return name.  a3.C# .GetAge(). Athlete a2 = new Athlete("Johnson".  a2.  a1 == a3.GetName(). Kaj pravilni stavki pomenijo in kakšen učinek imajo? Kaj bi šlo lahko narobe. } public int GetAge() { return age.28).

kjer ustvariš 100 naključnih dalmatincev. Popravi tudi testni program za razred Zival! denimo. Pazi na to. Zato spremeni razred Pes tako. v drugo pa na isto mesto vpišemo število nog. ki nastavi oz. da mu dodate konstruktor. Ker pa poznamo prekrivanje metod. ki sprejme vrsto. višino in globino kocke. le uporabnik je ne more klicati "od zunaj". kar pa ni najlepša rešitev. da preveriš podatke preden jih nastaviš! Ustvari tudi testni program. da bo konstruktor razreda Kocka. na "pes". da smo uporabniku popolnoma onemogočili dostop do metod za spreminjanje števila nog in vrste živali. NastaviGlobina in NastaviVisina iz razreda Kvader? Novi razred Kocka tudi preizkusi: ustvari testni program. ki je preko konstruktorja nastavil višino.naj enostavno ne naredita nič! Če metode res delujejo kot je potrebno preverite s testnim programom. naj uporabnika vpraša še za število nog in pokliče star konstruktor. napiši tudi konstruktor. širino in globino kvadra na enake vrednosti (dolžino stranice kocke). Problem smo rešili tako. Vprašanje: kako lahko sedaj iz razreda Kocka kličemo metode NastaviSirina. da je uporabnik lahko od zunaj preko metod nastaviSirino. Razred Dalmatinec iz prejšnjih vaj dopolni z lastnostma maksimalna hitrost (celo število med 10 in 50 kilometrov na uro) in položaj (položaj dalmatinca v ravnini . NastaviGlobino in NastaviVisino baznega razreda. ki sprejme pasmo in ime psa. da spremenite tip metode v protected. da nas pri razredu Zival moti. Pri tem bodi pozoren na veljavnost podatkov! Prekrij tudi metodo public string ToString(). nastaviGlobino oz. da prekriješ metodi za nastavljanje števila nog in vrste živali . NET 112 Problema se lotimo na sledeč način: o spremenite razred Zival tako. znamo to storiti bolje: prekrij metode za nastavljanje globine. kjer v prvo vpišemo nekaj pasem. hiter in ima naključno mnogo pik). Metodo sedaj lahko uporabljamo interno v razredu in v vseh iz njega izpeljanih razredih. pravilno nastavi tudi število nog živali. kjer je uporabnik lahko spreminjal vrsto živali in število njenih nog preko metod v razredu Zival. vrne dolžino stranice kocke. Če mu pasma ni poznana. kjer narediš tabelo vsaj 100 kock z naključno dolgimi stranicami med 10 in 100 enot. saj le te preverijo tudi pravilnost podatkov! uporabniku onemogočite spreminjanje števila nog in vrste živali tako. Podoben problem kot pri razredu Kocka smo imeli tudi pri razredu Pes. Spremeni kodo tako.C# . klical konstruktor razreda Kvader in mu podal širino. širine in višine v razredu Kvader tako. Razred mora seveda imeti tudi metode za branje oz. ki kot parameter dobi dolžino stranice kocke. o o o V nei prejšnjih vaj smo iz razreda Kvader izpeljali razred Kocka. ki sprejme vse parametre. Ustrezno popravite tudi testni program. Razred Kocka je nastavil višino. Med njimi poišči kocki z največjo površino in prostornino ter ju izpiši. ki sprejme le ime in pasmo živali in pravilno nastavi število nog. da v primeru poznane vrste (takšne. širino in globino kocke v konstruktorju z uporabo metod NastaviSirino. Nato med njih na Programiranje 1 – VSŠ Informatika . ki jo ustvarjamo (torej tri enaka števila). višino in globino. da je naključno star. saj bosta za vse objekte tipa Zival vedno enaki) string[] pasme in int[] steviloNog. položaja dalmatinca. Zato razred dopolnite z dvema razrednima tabelama (torej tipa static. Razredu Kocka dodaj tudi dodatni metodi public void NastaviStranico(double a) in public double PreberiStranico(). število nog in vrsto živali pa nastavi na 4 oz. ker moramo za vse vrste živali podajati število nog. Poizkusi jim nastaviti širino. spreminjanje hitrosti oz. nastaviVišino našo kocko spremenil v kvader. ki je v naši tabeli). kjer poskusite spremeniti vrsto in število nog objekta tipa Pes. o napišite nov konstruktor v razredu Pes. ki pripada tej vrsti. čeprav je to pravzaprav že v naprej znan podatek. dopolni metodo nastaviVrsto tako.je spremenljivka tipa Tocka. ki smo jo naredili v eni prejšnjih nalog). število nog in ime živali in jih nastavi na smiselne vrednosti. ki so razporeni na naključnih lokacijah na ravnini (naključni dalmatinec pomeni. Za nastavljanje uporabite metode NastaviXyz. da bodo spreminjale edino mero za kocko. Obstajal pa je problem.

To je lastnost razreda in ne posameznega objekta! maksimalna nosilnost embalaže . spola in starosti. se sme tip izbrati le izmed nekaj v naprej definiranih... obliki embalaže: za obliko veljajo enaka pravila kot za tip. težo in starost. Poišči tudi najbližja in najbolj oddaljena dalmatinca in ju izpiši. Sestavi tudi primerne konstruktorje (vsaj dva) in prekrij metodo ToString. Tja premakni tudi metode za branje in spreminjanje teh lastnosti in dodaj smiselne konstruktorje.). Sestavi testni program. dodatne lastnosti embalaže pa so močno odvisne od materiala. ki se poveča vsakič ko se ustvari nov objekt tipa Embalaza in metodo. koliko embalaže so izdelali. kateri jo bo dobil prvi? Izpiši ga. ki vsebuje lastnosti:    vrsta plastičnega materiala. Denimo. Ko to končaš. le da zaenkrat poznamo le oblike: kocka.o.C# .. iz katerega je narejena ta embalaža (izbira iz nekaj vnaprej definiranih možnosti) temperaturno območje. če veš. NET 113 naključno točko vrži klobaso.o. ki vrača njeno vrednost. Smiselno bi bilo. naj bo nastavljena na 0. ki predstavljajo dovoljene tipe embalaže. ceno izdelave: ker cene izdelave za splošno embalažo ne poznamo. iz katerega je embalaža izdelana. da moraš v obstoječih konstruktorjih razreda žival postaviti te lastnosti na smiselno vrednost.o Podjetje Embi d. barvo embalaže: barva je lahko poljuben neprazen niz. da direktno povemo tip embalaže kot niz ali pa tako. ki so narejene iz določene vrste plastike! Programiranje 1 – VSŠ Informatika . Zato iz razreda Embalaza izpelji razred PlasticnaEmbalaza. starost in spol premakeš v osnivni razred žival (ker so lastnosti vsake živali). da se v trenutku ko klobasa prileti med njih vsi dalmatinci naenkrat zapodijo ponjo. da nas trenutno najbolj zanima plastična embalaža. Če predpostavimo. kjer ustvariš tabelo desetih zajcev nakjučne teže. ki so sedaj na voljo že v razredu žival. v katerem je embalaža primerna za skladiščenje. da podamo indeks tipa embalaže v tabeli tipov. V ta namen bo potrebno v razred dodati razredno spremenljivko. Če tak tip embalaže ne obstaja. V razredu Embalaza zato definirajte tabelo nizov. bi morali sedaj vsi psi in zajci imeti spol. plastične.) in oblik (kocka. piramida. Poleg osnovnih lastnosti iz razreda Zival naj pozna še: o o o težo zajca v kilogramih (med 0 in 50 kilogramov (Garfield)) spol zajca (spremenljivka tipa bool) starost zajca (med 0 in 20 let) Sestavi tudi metode za spreminjanje in branje teh lastnosti. Poleg tega podjetje zanima tudi. Sestavi jim osnovni razred za vse embalaže Embalaza. Preveri to s testnim programom! Embi d..     Seveda mora razred vsebovati metode za nastavljanje in branje teh lastnosti ter vsaj konstruktor brez parametrov.. Tip embalaže naj bo možno spremeniti tako. Tako kot v razredu Pes prekrij metodi razreda Zival za nastavljanje števila nog in vrste živali. Če si stvari zastavil pravilno. naj se vrže napaka.odvisna od vrste plastičnega materiala in je enaka za vse embalaže.. maso embalaže: pozitivno število. Poznamo vsaj plastično in kartonsko embalažo. vzemi razreda Pes in Zajec tej jima odstrani lastnosti.o. ki naj vrže napako. Poleg tega ne pozabi. na kakšni temperaturi jo lahko skladiščimo. kovinske. Zajec iz živali Iz razreda Zival izpelji razred Zajec. Nato med njimi poišči najtežjega samca in samico ter ju izpiši. da lastnosti kot so teža. Nikakor pa ne smete dodati metode za spreminjanje te vrednosti! Zakaj? Seveda je takšna embalaža še povsem neuporabna (ne vemo npr. ki ustvari embalažo s smiselnimi lastnostmi.). tetraeder in valj. da vsaka embalaža vsebuje podatke o:  tipu embalaže: ker izdelujejo le končno mnogo tipov embalaže. izdeluje embalaže vseh vrst (kartonske.

901: } 902: 903: public Vozilo(int steviloKoles. če je pomembna tudi oblika embalaže? Denimo. ki bo ustvaril naključno mnogo plastičnih in kartonastih embalaž (a vsaj 100 vsake vrste) in jih shrani v tabelo. Predpostavi. da letalski prevoznik sprejme le embalažo v obliki kocke. Izdelava v obliki tetraedra podraži izdelavo za 20%. ki pove koliko kilogramov tovora še lahko spravimo v embalažo. Ker se metodologija testiranja lahko spremeni. a ne večja od neke v naprej določene vrednosti. Vsebuje naj metodo. koliko embalaže si ustvaril tekom programa.torej tak. se lahko tudi največja nosilnost velikokrat spremeni. 895: private int maxHitrost. Opomba: z "najprimernejša" seveda mislimo najcenejša. 900: steviloKoles = 4. Razred preveri na enak način kot razred PlasticnaEmbalaza. izdelava v obliki valja pa za 35%. NET 114   ali je primerna za skladiščenje hrane: nekatere vrste plastike niso primene za skladiščenje hrane. če namesto hrane želimo prepeljati računalniško opremo iste teže? Kaj pa. Vsebuje naj tudi metodo. Ker pa je stvar odvisna tudi od načina izdelave. 899: maxHitrost = 100. Razred naj vsebuje tudi nekaj smiselnih konstruktorjev. 894: private string barva. Katera embalaža je najbolj ugodna v tem primeru (torej v prej ustvarjeni tabeli embalaž upoštevaj le tiste. Na koncu še izpiši. ki so v obliki kocke)? Ustvari tudi razred KartonEmbalaza. ki pove. da vsaka plastična embalaža stane enako za kg. ki stane najmanj (oblika ni pomembna. Vemo. Pri tem si lahko pomagaš le z lastnostmi razreda Embalaza. string barva) { Programiranje 1 – VSŠ Informatika . Je linearno odvisna od mase emblaže(v embalaži. in jo dobimo na podlagi testiranja našega plastičnega materiala. da je ta embalaža vedno primerna za hrano. Razred tudi preizkusi: ustvari tabelo 100 plastičnih embalaž z naključnimi začetnimi podatki. najprimernejša za prevoz strojenih kož mase 2 kg katerekoli oblike. najprimernejša za prevoz hrane teže 100 kg v obliki kocke. najprimernejša za prevoz strojenih kož mase 20 kg v obliki tetraedra. lahko shranimo 5kg tovora). ki tehta 1kg. Ali nas stane kaj manj.C# . ki naj ima iste lastnosti kor razred PlasticnaEmbalaza. Vaje "peš" 1. ki je shranjena v maksimalni nosilnosti embalaže. pomembno pa je. Cena je odvisna od teže te embalaže. Podana imaš razreda 892: public class Vozilo { 893: public int steviloKoles. cena za kg embalaže: koliko stane 1kg plastične embalaže. v kateri bi lahko prepeljali hrano težko 10kg. a ima nižjo nosilnost kot plastična embalaža (embalaža teže 1kg zdrži le okrog 2kg tovora) in nekoliko nižje stroške izdelave (izdelava embalaže težke 1kg nas stane 900 SIT). 896: 897: public Vozilo() { 898: barva = "bela". Med njimi nato poišči takšno embalažo. ki bo:     najprimernejša za prevoz hrane teže 1 kg v obliki valja. Nato med njimi poišči tako. da je material ustrezen . koliko stane določena plastična embalaža. ter od oblike. da dovoljuje pakiranje hrane). je potrebno to posebej povedati za vsak objekt posebej. Sestavi testni program.

barva.barva.steviloKoles.barva = barva. 918: } 919: 920: 921: public Tovornjak Klonirajv1() { 922: return new Tovornjak(this. this. 933: } 934: 935: public int JeHitrost() { 936: return this. 954: this.barva.maxHitrost = 100.steviloKoles = 8. 929: } 930: 931: public void Hitrost(int mh) { 932: this.barva = barva.maxHitrost. 937: } 938: public string Barva() { 939: return this.maxHitrost).maxHitrost. 951: 952: public Tovornjak() : base() { 953: nosilnost = 1000.barva.maxHitrost. 928: this.steviloKoles = steviloKoles. int maxHitrost) { 910: this. this. 912: this. 923: this. 911: this. 913: } 914: 915: public Tovornjak Klonirajv0() { 916: return new Tovornjak(this. string barva. 907: } 908: 909: private Vozilo(int steviloKoles. 946: } 947: 948: } in 949: public class Tovornjak : Vozilo { 950: private int nosilnost. 940: } 941: 942: override public string ToString() { 943: return "Avtomobil barve " + barva + " s " + 944: steviloKoles + " kolesi razvije najvecjo hitrost " 945: + maxHitrost. 1000).steviloKoles. this. 905: this. 917: this. 906: this.maxHitrost = mh. NET 115 904: this. Programiranje 1 – VSŠ Informatika . nosilnost). 924: } 925: 926: public Tovornjak Klonirajv2() { 927: return new Tovornjak(this.steviloKoles.maxHitrost = maxHitrost.C# .steviloKoles = steviloKoles.

. NET 116 955: } 956: 957: public Tovornjak(string barva) : base(8.nosilnost = 10000.out. 996: Vozilo a = t. this. 973: } 974: 975: public Vozilo Klonirajt0() { 976: return new Vozilo(this. int maxHitrost) : 965: base(steviloKoles. 977: } 978: 979: public Vozilo Klonirajt1() { 980: return new Vozilo(this. barva) { 971: this. 999: System.WriteLine(t).println(tt). 998: System. this.barva()). 992: } 993: } o o o kateri konstruktorji v razredu Tovornjak so sintaktično pravilni? Razloži katere od metdo Klonirajv0.barva. 985: a. this. 997: Tovornjak tt = t. 967: } 968: 969: public Tovornjak(int steviloKoles. 1001: } Programiranje 1 – VSŠ Informatika 500).Console.nosilnost.steviloKoles. maxHitrost) { 966: this.Klonirajv2(). 70.WriteLine (a).Console.Barva() + " s " 991: + steviloKoles + " kolesi ima nosilnost " + this.Hitrost(maxHitrost).maxHitrost). 987: } 988: 989: public override string ToString() { 990: return "Tovornjak barve " + this. 986: return a.JeHitrost()). "zelena".steviloKoles. barva) { 958: } 959: 960: public Tovornjak(int maxHitrost) : this() { 961: this. string barva.nosilnost = nosilnost. barva.maxHitrost = maxHitrost. this.Klonirajt2().Hitrost(this. string barva. Klonirajv1.C# . int maxHitrost.Klonirajt2(). Klonirajt0 in Klonirajt1 so nepravilne in zakaj! kaj izpiše stori spodnja koda 994: public static void Main(string[] argc) { 995: Tovornjak t = new Tovornjak(8. 972: this. 981: } 982: 983: public Vozilo Klonirajt2() { 984: Vozilo a = new Vozilo(this.barva()). 970: int nosilnost) : base(steviloKoles. 1000: System. 962: } 963: 964: public Tovornjak(int steviloKoles.steviloKoles.

NastaviSteviloPik(100).steviloPik = 100. Denimo.C# . Programiranje 1 – VSŠ Informatika . public Dalmatinec() { this. m) d. false pa moški spol. da bo parameter zagotovo znak 'm' ali 'f'. Morali boste torej napisati konstruktor razreda Dalmatinec. ki ima lastnosti ime in število pik. Dopolnite razred tako. 1024: private int steviloPik. NET 117 6.steviloPik = 0. 1022: public class Dalmatinec { 1023: public string ime.ime = "Pika". da smo želeli sestaviti razred Dalmatinec. k) d.NastaviIme("Pika"). d. this. Koda razreda je: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: public class Dalmatinec{ public string ime. ki sprejme kot parameter znak za spol. Kateri način je pravilen? Pri nepravilnih povej. d. kaj in zakaj ni pravilno. } public void NastaviSteviloPik(int steviloPik) { this. d. private int steviloPik. d.NastaviSteviloPik(100).ime = "Pika". Predpostavite.ImePsa("Pika"). c) spol se nastavi le ob ustvarjanju objekta. n) nobeden. ki v primeru samca vrne 'm'. Ta naj bo kot zgoraj 'm' za samca in 'f' za samico.NastaviSteviloPik(100). i) d.steviloPik = steviloPik. d.ime = "Reks". h) d. da bo zadoščal naslednjim trem pogojem: a) Spremenljivka spol naj ne bo dostopna izven razreda Dalmatinec b) obstaja naj metoda kaksenSpol. d.NastaviIme("Pika"). Interno (znotraj razreda) naj logična vrednost true pomeni ženski.steviloPik = 100. } } V glavnem programu smo ustvarili objekt Dalmatinec z imenom d in mu želimo nastaviti število pik na 100 in ime na Pika. } private void NastaviIme(string ime) { this. } public void ImePsa(string ime) { ime = this. j) d. Ta podatek bomo hranili v spremenljivki spol. ker tega sploh ne moremo storiti Sedaj želimo našemo razredu Dalmatinec dodati tudi podatke o spolu psa. l) d. v primeru samice pa 'f'.ime.steviloPik = 100.ImePsa("Pika").ime = ime.

PlasticnaEmbalaza in KartonEmbalaza. ki mora biti valjaste oblike in mora imeti nosilnost vsaj 200% višjo. Poišči najprimernejšo embalažo. Halo Kitajc Po koncu prejšnje naloge morate imeti tri razrede: Embalaza. kot je dejanska masa zdravila. oblik. Programiranje 1 – VSŠ Informatika o o .ime = "Reks". Upoštevajte. že imamo. Prevozniki so podjetje opozorili. Pomagaj jim izbati najprimernejšo embalažo.ime = ime.naročil naj bo vsaj 100 in ko enkrat neko embalažo porabiš.ime. je ne smeš več uporabiti. ki prešteje število samcev v tabeli dalmatincev. za transport mleka hočejo le tetraedre. } // kakšen spol ima (metoda kaksenSpol) // PO POTREBI DOPOLNI // DO SEM } Predpostavimo. da so embalaže različnih tež. da je zapakirano v embalaži iz plastike tipa HDPE ali PETE.. Zato poleg vsakega naročila izveš še. Poišči najcenejšo! Za dostavo nekega zdravila zdravniška zbornica zahteva. Ker so se sklenili porabiti zalogo. Sestavi metodo public static int steviloSamcev(Dalmatinec[] dalmatinci). Tako na letala sprejemajo le embalažo v obliki kocke. ki zadošča zgornjim kriterijem. če za vsako naročilo poznaš težo blaga.. this.C# .steviloPik = 0. za vsako naročilo posebej vzamejo najprimernejšo (beri najcenejšo) embalažo. zato jih naključno generirajte. } // PO POTREBI DOPOLNI // DO SEM public void ImePsa(string ime) { ime = this.. tipov plastike. če ti povedo maso zdravila. NET 118 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: // PO POTREBI DOPOLNI // DO SEM // konstruktorji public Dalmatinec() { this.steviloPik = steviloPik. } public void NastaviSteviloPik(int steviloPik) { this. da vsaka oblika embalaže ni primerna za vse vrste transporta. } private void NastaviIme(string ime) { this. Kitajc!" se je nabralo kar nekaj kosov plastične in kartonske embalaže (1000 kosov vsake). varv. ki je ustrezna. da razred. kakšne oblike naj bo embalaža.. ki ga je potrebno dostaviti in ali je blago hrana. Podatke o naročilu naključno generiraj . Uporabite jih za rešitev sledečih problemov: o Podjetu "Halo.

v katerem je to število zapisano v bazi radix.3). Dopolni razred Naloga1 s statično metodo. Takšen vektor namesto z običajno tabelo predstavimo s seznamom neničelnih elementov. int radix) . potreben za predstavitev redkega vektorja.      konstruktor public Trojisko (int vrednost). int radix). Zmnozi(Trojisko a).indeks 1065: // vektor je UREJEN po drugi komponenti! 1066: // morebitne nicelne elemente izpustimo! 1067: 1068: ???? 1069: } 1070: 1071: ??? int SteviloClenov() Programiranje 1 – VSŠ Informatika . Seznam je naraščajoče urejen po indeksih.1).(5.6)} + {(3. ki vzame število i in vrne niz. metodo public int Vrednost().1).3). sestavi ustrezni razred. ki zmnoži trenutni objekt z Pri tem si lahko pomagaš z metodama :  public static int ParseInt(String parse. konstruktor public Trojisko (Trojisko a). ki vsebuje veliko ničel.C# .(-1. Če je število negativno. ki ustvari nov objekt. v katerem hranimo števila v trojiškem zapisu kot nize z obveznim predznakom. klic ConvertToString (-3. ki ustvari nov objekt. za pozitivno število pa plusa pred niz ne doda! Torej klic ConvertToString (3. ki vrne vrednost tega objekta. a brez predznaka.(5. Primer (neformalen zapis!): {(2.1).(8. ki jim je ostala. ki predstavlja število vrednost. Tako število 13 zapišemo kot '+111'. kjer poleg vsakega elementa hranimo še indeks tega elementa v tabeli. Rezultat naj bo nov redek vektor (sumanda ostaneta nespremenjena). da je v tem času embalaža v obliki kocke izgubila 10%. koliko denarja lahko dobijo s prodajo vse embalaže.koeficient 1064: // vektor[i][1] .(3. Na osnovi sheme razreda RedekVektor podane spodaj. ki vrne število v trojiški obliki.  public static string ConvertToString(int i. število -5 pa kot '-12'.3) pa niz “-10”.15)} = {(5.3) vrne niz “10”. če je le-ta pozitiven. emblaža v obliki valja 20% in embalaža v obliki tetraedra 30% svoje vrednosti.(8. Razred naj vsebuje:  konstruktor public Trojisko(). ki vsebuje število v številskem sistemu z bazo radix v število tipa int. v katerem hranimo število z vrednostjo 3. metodo override public String ToString(). Redki vektorji Redek vektor je vektor. Trojiško Sestavi razred Trojisko. ki pretvori niz parse. Pomagaj jim in izračunaj skopno vrednost vseh vrst embalaže če veš. metodo public Trojisko objektom a in vrne rezultat. na začetek niza zapiše minus. NET 119 o Na koncu leta so v podjetju delali inventuro in zanimalo jih je. ki ustvari kopijo objekta a.2).15)} 1057: public class RedekVektor 1058: { 1059: ???????? 1060: 1061: ??? RedekVektor(int[][] vektor) 1062: { 1063: // vektor[i][0] .2). ki sešteje dva redka vektorja.6).(3.(1.

System. {3. ki naredi osebo z imenom Janez in priimkom Novak. RedekVektor v3 = Vsota(v1.Console. Programiranje 1 – VSŠ Informatika . } // staticna metoda vsota !! ???????? } Plavalec Podan imamo razred Oseba z objektnima metodama VrniIme() ter VrniPriimek() (ki nam vrneta niza. {1. 15}}. int[][] podatki2={{3.C# . 6}. v2).2}. Iz zgoraj opisanega razreda Oseba.WriteLine("Vsota = " + v3).{0. System.1}.Console.Console. ki poleg imena in priimka vsebuje še podatke o:   starosti plavalca (celo število med 10 in 80 let) ter stilu plavanja plavalca (niz).{-1.{5. {8.WriteLine("V1 = " + v1). RedekVektor v1 = new RedekVektor(podatki1). RedekVektor v2 = new RedekVektor(podatki2). NET 120 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: { // stevilo clenov redkega vektorja ???? } ???? Koeficienti() { // tabela koeficientov ????? } ???? int[] Indeksi() { // tabela indeksov ???? } ??????? } public class Naloga1 { public static void Main(string[] param) { int[][] podatki1={{2. System. ki poleg zgoraj omenjenih metod pozna še metode za nastavljanje imena (NastaviIme) in priimka (NastaviPriimek) ter konstruktor Oseba().3}.1}.WriteLine("V2 = " + v2). ki predstavljata ime oz. 5}. 6}}. priimek osebe). izpeljite razred Plavalec.

Iz zgoraj opisanega razreda Oseba. kjer namesto #ime. nastavimo najljubši stil plavanja na "vseeno" (torej shranimo podatek 0). Vanjo naj se zapiše vrstica Plavalec #ime #priimek plava #slog. priimek in stil plavanja). ki podatke o plavalcu zapiše v datoteko z imenom imeDatoteke. priimek.C# . ki poleg imena in priimka vsebuje še podatke o:  najljubšem stilu plavanja plavalca (indeks ustreznega stila. Razredi in objekti (osnove) Programiranje 1 – VSŠ Informatika . Če parametri niso pravilni. #priimek ter #slog vstavite prave vrednosti (v datoteki naj bo izključno ta vrstica). ter metode za branje in spreminjanje lastnosti (pri tem pazite na pravilnost podatkov) plavalca. ki ustvari podanega plavalca. #priimek ter #slog vstavite prave vrednosti. Vsebuje naj tudi objektno metodo public void Zapisi (string imeDatoteke).txt. če je "vseeno" in je niz "vseeno" v tabeli na začetku. v tabeli stilov ne obstaja. ki je star 20 let in plava kravl konstruktor s štirimi parametri (ime. ki predstavljata ime oz. ki plava prsno. tem mestu v tabeli. ter podatke o njem zapišite v datoteko c:\plavalec. pa imamo shranjeno 0) možnih stilih plavanja (tabela nizov) – tabela vsebuje vsaj nize "vseeno". kjer namesto #ime. izpeljite razred Plavalec. naj se ustvari privzeti plavalec. Vanjo naj se zapiše vrstica Plavalec #ime #priimek plava #slog. Sestavite tudi testni program. ki poleg zgoraj omenjenih metod pozna še metode za nastavljanje imena (NastaviIme) in priimka (NastaviPriimek) ter konstruktor Oseba(). kjer ustvarite plavalca Danijel Ančimer. NET 121 Vsebuje naj dva konstruktorja:   privzetega. ter potrebni metodi za branje (vrne naj opisno ime stila iz tabele stilov in ne indeks) in spreminjanje najljubšega stila posameznega plavalca (parameter je ime stila). starost in stil plavanja). naj se ustvari privzeti plavalec. ki plava kravl konstruktor s tremi parametri (ime. da najraje plava prsno. ki ustvari plavalca Janeza Novaka. Sestavite tudi testni program. ki ustvari plavalca Janeza Novaka. starega 20 let.txt. ki naredi osebo z imenom Janez in priimkom Novak. ki ustvari podanega plavalca. ki ustrezna vnosu iz spodaj omenjene tabele – če je npr. priimek osebe). kjer ustvarite plavalca Danijel Ančimer. v tabeli stilov plavanja niz "prsno" na 2. in želimo za tega plavalca povedati. Tabela se nikoli ne spreminja!  Vsebuje naj dva konstruktorja:   privzetega. ki najraje plava prsno. Če parametri niso pravilni. ki podatke o plavalcu zapiše v datoteko z imenom imeDatoteke. Plavalec II Podan imamo razred Oseba z objektnima metodama VrniIme() ter VrniPriimek() (ki nam vrneta niza. "kravl" in "prsno". imamo tu shranjeno 2. Vsebuje naj tudi objektno metodo public void Zapisi (string imeDatoteke). ki označuje stil. ter podatke o njem zapišite v datoteko c:\plavalec. Če parameter pri tej metodi.

Kot primer kreirajmo razred krog. saj nismo upoštevali drugega načela enkapsulacije: dostopnost. smo pred temeljno odločitvijo. spremenljivke.PI * polmer * polmer. NET 122 Razred . itd. Potem. ki jim pravimo tudi polja razreda ( npr. polmer kroga) in pa lastnosti (properties) – o lastnostih bo več zapisanega kasneje.class Pojem razred (class) je temeljni pojem objektno (predmetno) orientiranega programiranja. zapisano med dvema zavitima oklepajema. ki v sebi združujejo lastnosti (atribute oz. Prav to pa je natanko tisto. Sveta trojica predmetno usmerjenega programiranja so pojmi enkapsulacija. ki operirajo nad temi podatki. ki so jo poimenovali razred – class. lahko jih zaustavimo. kar nam ponujajo moderno zasnovani objektno orientirani programski jeziki. spada v notranjost razreda. dedovanje in polimorfizem Enkapsulacija Glavni del pojma enkapsulacija predstavlja besedica kapsula: enkapsulacija pomeni postaviti nekaj v kapsulo. da gre za pojem oz. njihove lastnosti (atribute) in operacije nad njimi. podatke) in operacije nad njimi oz obnašanje (metode). Razred – class je programska struktura. Kot primer iz vsakdanjega življenja vzemimo pojem avto: vsi avtomobili imajo nekaj skupnih zmožnosti (lahko jih usmerjamo oz. vse kar pa je pred prvim oklepajem in za zadnjim oklepajem pa je zunaj razreda. ki ji sledi ime razreda. vodimo. pogonski motor. pospešujemo.). Deklaracijo novega razreda začnemo z rezervirano besedico class. ki zagotavlja sintakso in semantiko za podporo teh dveh dveh temeljnih načel enkapsulacije. Prav zaradi tega so tudi programerji prišli na idejo. da bi posamezne pojme. private in protected pa lahko kontroliramo. nato pa še telo razreda. da ima vidno (javno) površino in nevidno (zasebno) notranjost. ko smo enkapsulirali metode in polje znotraj razreda. metoda za ploščino). kaj naj bo javno. class krog { double Ploscina() //metoda razreda { return Math. ) in nekaj skupnih lastnosti oz. Kreirati nov razred pomeni sistematično urediti podatke in informacije. podatek (polmer kroga). kar je običajen pojav tudi v vsakdanjem življenju in ne velja le za programiranje. Gre torej za kombinacijo metod in podatkov znotraj razreda. ki vsebuje eno metodo (za izračun ploščine kroga) in eno lastnost oz. Ko torej pomislimo na avto. Omogočajo definicijo novih razredov. Microsoft Visual C#. objekte ki si delijo prej omenjene skupne lastnosti in zmožnosti. z drugimi besedami za kontrolo uporabe razreda. razvrščanje pojmov v neko celoto je torej temeljna spretnost. Površino predstavljajo podatki in operacije. klasifikaciji. Klasificiranje oz. } double polmer. Tudi v svetu programiranja poznamo dve pomembni uporabi oz razlagi pojma enkapsulacija:   Princip. kot je npr. Vsak predmet ali pojem si lahko ponazorimo s kapsulo. ki je lastna vsem ljudem in brez katere si težko zamišljamo. združili v neko celoto. //polje razreda } Tako deklariran razred krog pa nima praktične uporabe. V telesu razreda so metode (npr. Vse kar smo zapisali med zavita oklepaja v razredu. atributov ( imajo volanski obroč. ki od zunaj niso dostopni. ter manipulacije nad njimi v neko pomensko celoto. v kateri se nekaj nahaja. katere metode in polja bodo dostopna tudi od zunaj: Programiranje 1 – VSŠ Informatika . Notranjost pa so zasebni deli predmeta. Za kapsulo je značilno. kako bi ljudje razmišljali in komunicirali med seboj. Takšno urejanje podatkov in informacij je nekaj. Notranje podatke in procese navzven skrijemo – gre torej za kontrolo dostopa do metod in podatkov v kapsuli. takoj vemo. Z besedicama public. ki jih lahko od zunaj spreminjamo. kako v enoto združimo podatke in metode. z drugimi besedami razvrščanju oz. kaj pa zasebno.C# . kolesa itd.

. moramo biti prepričani. //NAPAKA – uporaba neinicilaizirane spremenljivke To pravilo velja seveda za vse spremenljivke.PI * polmer * polmer. celoštevilčnega tipa Console. Tako polje oz. Deklaracijo našega razreda krog sedaj napišimo še enkrat. //deklaracija spremenljike i. Krog K //deklaracija spremenljivke k. ki ji pravimo tudi objekt. uporabili tudi izven razreda. kadar je vidno le znotraj razreda.C# . oz. Novo spremenljivko (nov objekt oz. ki je tipa Krog (razred) Console. celoštevilčnega tipa Console.WriteLine(K). } private double polmer. Metoda ali polje je mišljeno kot javno (public). da je metoda oz. Console. Metodo Ploscina bomo v tem primeru lahko poklicali oz. //OK!! //ali pa takole int j. Seveda pa velja. da pred tipom metode oz. Tokrat bomo metodo Ploscina deklarirali kot javno metodo. ki so izpeljane (ustvarjene) iz razreda pa vrednosti ne moremo prirejati tako kot spremenljivkam osnovnih (vrednostih) tipov. metodo deklariramo tako. //OK!! Spremenljivkam. razred nima praktične uporabe. polja postavimo besedico private. Če hočemo razred. NET 123    Metoda ali polje je mišljeno kot privatno (private). class Krog { public double Ploscina() //javna metoda razreda { return Math. kot temu pravimo v svetu objektnega programiranje. metodo deklariramo tako. neposrednega dostopa do polja polmer pa ne bomo imeli. kadar je dostopno le znotraj razreda. polja postavimo besedico public. ki je celoštevilčnega tipa //deklaracija spremenljivke K ki je tipa Krog (razred) Če hočemo uporabiti vrednost katerekoli spremenljivke. ne glede na njihov tip. da če so vse metode in polja znotraj razreda privatne. Novo spremenljivko tipa Krog lahko deklariramo tako kot vsako drugo spremenljivko. int i. da pred tipom metode oz. polje private. moramo kreirati novo spremenljivko tega tipa. j = 10. //zasebno polje razreda } Če metode ali polja ne deklariramo kot public ali pa private. kadar je dostopno tako znotraj. kot tudi izven razreda. bo privzeto. Uporabiti moramo rezervirano besedo new in za naš razred poklicati ustrezen konstruktor.WriteLine(i).WriteLine(j). da ta spremenljivka že ima vrednost. Metoda ali polje je mišljeno kot zaščiteno (protected). Naredimo primerjavo med kreiranjem in inicializacijo spremenljivk osnovnih (primitivnih) podatkovnih tipov in spremenljivk izpeljanih iz razredov (objektov). Tako polje oz. Krog K //deklaracija spremenljike i.WriteLine(i). //deklaracija in inicilaizacija spremenljike i. kreirati moramo novo instanco (primerek) razreda. Osnovna sintaksa je enaka: int i. ali pa v podedovanih (izpeljanih) razredih. novo instanco) razreda Krog torej ustvarimo s pomočjo rezervirane besede new takole: Programiranje 1 – VSŠ Informatika . polje polmer pa kot privatno polje. ki smo ga definirali tudi uporabiti. //NAPAKA – uporaba neinicilaizirane spremenljivke Spremenljivke osnovnih podatkovnih tipov seveda lahko inicializiramo enostavno takole: int i=10.

kvadratura = 2500.kvadratura / hiša. public int stanovalcev.stanovalcev. priimek.WriteLine(). private int letnik. NET 124 Krog K = new Krog(). hiša.visina = visina. //nov objekt razreda Zgradba Zgradba pisarna = new Zgradba()./*ustvarili smo nov objekt razreda Krog: pri tem smo uporabili privzeti konstruktor – to je metodo Krog().C# .kvadratura + " skupna kvadratura\n kvadraturaPP + " kvadratura na osebo").string priimek.int letnik.kvadratura / pisarna.kvadratura = 4200.int visina) { //ker imajo parametri metode enako ime kot polja razreda. pisarna. letnik in višina). } public void IzpisiOsebo() { Programiranje 1 – VSŠ Informatika . pisarna. Razred nima nobene metode. Console. ki ima enako ime kot razred. kvadraturaPP = hiša. private int visina. ter dvema metodama: metodo za prirejanje podatkov posameznim poljem in metodo za izpis podatkov*/ class Oseba { //razred ima štiri zasebna polja private string ime. Primer: class Zgradba//deklaracija razreda Zgradba z dvema javnima poljema. //razred ima tudi dve javni metodi public void VpisiOsebo(string ime. referenco na polje konkretnega objekta this.WriteLine("Pisarna ima:\n " + pisarna. this.ime = ime.stanovalcev + " stanovalcev\n " + pisarna.stanovalcev.stanovalcev = 25.stanovalcev = 4. oz.priimek = priimek. Console. } " + " + Vaja: /*Kreirajmo razred oseba s štirimi polji (ime. K = new Krog(). kvadraturaPP = pisarna.stanovalcev + " stanovalcev\n " + hiša. //nov objekt razreda Zgradba int kvadraturaPP. private string priimek.WriteLine("Hiša ima:\n " + hiša. this. letnik = letnik.ta pomeni referenco na konkreten primerek razreda //(objekt). Console. { public int kvadratura.kvadratura + " skupna kvadratura\n kvadraturaPP + " kvadratura na osebo"). smo za dostop do polj razreda //uporabili rezervirano besedo this . this. */ //Ali pa takole Krog K. // kvadratura na osebo hiša. } static void Main(string[] args) { Zgradba hiša = new Zgradba().

//zasebna tabela ki hrani mesečne zneske prodaje public void inicializacija() //metoda ki inicializira tabelo prodaje { Programiranje 1 – VSŠ Informatika . Console. } } static void Main(string[] args) { avto mojavto=new avto().VpisiOsebo("David". metodo za izračun celoletne prodaje in metodo za izpis celoletne prodaje*/ class Prodajalec { private double[] zneski.ReadLine(). private double teza. //nov objekt tipa avto (nova instanca razreda) mojavto. ju inicializirajmo ter izpišimo njune podatke*/ class avto { //zasebna polja razreda avto private string znamka.Inicializacija(). ki bo imel zasebno polje zneski (tabela 12 števil tipa double). prijateljevavto. nogometas. predsednik.IzpisiOsebo(). NET 125 Console. najvecjahitrost in teza). Console. model. public void Inicializacija()//javna metoda za vnos podatkov o konkretnem avtomobilu { Console. //klic metode za izpis podatkov o avtomobilu //kreiramo še drugi objekt. Oseba predsednik = new Oseba().ToInt32(Console. } public void IzpisPodatkov()//javna metoda za izpis podatkov o konkretnem avtomobilu { Console.Write("\nModel: "). //klic metode za inicializac.Write("\nZnamka: ").Write("\nNajvečja hitrost: ").//nova instanca (primerek) razreda Oseba predsednik. private int najvecjahitrost.Inicializacija(). } Vaja: /*Kreirajmo razred Prodajalec. private string model.WriteLine("Znamka: "+znamka +"\nModel: "+model +"\nNajvečja hitrost: "+najvecjahitrost +"\nteţa vozila: "+teza). 173). "Bush".(vnos) podatkov za konkreten avto mojavto.Write("Ime: " + ime + "\nPriimek: " + priimek + "\nStarost: " + letnik + "\nVišina: " + visina+"\n"). Console. ga inicializiramo in izpišimo še njegove podatke avto prijateljevavto = new avto().ToDouble(Console.ReadLine()). prijateljevavto. 181). teza = Convert. znamka = Console. Nato kreirajmo dva objekta. } } //glavni program static void Main(string[] args) { Oseba nogometas = new Oseba().IzpisPodatkov().C# . ter dvema javnima metodama: metodo za inicializacijo (vnos) polj tega razreda.IzpisPodatkov(). najvecjahitrost = Convert. } Vaja: /*Kreirajmo razred avto s štirimi zasebnimi polji (znamka.ReadLine()). 1980.IzpisiOsebo().ReadLine().Write("\nTeţa vozila: ").VpisiOsebo("George". Console. model = Console. ter javne metode za inicializacijo te tabele: metodo za določanje prodaje za posamezen mesec.WriteLine("\nIzpis podatkov o vozilu:\n").//nova instanca (primerek) razreda Oseba nogometas. 1951. "Becham". ter javno metodo za izpis polj tega razreda.

} public int dolzina()//metoda ki vrne število znakov v stringu { return stavek. for (int i = 1.Write("Vnesi znesek prodaje za mesec "+i+": ").dolzina()+" znakov!"). static void Main(string[] args) { Prodajalec p = new Prodajalec(). for (int i = 0. Console.DolociStavek("Razred mojstring: metodam za delo s stringi smo priredili slovenska imena!"). return vsota. ker v gredo tabeli indeksi od 0 d0 11 else Console.ToDouble(Console.izpisi_letno_prodajo(). Length.. i++) { Console.inicializacija().IzpisStavka()+"\n\nje "+st.ReadLine()). } public void doloci_prodajo(int mesec. i <= 12. } p. //[mesec -1] zato.*/ class mojstring { private string stavek.ZamenjajZnak(" ". } public string IzpisStavka() { return stavek. // tvorba objekta p tipa Prodajalec p. v katerem bomo napisali nekaj javnih metod za delo s stringi. string novi) { stavek = stavek. ki naj pomenijo alternativo obstoječim metodam – npr.C# . ToUpper. //zasebno polje razreda mojstring public void DolociStavek(string st) //metoda za inicializacijo polja stavek { stavek = st. NET 126 zneski = new double[12]. Replace.Length. p.WriteLine("Napačen mesec ali znesek prodaje"). znesek_prodaje = Convert.0. mesec { if (mesec >= 1 && mesec <= 12 && znesek > 0) zneski[mesec . i < 12.doloci_prodajo(i.//presledke nadomestimo z znakom X Programiranje 1 – VSŠ Informatika . i++) vsota += zneski[i].WriteLine("Skupna letna prodaja je : " + skupna_letna_prodaja() + " EUR"). } //metoda za zamenjavo določenih znakov v stringu z novimi znaki public void ZamenjajZnak(string stari. novi). st. //inicializacija tabele zneskov prodaje double znesek_prodaje. double znesek) //Vnos zneska prodaje za posam. } public void izpisi_letno_prodajo() { Console.ToUpper(). } }. } } static void Main(string[] args) { mojstring st=new mojstring(). } Vaja: /*Napišimo razred mojstring.1] = znesek. "X").WriteLine("\nV stavku:\n\n"+st. } public void VelikeCrke() { stavek = stavek.Replace(stari. znesek_prodaje). } public double skupna_letna_prodaja() // funkcija ki vrne skupno letno prodajo { double vsota = 0.. st. .

st. Kranj je blok. Ustvari poljuben objekt. } public double Ploscina() { return Math. ter metodo za izpis statistike tekme. ki poskrbi za inicializacijo polja polmer. za spremljanje košarkaške tekme. za katerega smo zgoraj napisali eno samo metodi in eno polje. nima nobenega tipa (niti void). Njegovo ime je vedno enako kot je ime njegovega razreda. ki naj zgleda približno takole: Na naslovu Cankarjeva ulica 32. polja tipa bool postavi na false.VelikeCrke().ZamenjajZnak("X". Console. 2 točki in 3 točke). nima argumentov. //vse črke v stringu spremenimo v velike črke Console. Konstruktor Konstruktor je metoda razreda. v resnici vsebuje še eno metodo: to je nevidni konstruktor. Ko je nov objekt inicializiran. Ta metoda je povsem enaka.0.Ploscina()). ga avtomatično za nas skreira prevajalnik. lahko dostopamo do njegovih polj in uporabljamo njegove metode. ki ga avtomatično generira prevajalnik. Sestavi razred.C# . Voditi moraš število prekrškov za vsakega tekmovalca (10 igralcev). } Naloge: Napiši razred Kosarka. Krog K = new Krog(). tako kot pri strukturah.IzpisStavka()).WriteLine(K. Do javnih (public) polj (lastnosti razreda) in javnih metod dostopamo s pomočjo operatorja pika.WriteLine(st. ki se uporablja za kreiranje novega primerka (instance) razreda. vrednosti numeričnih polj postavi na 0.PI * polmer * polmer. originalni razred Krog. zadelZa3Tocke in prekrsek. NET 127 Console. število doseženih točk (posebej 1 točka. ki bo v svoja polja lahko shranil ulico.//vse znake "X" nadomestimo s presledki st. Doseganje košev in prekrškov realiziraj preko metode zadelProstiMet(). ga inicializiraj in ustvari izpis. številko nepremičnine ter vrsto nepremičnine. Če konstruktorja ne napišemo sami. Z drugimi besedami. } Konstruktor. zadelZa2Tocki. ker je privzeti konstruktor polju polmer avtomatično dodelil vrednost 0!*/ Primer: /*Kreiraj razred Pravokotnik z dvema poljema (dolţina in višina pravokotnika) in dvema metodama (metoda za izračun ploščine in metoda za izračun obsega pravokotnika. /*Izpis bo seveda enak 0.IzpisStavka()). } private double polmer. določi stranice pravokotnika in s pomočjo metod razreda Pravokotnik izračunaj njegovo ploščino in obseg*/ public class Pravokotnik { Programiranje 1 – VSŠ Informatika . da poskrbi za inicializacijo polj novo kreiranega objekta." "). je vedno public. kot če bi napisali celoten razred takole: class Krog { public Krog() { polmer = 0.WriteLine(st. vsem referenčnim poljem (spremenljivkam) pa priredi vrednost null. Nato ustvari nov objekt tipa Pravokotnik. Namen konstruktorja pa je.

metoda za izpis robu kocke in metoda za izračun prostornine kocke. Console. } public double izpis_Roba() { return rob. //določimo višino pravokotnika Console.WriteLine("Obseg pravokotnika: " + P. Nato ustvari nov objekt tipa Kocka. } public void Nastavi_Rob(double x) //metoda.WriteLine("Ploščina pravokotnika: " + P. //klic metode za izračun //ploščine Console. prostornina ()). da bomo imeli do njih dostop izven razreda public int dolzina. NET 128 //deklariramo polja.ploscina()).C# . //na kopici ustvarimo nov objekt razreda pravokotnik P.1)+1). static void Main(string[] args) { Pravokotnik P = new Pravokotnik(). //določimo dolţino pravokotnika P.NextDouble()*10. //Rob kocke bo naključno realno //število med 1 in 10 Console. //klic metode za izračun obsega } Vaja: /*Kreiraj razred Kocka z enim privatnim poljem (rob kocke) in s tremi javnimi metodami (metoda za določanje robu kocke.dolzina = 10.Round(naklj. public Kocka() //konstruktor (enak je privzetemu konstruktorju) { rob = 0. } public double obseg() //metoda.WriteLine("Rob kocke: " + K. ki izračuna in vrne obseg pravokotnika { return (2*dolzina+2*visina).visina = 8. } public double prostornina() //metoda. ki izračuna in vrne ploščino pravokotnika { return (dolzina*visina).Nastavi_Rob(Math. določi rob kocke in s pomočjo metode razreda Kocka izračunaj njegovo prostornino */ public class Kocka { private double rob. } }. ki komponentama priredi določeni vrednosti. ki omogoča nastavitev roba kocke { rob = x.WriteLine("Prostornina kocke: " + K. Napiši konstruktor. ki v primerni obliki izpiše poljuben objekt tega razreda!*/ Programiranje 1 – VSŠ Informatika . } }. } public double ploscina() //metoda. static void Main(string[] args) { Kocka K = new Kocka(). nov objekt razreda Kocka Random naklj=new Random(). visina=0. ki izracuna in vrne prostornino kocke { return (rob*rob*rob). Napiši še metodo. //polji (lastnosti) razreda sta stranici pravokotnika public Pravokotnik() //konstruktor (naš konstruktor je enak privzetemu konstruktorju!) { dolzina=0. K.obseg()). ki naj predstavljata realno in imaginarno komponento nekega kompleksnega števila.visina.izpis_Roba()). //na kopici ustvarimo novo instanco oz.//klic metode za izračun //prostornine } Vaja: /*Napiši razred Kompleksno z dvema poljema (realna in imaginarna). polja bodo javna (public).

da je konstruktor prav tako metoda (sicer metoda posebne vrste). nato pa pokličimo metodo Ploscina: Krog K = new Krog().Ploscina()). NET 129 class Kompleksno { private int realna. ki imajo enako ime. } private double polmer. imaginarna = imag. zaradi česar bo tudi ploščina objekta Krog vsakič enaka 0. da so lahko preobložene (preobložene metode so metode.WriteLine(K. Z drugimi besedami. } private double polmer. Novi konstruktor ima seveda enako ime kot razred. ki sprejme en parameter in bi kljub temu želeli poklicati Programiranje 1 – VSŠ Informatika . razlikujejo pa se v številu ali pa tipu parametrov). Privzeti konstruktor v vsakem primeru postavi polmer na 0 (ker je polmer private. imaginarna.PI * polmer * polmer.izpisi("alfa").1). ne vrača pa ničesar. //kreiranje novega objekta tipa Kompleksno alfa. Če pa smo napisali lasten konstruktor. } Deklarirajmo novo spremenljivko tipa Krog. Kompleksno beta=new Kompleksno(6. napišemo lahko svoj lasten konstruktor z vrednostjo polmera kot parametrom. } public double Ploscina() { return Math.PI * polmer * polmer. //kreiranje novega objekta tipa Kompleksno alfa. da prevajalnik ne generira privzeti konstruktor.8). za metode pa velja.izpisi("beta"). Rešitev tega problema je v dejstvu. da za nek razred napišemo lasten konstruktor velja.vrednosti { realna = real. int imag) // konstruktor. Console. ki ima deklarirano eno privatno polje (polmer) in javno metodo Ploscina(). } Preobloženi (overloaded) konstruktorji Poglejmo si še enkrat prvotno deklaracijo razreda Krog. } public void izpisi(string ime) //metoda za izpis { Console. //zasebni polji razreda public Kompleksno (int real. } V primeru.WriteLine(ime+" = "+realna + " + " + imaginarna + " * i"). ji priredimo vrednost novega objekta Krog.C# . ga tudi ne moremo spremeniti). class Krog { public double Ploscina() { return Math. } } static void Main(string[] args) { Kompleksno alfa=new Kompleksno(1. ki poljema priredi celošt. Razred Krog bo sedaj izgledal takole: class Krog { public Krog(double inicPolmer) //naš lasten konstruktor { polmer = inicPolmer.

Mesec = obstojeciObjekt. Dan = dt.C# . ... ampak le do statičnih članov. } // kreiranje objektov DateTime trenutniCas = DateTime.Mesec. } // kopirni konstruktor public Cas(Cas obstojeciObjekt) { Leto = obstojeciObjekt. Pred statičnim konstruktorjem nikoli ne napišemo nivoja dostopnosti (besedic private..Year. Dan = obstojeciObjekt. Ker gre za statično metodo (tudi konstruktor je metoda) v njem ne moremo dostopati do nestatičnih članov. vemo pa. } Programiranje 1 – VSŠ Informatika . ki se izvede še preden je iz tega razreda izpeljan katerikoli objekt. da se bo zagotovo izvedel nekje med zagonom našega programa in pred kreiranjem prve instance razreda. } // zasebna polja razreda Cas int Leto.Dan. Kopirni (copy) konstruktorji Kopirni konstruktor je konstruktor.Month. int Mesec. da kopira polja nekega že obstoječega objekta istega tipa.Day.). // kreiranje Cas t3 = new Cas(t). ki jih v konstruktorju ne bomo inicializirali. Cas t = new Cas(trenutniCas).Leto. Primer: public class Sporocilo { public static string Naslov = "Knjiga". static Sporocilo() { Naslov= "C#". public. da bodo vrednosti polj. ki kreira nov objekt tako. objekta t s pomočjo konstruktorja // kreiranje objekta t3 s pomočjo kopirnega konstruktorja Statični (static) konstruktorji Statični konstruktor je konstruktor. Pri tem pa moramo biti pozorni na dejstvo. ampak le besedico static.Now. Kdaj se bo statični konstruktor izvedel ne moremo vnaprej natančno vedeti. } . v katerem je ta konstruktor napisan. int Dan. NET 130 tudi privzeti konstruktor. false ali pa null. Primer: public class Cas { // konstruktor public Cas(DateTime dt) { Leto = dt. še vedno ostala implicitno inicializirana na 0. Mesec = dt. ga moramo napisati sami.

Destruktor se torej izvede. ko se zaključi nek blok. Leto = dt. ki pa naj ga uporabnik ne bo mogel spremeniti. Pomembno je tudi to. Destruktor torej sprosti pomnilniški prostor objekta (prostor. class Krog { .. DanasnjiDatum. ko objekt odmre ( npr.: Console. ki ga zasedajo njegovi podatki). Primer: public class DanasnjiDatum { static DanasnjiDatum() // statični konstruktor { DateTime dt = DateTime.Naslov). da destruktorji za razliko od konstruktorjev ne obstajajo v strukturah – obstajajo le v razredih. Ne sprejema argumentov..Leto = 2009. public static readonly int Dan. V takem priemru označimo da je polje readonly.WriteLine("Leto: {0}". } Ker so polja readonly njihove vrednosti ne moremo spreminjati_ Console. ali pa se zaključi neka metoda. //Izpis: C# Polja tipa readonly Včasih želimo narediti javno polje. enako ime kot razred sam in nima tipa. Destruktor ima enako kot konstruktor. NET 131 Za zagon statičnega konstruktorja ne potrebujemo nobenega objekta. saj lahko do njega dostopamo kar preko imena razreda. za razliko od konstruktorja pa pred destruktorjem stoji še znak '~ '. public static readonly int Mesec. } ~ Krog() //destruktor { .... ki počisti za objektom.Year.. Mesec = dt.C# .Month.Day. } public Krog(double inicPolmer) //drugi konstruktor { . Medtem ko je konstruktorjev določenega objekta lahko več. je destruktor vedno samo eden. npr.WriteLine (Sporocilo. } // zasebna readonly polja razreda public static readonly int Leto. Dan = dt.Now... //NAPAKA: polje Leto je readonly Destruktorji Destruktor je metoda. //izpis trenutne letnice DanasnjiDatum. Med konstruktorjem in destruktorjem pa obstaja še ena velika razlika. v kateri je bil objekt ustvarjen) – pokliče ga torej smetar (Garbage Collector). } } Programiranje 1 – VSŠ Informatika .Leto). //deklaracija polj public Krog() //prvi konstruktor { .

WriteLine("x:{0} .  Razred ima lahko samo en destruktor. Programiranje 1 – VSŠ Informatika . ne glede na to ali je javen ali zaseben. ter konstruktor z dvema parametroma. } static void Main(string[] args) { Tocka A = new Tocka(). se mora torej tudi ime konstruktorja v vsakem primeru začeti z veliko črko. ki naj ima dve privatni polji x in y.  Destruktor se izvede. Drugi konstruktor pa naj ima dva parametra. ko se objekt uniči. privzeti konstruktor. ki obe koordinati postavi na 0. //KLic konstruktorja z dvema parametroma } Vaja: /*Napišimo razred Tocka. } private int x.  Destruktor je metoda razreda. ki bo v oknu izpisal. Imena zasebnih polj in metod naj se začenjajo z malo črko (v zgornjem primeru polmer). s katerima inicializiramo obe polji razreda. y). } public Tocka(int x. y. Imena javnih polj in metod naj se začenjajo z veliko črko (v zgornjem primeru Ploscina). s katerima inicializiramo koordinati nove točke. 800). x. y:{1}". ki izpiše vrednosti obeh polj. Pri tako dogovorjenem poimenovanju je ena sama izjema. Pri poimenovanju zasebnih polj in metod pa se skušajmo držati pravila. ki nja ima dve zasebni polji (koordinati točke). Prvi naj bo brez parametrov in v njegovem telesu le zapišimo stavek. Imena razredov naj bi se začenjala z veliko črko.WriteLine("Klican je bil privzeti konstruktor!"). da je bil ta konstruktor poklican. ter dva lastna konstruktorja. y = 0. Ker pa se mora ime konstruktorja natančno ujemati z imenom razreda. ki ga imenujemo PascalCase (ker je bilo prvič uporabljeno v programskem jeziku Pascal).C# . NET 132 Glede destruktorjev je torej pomembno sledeče :  Destruktor je metoda razreda. Napišimo še metodo. int y) //Preobloţeni konstruktor z dvema parametroma { Console. ki izračuna in vrne razdaljo točke od neke druge točke*/ class Tocka { public Tocka()//lasten privzeti konstruktor { x = 0. Dogovor o poimenovanju Pri poimenovanju javnih polj in metod se skušajmo držati pravila. ki ima isto ime kot razred in dodan prvi znak '~ '. class Tocka { public Tocka()//Konstruktor brez parametrov { Console. ki ga imenujemo camelCase. //Klic konstruktorja brez parametrov Tocka B = new Tocka(600. V telesu drugega konstruktorja napišimo stavek. Primer: Kot primer napišimo razred Tocka. ki nič ne vrača ( pred njo ne sme stati niti void!) in nič ne sprejme.

y = initY.2) + Math.Sqrt(Math. Z osnovnim konstruktorjem določi vrednost (poljubno) vsem komponentam razreda. } static void Main(string[] args) { Tocka A = new Tocka(). Potrebujemo razred.vrniDohodek()+ " EUR"). //Klic konstruktorja z dvema parametroma double razdalja = A. Prvi konstruktor naj ima kot parameter letni dodek zaposlenega. int yRazd = y . Z dodatnim konstruktorjem poskrbi za možnost nastavitve Programiranje 1 – VSŠ Informatika . število opravljenih ur in ali je inštrukcija možna. } Vaja: /*Napišimo razred Zaposleni z enim samim zasebnim poljem (dohodek) in dvema konstruktorjema. y.y. } public Zaposleni(int tedenskiDohodek. Razred naj ima tudi metode in sicer: inštrukcija se opravlja. 800). ki bo omogočal naslednje operacije: dvig.Pow(yRazd. //Klic konstruktorja brez parametrov Tocka B = new Tocka(600.Pow(xRazd. inštrukcija se ne opravlja.WriteLine("Razdalja točke A od točke B je enaka " + razdalja+" enot!"). drugi pa naj imam dva paramera: tedenski dohodek in število tednov. ki bo hranil podatke o objektih tipa Instrukcije z naslednjimi komponentami: vrsta inštrukcije. int initY) //Preobloţeni konstruktor z dvema parametroma { x = initX. //nov objekt. } private int x. Console.druga. 54). //nov objekt. Napišimo še metodo za izpis skupnega dohodka*/ public class Zaposleni { private double dohodek.vrniDohodek()+" EUR" ).WriteLine("Tina ima letni dohodek : " + Tina. izvede se prvi konstruktor Zaposleni Tina = new Zaposleni(550. //Izračun razdalje obeh točk Console. return Math. } Naloge: Sestavi razred denarnica. Začetna vrednost se naj postavi s konstruktorjem. } public double RazdaljaOd(Tocka druga) //metoda za izračun razrdalje od poljubne točke { int xRazd = x . izvede se drugi (preobloţeni) //konstruktor Console.WriteLine("Janez ima letni dohodek : " + Janez. vlogo in ugotavljanje stanja. Ustvari tabelo desetih denarnic z naključno mnogo denarja in jih izpiši.2)). public Zaposleni(int letniDohodek) //konstruktur { dohodek = letniDohodek. int številoTednov)//preobloţeni konstruktur { dohodek = tedenskiDohodek * številoTednov. } } static void Main(string[] args) { Zaposleni Janez = new Zaposleni(20000).C# .x. } public double vrniDohodek() //metoda ki vrne vrednost zasebnega polja dohodek { return dohodek.druga.RazdaljaOd(B). NET 133 } public Tocka(int initX.

ali pa z njeno pomočjo prirejamo (nastavljamo) vrednosti polja. ki ima tri komponente: ime. priimek. se izvede koda. kateremu je naemnjena). ki sprejme vse tri podatke in ustrezno nastavi komponente. Primer: class LastnostDemo { int polje. Na osnovi razreda Instrukcije napiši še testni program. NET 134 začetne vrednosti za vrsto inštrukcije. pri drugem objektu pa z dodatnim konstruktorjem. Lastnosti (properties) v razredih torej uporabljamo za inicializacijo oziroma dostop do polj razreda (objektov). Navzven pa so lastnosti vidne kot spremenljivke. } set //metoda set za prirejanje (nastavljanje) vrednosti lastnosti polje { polje = value. s pomočjo katerega bomo pregledovali rezultate nekega športnega tekmovanja. Sestavi razred Pacient. ali pa vanjo pišemo. Napiši vsaj dva konstruktorja in pripravi ustrezne get/set metode za vse te podatke. priimek.C# . Sestavi razred Tekmovalec. ki predstavlja osnovo za izdelavo programa. ki ima naslednje komponente: startno številko. klub). Lastnost (Property) Polja so znotraj razreda običajno deklarirana kot zasebna (private). krvna_skupina. Ostaja pa še tretji način. konstruktor. priimek in klub. opravljene ure ter ali je inštrukcija možna. } //zasebno polje //konstruktor public int MojaLastnost //deklaracija lastnosti (property) razreda LastnostDemo { get //metoda get za pridobivaje vrednosti lastnosti polje { return polje . v accessor-ju set pa s pomočjo implicitnega parametra value lastnosti priredimo (nastavimo) vrednost. Lastnost (property) je nekakšen križanec med spremenljivko in metodo. Z metodo public string tostring() naj se izpišejo podatki o tekmovalcih (startna številka. zato lastnosti v izrazih in prirejanjih uporabljamo kot običajne spremenljivke. Pomen lastnosti je v tem. da bodo začetne vrednosti pri prvem objektu nastavljene z osnovnim konstruktorjem. ki bo kreiral in izpisal dva objekta razreda Instrukcije in sicer tako. krvna skupina). s pomočjo katere dostopamo do posameznega polja. } } } Programiranje 1 – VSŠ Informatika . ki jo zapišemo pri tej lastnosti. Komponenti ime in priimek naj bosta public. Sestavi razred. da zapišemo ustrezen konstruktor (konstruktorje). Z metodo public string tostring() naj se izpišejo podatki o pacientu (ime. public LastnostDemo() { polje = 0. ki mora biti istega tipa kot lastnost (seveda pa mora biti lastnost istega tipa kot polje. ali pa da napišemo posebno javno metodo (metode) za prirejanje vrednosti polj. Branje in izpis (dostop) vrednosti je znotraj lastnosti realizirana s pomočjo rezerviranih besed get in set – imenujemo ju pristopnika (accessors). Vrednosti jim priredimo tako. ki je najbolj razširjen – za vsako polje lahko definiramo ustrezno lastnost (property). Accessor get mora vrniti vrednost. Napiši vsaj dva konstruktorja: prazen konstruktor. Vsa polja so tipa string. ki vse tri komponente nastavi na "NI PODATKOV". da ko jo beremo. ime. krvna_skupina private. ime. vse tri pa tipa string. priimek.

} public string PolnoIme //javna lastnost razreda { get { return _ime + " " + _priimek. Console. string priimek) //javna metoda razreda { _priimek = priimek. } //Izpis: Polno ime osebe je // Neslon Mandela //Izpis: Polno ime osebe je // George Bush //Izpis: Polno ime osebe je // France Prešeren Za posamezno polje lahko napišemo le eno lastnost.WriteLine("Polno ime osebe je " + politik.MojaLastnost: " + ob.WriteLine("Polno ime osebe je " + politik. //za ime vzamemo prvi string v tabeli _priimek = imena[imena.1].WriteLine("Vrednost ob. Razred naj ima tudi lastnost PolnoIme.PolnoIme).PolnoIme). Console. //zasebno polje Programiranje 1 – VSŠ Informatika .Length .WriteLine("Polno ime osebe je " + politik.MojaLastnost).PolnoIme = "France Prešeren". za prirejanje in vračanje polnega imena osebe (imena in priimka). } Vaja: /*Deklarirajmo razred Oseba z dvema poljema (_ime in _priimek) ter javno metodo za nastavljanje vrednosti obeh polj. politik. Console.MojaLastnost: " + ob. _ime = ime. ob. Console. Console. v kateri s pomočjo stavkov get ali set dostopamo oz. Primer: class MojRazred { double A = 3. Console.MojaLastnost).WriteLine("Originalna vrednost ob. NET 135 static void Main(string[] args) { LastnostDemo ob = new LastnostDemo(). //zasebno polje razreda Oseba private string _ime.Split(' '). } set { string zacasna = value.PolnoIme). //za priimek vzamemo drugi string v tabeli } } } static void Main(string[] args) { Oseba politik = new Oseba(). politik. Besedici get ali set lahko izpustimo in dobimo write-only ali read-only lastnosti. ob. nastavljamo vrednosti posameznega polja. //zasebno polje razreda Oseba public void NastaviIme(string ime.MojaLastnost: " + ob.MojaLastnost"). politik.WriteLine("Prirejanje nove vrednosti -10 za ob. string[] imena = zacasna. //Celotno ime razdelimo na posamezne besede //in jih spravimo tabelo _ime = imena[0].NastaviIme("Nelson".C# .//nov objekt razreda LastnostDemo Console. "Mandela").PolnoIme = "George Walker Bush".WriteLine("Vrednost ob.MojaLastnost).MojaLastnost = -10. Ustvarimo nov objekt in demonstrirajmo uporabo lastnosti PolnoIme*/ class Oseba { private string _priimek.MojaLastnost = 100.

da ne bo prišlo do napačne nastavitve. NET 136 double B = 4. Napiši razred Snov.. koliko kosov je na zalogi in kakšna je cena. kateri tip igrače. ki bo imel tri komponente: imeSnovi. Sestavi razred. napiši glavni program. Prvi dve sta tipa string.. Obe komponenti naj imata tip dostopa private. Napiši vsaj dva konstruktorja: prazen konstruktor. } //lastnost vrne vrednost produkta obeh polj } } static void Main(string[] args) { MojRazred c = new MojRazred(). Sestavi tudi konstruktor brez parametrov. Če bo uporabnik podal napačno kislost. da število igrač ne pade pod nič. ki sprejme celo število med 0 in 100 (%). //nov objekt tipa MojRazred Console. Ne pozabi tudi na smiselno metodo tostring. Sestavi tudi ustrezni get in set metodi. Temu primerno spremeni število igrač na zalogi in pri tem pazi. ki ima tri privatne spremenljivke: tip igrače(tip string). ki naj smiselno izpiše. ne pa tudi set { get { return A * B. Pripravi ustrezne get/set metode za vse te podatke in vsaj dva konstruktorja.C# . da boš tudi v konstruktorju s parametri poskrbel. ki ima za osnovno ploskev kvadrat. če se je število igrač povečalo (dobava novih) ter negativno celo število če se je število igrač zmanjšalo (prodane igrače). ki bo ustvaril pet tipov igrač. ki sprejme pozitivno celo število. sestavi konstruktor s tremi parametri. V kemijskem laboratoriju večkrat preverjamo kislost snovi in jo definiramo s pH vrednostjo. 2 Programiranje 1 – VSŠ Informatika . Kreiraj tabelo snovi in napiši stavke za izpis vseh objektov. Pazi.). površino (v km ) in število prebivalcev. da bo zagotovo pravilen. ki ustvari tabelo 50 naključnih piramid in med njimi poišče piramido z največjo višino. Zato bo ustrezna spremenljivka imela privaten dostop. ki naredi objekt. Napiši get in set metode. napiši ustrezne set in get metode (pazi na smiselne vrednosti spremenljivk). število igrač na zalogi(tip int) ter ceno igrače(tip double). dodaj še metodo zalogaIgrac. Višina in stranica nista nujno celi števili. napiši metodo tostring. Napiši tudi metodo tostring. ki ustvari piramido višine 1 in s stranico osnovne ploskve dolžine 1 konstruktor. V set metodah pazi na smiselnost podatkov (višina in dolžina stranice ne smeta biti negativni.WriteLine("MojaVrednost: "+c. sestavi prazen konstruktor. kjer boš v objektih te vrste hranil ime države. ustvari objekt. V razredu hrani podatke o dolžini stranice osnovne ploskve in višino piramide. napiši metodo znizanaCena. tri izmed njih znižal za 10. zagotovi. ion in kislost. //zasebno polje public double MojaVrednost //MojaVrednost je ReadOnly: vsebuje le get. ki predstavlja vodo. ki sprejme podatka o višini in dolžini stranice osnovne ploskve Napiši program. tretja pa int. da sta neobstoječa. Ker je kislost zelo pomemben podatek o snovi. 20 in 50% ter dvema spremenil zalogo. in nastavi novo ceno igrače. kot jo je vnesel uporabnik. kislino pa pustiš tako. to je za koliko procentov se bo znižala cena igrače. njeno glavno mesto. //prikaz vrednosti lastnosti //MojaVrednost } Naloge: Sestavi razred Piramida.MojaVrednost). Sestavi razred Igrača. ki predstavlja pokončno piramido. ki vrne niz s smiselnim izpisom podatkov o piramidi.. kjer za prva dva podatka napišeš.

Vrednost. Če pomislimo na to. Poleg tega. da najprej kreiramo nov objekt.i.Sqrt) in ne tako.C# .Sqrt(42. return stavek. Tak način uporabe metode pa bi bil neroden. Metodo Sqrt smo namreč vselej poklicali tako. . da vrne string. v glavnem programu Console. ki so tako pomembne. npr takole: Math m = new Math(). pa potem nad njim poklicali metodo Sqrt. je potrebno. v katerem so zapisane osnovni podatki o tem razredu class Tocka { public static string Navodila()//Statična metoda { string stavek="Vsaka točka ima dve koordinati/polji: x je abscisa. } } //Zato.WriteLine(Tocka. ki so prav tako označene kot statične metode. Tan. potem je v teh klicih nekaj čudnega. le-ta nima dostopa do kateregakoli polja definiranega za ta razred. ki so označena kot static (statična polja). metode navedemo ime razreda. To lahko dosežemo le tako. Cos. Podobno je pri ostalih metodah tega razreda (npr. } } Zapomnimo pa si. da pred imenom polja oz. katere naloga je le ta. da tako polje deklariramo kot statično. Kako je to možno? Pogosto se bomo srečali s primeri. da pokličemo statično metodo oz. double d = m.metodah. uporabimo le tako. za katerega uporabo bi potemtakem prav tako potrebovali nov objekt. Uporablja lahko le polja. statičnih poljih oz. Log. Rešitev je v t.//Klic statične metode POTREBUJEMO OBJEKTA!!! Statična polja Tako kot obstajajo statične metode. statično polje NE //Primer klica npr. ko metode ne bodo pripadale objektom (instancam) nekega razreda. Metoda Sqrt (in seveda tudi druge metode razreda Math) je tako znotraj razreda Math deklarirana kot statična. . Kadar pa je metoda ali pa polje deklarirano kot statično (static). Včasih je npr. potem bi za njeno uporabo morali najprej kreirati nov objekt tipa Math. kako smo jo v vseh dosedanjih primerih uporabili (poklicali). kot vemo že od prej. V C# morajo biti vse metode deklarirane znotraj razreda. Programiranje 1 – VSŠ Informatika . da statično metodo ne kličemo tako kot objekt. Kadar definiramo statično metodo.Navodila()). NET 137 Statične metode Za lažje razumevanje pojma statična metoda. da smo pred njo navedli ime razreda (Math. Primer: Napišimo razred točka in v njem statično metodo.24). To so uporabne metode. da imajo vsi objekti določenega razreda dostop do istega polja. …). Če bila metoda Sqrt običajna metoda objekta izpeljanega iz nekega razreda. je namreč neodvisna od objekta. Metoda Sqrt je tipičen primer take metode. si oglejmo metodo Sqrt razreda Math. lahko statična metoda kliče le tiste metode razreda. Razred Math prav tako vsebuje polje PI (iracionalno število Pi). y je ordinata!". lahko tako metodo ali pa polje uporabimo tako. da bi najprej naredili nov objekt tipa Math. Sin. obstajajo tudi statična polja. da so neodvisne od kateregakoli objekta. takole: class Math { public static double Sqrt(double d) { . Ne-statične metode lahko. ki jo v tem primeru želimo izračunati in uporabiti.

case 3 : Console.Konstanta). { Nekaj c=new Nekaj().C# . public Nekaj() { stevilo++. deklarirana konstanta PI razreda Math.WriteLine("Sedaj smo pa ţe več kot trije! Skupaj nas je ţe "+stevilo).//Statično polje } //Zato. . Tako je npr. v tej vrstici smo ţe trije. break. da pokličemo statično metodo oz. Programiranje 1 – VSŠ Informatika .Hello(). Primer: class Test { public static double kons1 = 3.WriteLine("V tej vrstici sem sam !!"). { Nekaj b=new Nekaj().WriteLine(Test.Hello(). NET 138 class Test { public const double Konstanta = 20. //Konstantno polje je avtomatično tudi statično . statično polje NE POTREBUJEMO OBJEKTA!!! Console.Hello().14. še nekdo je tukaj.//klic statičnega polja Vaja: class Nekaj { static int stevilo=0. //konstruktor c. break. case 2 : Console. } } } static void Main(string[] args) { Nekaj a=new Nekaj(). break. } //Statično polje // Konstruktor //število objektov se je povečalo public void Hello() { if (stevilo>3) { Console. Besedica static pri deklaraciji konstantnega polja NI potrebna. { Nekaj d=new Nekaj().WriteLine("Opala. } switch (stevilo) { case 1 : Console. v tej vrstici sva dva!!"). } } } } //Konec programa-> Garbage Collector poskrbi za za a za b za c za d uničenje vseh objektov Polje razreda je lahko statično a se njegova vrednost ne more spremeniti: pri deklaraciji takega statičnega polja zapišemo besedico const (const = Constant – konstanta). //Statično polje public const double kons = 3.1416. //konstruktor b. //konstruktor a.Hello(). pa je polje še vedno statično.").WriteLine("Aha. Konstantno polje je torej avtomatično statično in je tako dostopno preko imena razreda in ne preko imena objekta! Vrednost statičnega polja se NE da spremeniti. //konstruktor d. .

je takale: class IzpeljaniRazred : BazičniRazred { .kons= Test. Opredeljuje torej odnos med posameznimi razredi. razred Kit. kot so npr.kons + 1. . kopita ali pa plavuti pa lahko dodatno postavimo v razred Konj oz. in obenem deklarirali.WriteLine(Test. V Microsoft C# bi lahko za ta primer modelirali dva razreda: prvega bi poimenovali Sesalec. ki je prav tako podedovan iz razreda Sesalec. da so vsi konji sesalci (obratno pa seveda ne velja!). Razred poimenujmo Tocka: class Tocka //bazični razred { public Tocka(int x. s katerim se izognemo ponavljanju pri definiranju različnih razredov. Tako konji kot kiti počnejo vse kar počnejo sesalci nasploh (dihajo zrak. Seveda pa je lahko razred. Kot primer za sesalce vzemimo npr. Podobno lahko deklariramo razred z imenom Kit. …. …).WriteLine(Test. da pokličemo statično polje NE POTREBUJEMO OBJEKTA!!! Console. s katero želimo povedati. s katerim bomo lahko delali objekte. //OK -> Statično polje LAHKO spremenimo Test.kons1= Test. } Izpeljani razred deduje od bazičnega razreda.kons1 + 1.C# .//klic statičnega polja Console. ki podeduje nek bazični razred. . imajo kopita. Na ta način bi med sesalci in konjem vzpostavili povezavo v tem smislu. Vzemimo pojem sesalec iz biologije.//klic konstantnega statičnega polja Test. ki pa imajo več ali manj značilnosti skupnih. in drugega Konj. ki pa jih konji nimajo. NET 139 } //Zato.. s katerim bi lahko predstavili točko v dvodimenzionalnem koordinatnem sistemu. ki bodo znali narediti nekaj uporabnega. a prav tako pa imajo nekatere svoje značilnosti (konji imajo npr.kons). da je Konj podeduje (inherits) Sesalca. Bazični razredi in izpeljani razredi Sintaksa. Dedovanje je torej orodje. kiti plavuti. //NAPAKA -> Konstantnega polja ne moremo spremeniti Dedovanje (Inheritance) – izpeljani razredi Kaj je to dedovanje Dedovanje (Inheritance) je ključni koncept objektno orientiranega programiranja. lahko razred v C# deduje največ en razred in ni možno dedovanje dveh ali več razredov. Primer: Radi bi napisali razred. int y) { //telo konstruktorja } //telo razreda Tocka } //konstruktor Sedaj lahko definiramo razred za tridimenzionalno točko z imenom Tocka3D. Smisel in pomen dedovanja je v tem. štiri noge. obratno pa imajo npr. ki jih kiti nimajo. konje in kite. zopet podedovan v še bolj kompleksen razred.kons1). . da iz že zgrajenih razredov skušamo zgraditi bolj kompleksne. ki bodo predstavljali točke v tridimenzionalnem koordinatnem sistemu in po potrebi dodamo še dodatne metode: class Tocka3D : Tocka //razred Tocka3D podeduje razred Tocka { //telo razreda Tocka3D – tukaj zapišemo še dodatne metode tega razreda! Programiranje 1 – VSŠ Informatika . skotijo žive mladiče. Za razliko od C++. ki jo uporabimo za deklaracijo. da razred podeduje nek drug razred. Lastnosti.).

Zaradi tega mora konstruktor v izpeljanem razredu poklicati konstruktor svojega bazičnega razreda.y) { //telo konstruktorja Tocka3D } //telo razreda Tocka3D } Če bazičnega konstruktorja v izpeljanem razredu ne kličemo eksplicitno (če vrstice :base(x. kako lahko kreiramo objekte iz izpeljanih razredov. Tocka D = C. a ta polja je potrebno ob kreiranju novega objekta inicializirati. //NAPAKA . class Tocka //bazični razred { //telo razreda Tocka } class Tocka3D: Tocka //razred Tocka3D podeduje razred Tocka { //telo razreda Tocka3D } Iz razreda Tocka izpeljimo še dodatni razred Daljica class Daljica:Tocka //razred Daljica podeduje razred Tocka { //telo razreda Daljica } Kreirajmo sedaj nekaj objektov: Tocka A = new Tocka(). bo prevajalnik avtomatično zgeneriral privzeti konstruktor. V ta namen se uporablja rezervirana besedica base: class Tocka3D : Tocka ////razred Tocka3D podeduje razred Tocka { public Toca3D(int z) :base(x. //OK! Programiranje 1 – VSŠ Informatika . Ker pa vsi razredi nimajo privzetega konstruktorja (v veliko primerih napišemo lastni konstruktor).y) //klic bazičnega konstruktorja Tocka(x. Izpeljani razred avtomatično vsebuje vsa polja bazičnega razreda. Tocka3D B = A.POZABILI smo klicati bazični konstruktor razreda Tocka { //telo konstruktorja Tocka3D } //telo razreda Tocka3D } Določanje oz. Če klic izpustimo (ali ga pozabimo napisati) bo rezultat prevajanja compile-time error: class Tocka3D : Tocka //razred Tocka3D podeduje razred Tocka { public Tocka3D(int z) //NAPAKA .različni tipi Tocka3D C = new Tocka3D (). prirejanje razredov Poglejmo še.C# . moramo v konstruktorju znotraj izpeljanega razreda obvezno najprej klicati bazični konstruktor (rezervirana besedica base). nam prevajalnik zgenerira privzeti konstruktor).y) ne napišemo!). Kot primer vzemimo zgornji razred Tocka in iz njega izpeljani razred Tocka3D. NET 140 } Klic konstruktorja bazičnega razreda Vsi razredi imajo vsaj en konstruktor (če ga ne napišemo sami.

Izpis: Program se bo sicer prevedel in tudi zagnal. da se pri dedovanju v izpeljanih razredih ime metode ponovi – v izpeljanem razredu torej napišemo metodo. bo uporabnik morda pričakoval. //razred Tocka3D je izpeljan iz razreda Tocka //dodatno polje razreda Tocka3D //Metoda Izpis prepiše istoimensko metodo razreda Tocka public void Izpis() { Console. } } nam bo prevajalnik zgeneriral opozorilo. še boljša rešitev pa je ta. število in tipi parametrov se ujemajo z metodo bazičnega razreda. } } Vaja: Programiranje 1 – VSŠ Informatika .Izpis prekrije metodo Tocka. class Tocka //bazni razred { private int x. a opozorilo moramo vzeti resno.Write("z = " + z + "\n"). Če namreč napišemo razred. ki bo podedoval razred Tocka3D. da gre za NOVO metodo – to storimo z uporabo operatorja new.warning. da v izpeljanem razredu eksplicitno povemo. //razred Tocka3D je izpeljan iz razreda Tocka //dodatno polje razreda Tocka3D //Z operatorjem new napovemo. //polji razreda Tocka public void Izpis() //metoda za izpis koordinat razreda Tocka { Console.WriteLine("Koordinate točke:\nx = " + x + "\ny = " + y). NET 141 Nove metode Razredi lahko vsebujejo več ali manj metod in slej ko prej se lahko zgodi. s katerim nas obvesti. napišemo razred Tocka in nato iz njega izpeljemo razred Tocka3D. a v našem primeru se bo zagnala metoda razreda Tocka3D. y. class Tocka //bazni razred { private int x. da metoda Tocka3D. katere ime.Write("z = " + z + "\n"). Problem seveda lahko rešimo tako. da ima razred Tocka3D SVOJO LASTNO metodo Izpis new public void Izpis() { Console. Pri prevajanju bomo zato o tem dobili ustrezno opozorilo . da metodo Izpis v izpeljanem razredu preimenujemo (npr. da se bo pri klicu metode Izpis pognala metoda bazičnega razreda. } } class Tocka3D : Tocka { private int z.WriteLine("Koordinate točke:\nx = " + x + "\ny = " + y). Metoda v izpeljanem razredu namreč v tem primeru prekrije metodo bazičnega razreda.C# . } } class Tocka3D : Tocka { private int z. Če npr. y. Izpis1). //polji razreda Tocka public void Izpis() //metoda za izpis koordinat razreda Tocka { Console.

} } } /*Kreirajmo razred Krogla ki naj podeduje razred Krog.WriteLine("Polmer : {0}".C# .Obseg). Console. c. s.//nov objekt razreda Krogla s. podedoval bo lastnosti Premer in Obseg. imel bo SVOJO lastnost za izračun kvadrature.-10:F2}\n".WriteLine("\nKarakteristike krogle"). } } public double Volumen //nova lastnost razreda Krogla { get { return 4 * Math. Console. } set { polmer = value.} } public double Premer //lastnost.00. ki vrne ploščino kroga { get { return Math. Console.Polmer = 25.Premer).//zasebno polje razreda Krog public double Polmer //lastnost za dostop do polja polmer { get { if (polmer < 0) return 0.PI*Math.-10:F2}".Premer).WriteLine("Polmer : {0}".WriteLine("Premer : {0}". s. } Programiranje 1 – VSŠ Informatika .Kvadratura). Console.55.Kvadratura).PI * Math.2). Console. poleg tega pa še novo lastnost za izračun prostornine krogle */ class Krogla : Krog { new public double Kvadratura //z operatorjem new smo označili. Obseg in Kvadratura.-10:F2}".Pow(Polmer.-10:F2}". Console.Polmer = 25. s. Console. ki vrne premer kroga { get { return Polmer * 2. Iz razreda nato izpelji razred Krogla.Volumen). Console.WriteLine("Površina : {0.2) / 3.WriteLine("Obseg : {0. NET 142 /*Napiši razred krog z zasebnim poljem polmer in lastnostmi Premer. } } public double Kvadratura //lastnost.55.WriteLine("Premer : {0}". c.WriteLine("Ploščina: {0. else return polmer.WriteLine("Obseg : {0. Krogla s = new Krogla().//nov objekt razreda Krog c. Razred Krogla bo podedoval polje polmer.Pow(Polmer.PI*Math. c.-10:F2}".Polmer).Pow(Polmer.PI. Console. s.2).WriteLine("Karakteristike kroga"). da ima razred krog SVOJO //lastno lastnost kvadratuta { get { return 4 * Math. } } } //glavni program static void Main() { Krog c = new Krog(). } } public double Obseg //lastnost. Console. c.WriteLine("Prostornina: {0. Console.Obseg).Polmer). s. ki vrne obseg kroga { get { return Premer * Math. dodaj razredu lastno metodo Kvadratura in novo metodo Volumen*/ class Krog //Bazični razred { private double polmer.

Programiranje 1 – VSŠ Informatika . označimo kot virtualno (virtual). enako število in tip parametrov in enak tip vrednosti. Skrivanje metode (hiding) pa pomeni. //polji razreda Tocka //metoda Koordinate je virtualna. da jo lahko prepišemo (override) public virtual void Koordinate() //metoda za izpis koordinat razreda Tocka { Console. da želimo neko metodo nadomestiti z drugo – metode v tem primeru niso povezane in lahko opravljajo povsem različne naloge. a nad različnimi objekti (izpeljanimi iz bazičnih razredov. kako izvesti drugo. za katero želimo že v bazičnem razredu označiti..Write("z = "+z+"\n"). y. Prepisovanje metode (overriding) je mehanizem. da jo bomo lahko v nadrejenih razredih nadomestili z novo metodo (jo prekriti).Koordinate().  Obe metodi.C# . class Tocka //bazični razred { private int x. da smo s to metodo prekrili bazično metodo public override void Koordinate() { . s katero povemo. pa se moramo držati nekaterih pomembnih pravil:  Metoda tipa virtual oz. override NE more biti zasebna (ne mre biti private).WriteLine( "Koordinate točke:\nx = "+x + "\ny = " + y). NET 143 Virtualne metode Pogosto želimo metodo. da bo ta metoda prekrila/prepisala bazično metodo z enakim imenom in enakimi parametri. ali pa iz podedovanih razredov).} Ločiti pa moramo razliko med tem. } } Prekrivne (Override) metode Kadar je bazičnem razredu neka metoda označena kot virtualna (virtual). jo torej lahko v nadrejenih razredih prekrijemo/povozimo (override). //klic bazične metode Koordinate razreda Tocka Console. kar pomeni. //izpeljani razred – besedica override pomeni. npr. Eden izmed načinov je uporaba operatorja new za tako metodo. v višjih (izpeljanih) razredih skriti in napisati novo metodo. drug način pa je z uporabo rezervirane besede virtual. novo implementacijo iste metode – virtualne in override metode so si v tem primeru sorodne. da bodo opravljale enako nalogo. saj se pričakuje. ali neka metoda prepiše bazično metodo (override) ali pa jo skrije.prepiše istoimensko metodo razreda Tocka public override void Koordinate() { base. ki jo vračata. ki pa bo imela enako ime in enake parametre.: //virtualna metoda v bazičnem razredu – v izpeljanih razredih bo lahko prekrita(override) public virtual void Koordinate() {... //razred Tocka3D je izpeljan iz razreda Tocka //dodatno polje razreda Tocka3D //Metoda Koordinate je označena kot override . } } class Tocka3D : Tocka { private int z. Primer: Naslednji primer prikazuje zapis virtualne metode Koordinate() v bazičnem razredu in override metode Koordinate() v izpeljanem razredu. Metodo. ki smo je napisali v bazičnem razredu. Pri deklaraciji takih metod (pravimo jim polimorfne metode) z uporabo rezerviranih besed virtual in override. tako virtualna kot override morata biti identični: imeti morata enako ime..} V nadrejenem razredu moramo v takem primeru pri metodi z enakim imenom uporabiti rezervirano besedico override.

int y) //konstruktor { this.y) //dedovanje bazičnega konstruktorja razreda Tocka { this. } } class Tocka3D : Tocka { private int z. 3). //polje razreda krog //metoda ploscina je virtualna. //klic bazične metode Koordinate razreda Tocka Console. //klic preobloţene metode Koordinate razreda Tocka3D } Vaja: /*Napišimo razred krog z zasebnim poljem polmer in virtualno metodo ploscina. } } static void Main(string[] args) { Tocka A = new Tocka(1. da jo lahko preobloţimo (naredimo override) public virtual void Koordinate() //metoda za izpis koordinat razreda Tocka { Console. Vaja: Razred Tocka in razred Tocka3D. ki smo napisali v izpeljanem razredu. Če v nadrejenem razredu ne bomo uporabili besedice override.int y. da jo lahko preobloţimo (override) public virtual double ploscina() { return Math.Koordinate(). Prepišemo (prekrijemo/povozimo) lahko le virtualno metodo. da se bo tudi v izpeljanem razredu izvajala metoda bazičnega razreda in ne tista. 2. } //Metoda Koordinate prepiše istoimensko metodo razreda Tocka public override void Koordinate() { base. nato pa še razred kolobar.x = x. Razred kolobar naj deduje razred krog. mora biti javna tudi metoda override. //Nov objekt razreda Tocka A.Koordinate(). jo lahko v nadrejenih razredih ponovno prekrijemo z novo metodo. kar pomeni. //razred Tocka3D je izpeljan iz razreda Tocka //dodatno polje razreda Tocka3D public Tocka3D(int x. To pa hkrati pomeni. } //metoda Koordinate je virtualna.1). bazična metoda ne bo prekrita.parametra x in y potrebujemo za : base(x. this. NET 144     Obe metodi morata imeti enak dostop.Koordinate(). //klic metode Koordinate razreda Tocka Tocka3D A3D = new Tocka3D(1.z = z.PI * polmer * polmer.int z) //konstruktor .y = y. Če neko metodo označimo kot override. Če metoda ni označena kot virtualna in bomo v nadrejenem razredu skušali narediti override. kar pomeni.WriteLine( "Koordinate točke:\nx = "+x + "\ny = " + y).C# . y. ki je izpeljan iz razreda Tocka sta implementirana v naslednjem primeru: class Tocka //bazni razred { private int x. //Nov objekt razerda Tocka3D A3D. Če je npr.Write("z = "+z+"\n"). dodano naj ima še eno zasebno polje notranjiPolmer in svojo lastno(override) metodo polščina*/ class krog //bazni razred { private int polmer. bomo dobili obvestilo o napaki. Programiranje 1 – VSŠ Informatika . virtualna metoda označena kot javna (public). //polji razreda Tocka public Tocka(int x.

razred Kmetovalec pa še dodatno polje velikostPosesti. //izpis ploščine kolobarja na 4 decimalke Console. ţe pozna njegovo lastnost Polmer //dodatna lastnost (property) razreda kolobar. //izpis ploščine kroga na 4 decimalke Console. } set { polmer = value.Next(1. polja polmer { get { return polmer.WriteLine("Ploščina kolobarja: {0:F4}". Za oba razreda napišimo tudi konstruktor in virtualno metodo Tostring za izpis podatkov o posameznem objektu!*/ //glavni program static void Main(string[] args) { ArrayList osebe = new ArrayList(). k. Console.Next(1. kol. //dodatno polje razreda kolobar //metoda ploscina prepiše istoimensko metodo bazičnega razreda krog public override double ploscina() { return Math.C# . polja notranjiPolmer public int NotranjiPolmer { get { return notranjiPolmer. za dostop in inic. za dostop in inic.WriteLine("Ploščina kroga: {0:F4}". } } } class kolobar : krog //razred kolobar podeduje razred krog { //ker kolobar deduje krog.PI * (Polmer * Polmer .notranjiPolmer*notranjiPolmer). NET 145 } public int Polmer //lastnost(property) razreda krog.ploscina()). //zbirka oseb Programiranje 1 – VSŠ Informatika . //polje notranjiPolmer inicializiramo preko lastnosti notranjiPolmer kol.Add(mike). } set { notranjiPolmer = value.WriteLine("Osebe:"). } //ker kolobar deduje krog. //nov objekt razreda kolobar //tudi polje polmer objekta kol inicializiramo preko lastnosti Polmer kol. //nov objekt razreda krog //polje polmer inicializiramo preko lastnosti Polmer kolobar kol = new kolobar().ploscina()). 10).k. 10). krog k=new krog().NotranjiPolmer = naklj. Oseba mike = new Oseba("mike"). } Vaja: //Deklarirajmo razred Oseba.Polmer = naklj. ţe pozna polje polmer private int notranjiPolmer. nato pa razred Kmetovalec. osebe. ki naj podeduje razred Oseba. Razred Oseba naj ima polje ime.Polmer = naklj. 10).Next(1. } } } static void Main(string[] args) { Random naklj = new Random().

Kmetovalec bob = new Kmetovalec("bob".WriteLine(). } public override string Tostring() //metoda Tostring prekrije bazično metodo Tostring { return base.Tostring()).ime = ime. //napolnimo skupno zbirko vseh oseb foreach (Oseba o in osebe) vsiSkupaj.Tostring()). //dodatno polje razreda Kmetovalec public Kmetovalec(string ime. NET 146 //izpišemo seznam vseh oseb foreach (Oseba p in osebe) Console. } public class Oseba { public string ime.Tostring(). metode za postavitev vrednosti podatkov in metode za izračun površine. 20). ArrayList vsiSkupaj = new ArrayList().Tostring()). Kvadratnih metorv = " + velikostPosesti.velikostPosesti = velikostPosesti.Add(o). int velikostPosesti) //konstruktor razreda Kmetovalec : base(ime) //podeduje bazično polje ime { this.WriteLine(f. //izpišemo seznam vseh oseb foreach (Oseba p in vsiSkupaj) Console. obsega in volumna.Add(bob).mnogoličnost Programiranje 1 – VSŠ Informatika . 10). Console. //izpišemo seznam vseh kmetovalcev foreach (Kmetovalec f in kmetovalci) Console. foreach (Kmetovalec f in kmetovalci) vsiSkupaj. Console. public Oseba(string ime) { this. Console. //zbirka kmetovalcev Kmetovalec john = new Kmetovalec("john". ArrayList kmetovalci = new ArrayList(). Console.WriteLine("Vsi skupaj:"). kmetovalci. } } //virtualna metoda bazičnega polja public class Kmetovalec : Oseba //razred Kmetovalec deduje razred Oseba { int velikostPosesti.Add(f).Tostring() + ". } //bazični razred //bazično polje //bazični konstruktor //zbirka vseh skupaj public virtual string Tostring() { return "Ime=" + ime.WriteLine(p.Add(john). } } Naloge: Napiši razred Kocka tako. Polimorfizem .WriteLine("Kmetovalci:"). Razreda naj poleg svojih podatkov vsebujeta še privzeti konstruktor. da bo izpeljan iz razreda Kvadrat.C# .WriteLine(p.WriteLine(). kmetovalci.

tabela pa naj bo inicializirana tako. Polimorfno redefinicijo omogočimo z že znano definicijo virtualne metode. V telesu te metode bomo za vajo in zaradi enostavnosti prikazali le neko sporočilno okno! public class OsnovniRazred //temeljni razred { public virtual void Slika() //polimorfna redefinicija – omogočimo jo z { Console. V ta namen kreirajmo tabelo objektov. Ime tabele je dObj.WriteLine ("Kvadrat. public class Crta : OsnovniRazred //Crta je razred.WriteLine("Osnovni objekt!"). Napišimo sedaj še tri razrede. ki naj bodo izpeljani iz razreda OsnovniRazred in ki imajo svojo metodo Slika. ki ima eno samo metodo z imenom Slika. Osnovni pogoj pa je. da se bodo objekti izpeljani iz teh razredov na to metodo odzivali vsak na svoj način. da bo vsak objekt. Programiranje 1 – VSŠ Informatika . da je ista operacija lahko implementirana na več različnih načinov oz. NET 147 V izpeljanih razredih se srečamo še z enim temeljnim pojmom objektno orientiranega programiranja – to je pojem polimorfizem oz. Ker je metoda Slika virtualna to pomeni. zanjo obstaja več metod. ki označuje. kako bi te štiri razrede sedaj uporabili in na primeru izpeljanih objektov prikazali princip polimorfizma. Kot primer za prikaz polimorfizma deklarirajmo razred OsnovniRazred.WriteLine("Črta. //Telo override metode je seveda lahko drugačno!!! } } public class Kvadrat: OsnovniRazred //Tudi Kvadrat je razred. ki bo imela enako ime a drugačen pomen (drugačno vsebino). ki podeduje razred OsnovniRazred { public override void Slika() //preobloţena metoda razreda Crta { Console. vse so public) . da lahko v izpeljanih razredih to metodo prekrijemo (override) z metodo. Pomeni tudi. iz katerega bomo tvorili izpeljane razrede in v njih tvorili nove objekte. ki predstavljata osnovo objektnega programiranja in omogočata hitrejši razvoj in lažje vzdrževanje programske kode. mnogoličnost.WriteLine ("Krog. //Telo override metode je seveda lahko drugačno!!! } } public class Krog : OsnovniRazred //Tudi Krog je razred. da so v njej lahko štiri objekti tipa OsnovniRazred. moramo uporabiti polimorfno redefinicijo. enako ime in enake parametre kot jih ima osnovna virtualna metoda v bazičnem razredu. ki bo izpeljan iz tega razreda (tudi tisti v podedovanih – izpeljanih razredih) ohranil sebi lastno obnašanje ob klicu metode Slika. Ker želimo. da bodo izpeljani objekti lahko uporabljali svojo (prekrivno oz.").C# . } } virtualno metodo Ker smo metodo Slika definirali kot virtualno. ki pa bo imela enako ime. da imajo take override metode enako raven zaščite (npr. da lahko različni objekti razumejo isto sporočilo in se nanj odzovejo vsak na svoj način. override) metodo Slika. smo s tem napovedali. } } Poglejmo sedaj."). Dedovanje in polimorfizem sta lastnosti. Razred OsnovniRazred bo naš temeljni razred. ki podeduje razred OsnovniRazred { public override void Slika() { Console. Pred tipom takih metod mora stati besedice override."). Pojem polimorfizem označuje princip. ki podeduje razred OsnovniRazred { public override void Slika() //Telo override metode je seveda lahko drugačno!!! { Console.

C# . NET

148

OsnovniRazred[] dObj = new OsnovniRazred[4];//tabela objektov

Ker so razredi Crta, Krog in Kvadrat izpeljani iz bazičnega razreda OsnovniRazred, jih lahko priredimo isti tabeli dObj. Če te zmožnosti ne bi bilo, bi morali za vsak nov objekt, izpeljan iz kateregakoli od teh štirih razredov, kreirati svojo tabelo. Dedovanje pa nam omogoča, da se vsak od izpeljanih objektov obnaša tako kot njegov bazični razred. Naslednjo kodo lahko zapišemo npr. v dogodek Click nekega gumba, ali pa neko opcijo menija.
dObj[0] dObj[1] dObj[2] dObj[3] = = = = new new new new Crta(); //konstruktor Krog(); //konstruktor Kvadrat(); //konstruktor OsnovniRazred();//konstruktor objekta objekta objekta objekta dObj[0] dObj[1] dObj[2] dObj[3]

foreach (OsnovniRazred objektZaRisanje in dObj) { objektZaRisanje.Slika(); //klic metode Slika ustreznega objekta }

Ko je tabela inicializirana, lahko npr. s foreach zanko pregledamo vsakega od objektov v tabeli. Zaradi načela polimorfizma se v zagnanem programu vsak objekt obnaša po svoje, pač odvisno od tega, iz katerega razreda je bil izpeljan. Ker smo v izpeljanih razredih prepisali virtualno metodo Slika , se ta metoda v izpeljanih objektih izvaja različno, pač glede na njeno definicijo v izpeljanih razredih. Pri vsakem prehodu zanke bomo tako dobili drugačno sporočilno okno.

Uporaba označevalca protected
Uporaba označevalcev private in public predstavlja obe skrajni možnosti dostopa do članov razreda (oz. objekta). Javna polja in metode so dostopne vsem, zasebna polja in metode pa so dostopne le znotraj razreda. Pogosto pa je koristno, da bazični razred dovoljuje izpeljanim razredom, da le-ti dostopajo do nekaterih bazičnih članov, obenem pa ne dovoljujejo dostopa razredom, ki niso del iste hierarhije. V takem primeru uporabimo za dostop označevalec protected. Nadrejeni razred torej lahko dostopa do člana bazičnega razreda, ki je označen kot protected, kar praktično pomeni, da bazični član, ki je označen kot protected, v izpeljanem razredu postane javen (public). Javen je tudi v vseh višjih razredih. V primeru, ko pa nek razred ni izpeljani razred, pa nima dostopa do članov razreda, ki so označeni kot protected – znotraj razreda, ki ni izpeljani razred, je torej član razreda, ki je označen kot protected enak zasebenemu članu (private).

Programiranje 1 – VSŠ Informatika

C# . NET

149

Prosojnice M. Lokar 2009

Objektno programiranje Objekti
• •
Objekt je skupek podatkov, s katerim želimo upravljati kot s celoto. Ima

Podatke

    

Kakšno je stanje (state) objekta kaj o objektu vemo/hranimo

stalni podatki / spremenljivi podatki

Metode
Kakšno je obnašanje (behaviour) objekta Kaj objekt "zna" Kakšne metode lahko izvajamo nad njem

Vsak objekt pripada nekemu razredu. Če pripada objekt x razredu R, potem pravimo tudi da je x objekt tipa R.

Znani objekti

Nekaj primerov objektov iz standardnih knjižnic jezika C# :

– – –

Objekt tipa StreamReader predstavlja vhodni kanal. Kadar želimo brati s tipkovnice ali z datoteke, naredimo tak objekt in kličemo njegovo metodo ReadLine za branje ene vrstice. Objekt System.Console predstavlja standardni izhod. Kadar želimo kaj izpisati na zaslon, pokličemo metodo WriteLine na objektu System.Console. Objekt tipa Random predstavlja generator naključnih števil.

Seveda pa so objekti uporabni predvsem zato, ker lahko programer definira nove razrede in objekte.

Objekti

stanja:
Programiranje 1 – VSŠ Informatika

C# . NET

150

• •

– Lastnosti, podatki, komponente “znanje” – Odzivanje na dogodke Združeno v celoto – Podatki in metode, ki opisujejo neko stvar/objekt – Žoga: –
Ulomek:

 Podatki: velikost, barva, položaj v prostoru, …  Metode: sprememba velikosti, sprememba položaja, …  Podatki: števec, imenovalec  Metode: spremeni števec, spremeni imenovalec, seštej, obratna vrednost, lepo
izpiši, ...

Primeri objektov
• • •
Datum

– – – – – – – – – –

V objektih tipa datum bi npr. hranili datume

Podatki (stanje objekta)
Dan, mesec, leto

Metode (obnašanje / znanje)
Vrni mesec Vrni število dni med dvema datumoma Naslednji dan Prejšnji dan Lepo izpiši Je leto prestopno Dan v tednu na določen datum ...

Avto

Podatki

tehnične značilnosti:

Programiranje 1 – VSŠ Informatika

C# . NET

151

  

najvecjaHitrost (v km/h), velikostRezervoarja (v litrih) povprečnaPoraba (v litrih/100 km).

trenutno stanje avtomobila

   

Je avto vžgan (da/ne) Koliko je na števcu km (npr. 234.142 km), Trenutna hitrost (npr. 56.12 km/h) Količina Goriva (npr. 14.325 litrov).

"Obnašanje"

– – – – – – –

Vžgi avto (spremeni stanje "vžganosti") Ugasni avto (spremeni stanje "vžganosti") "dej gas" (spremeni stanje hitrost) "bremzej" Natankaj gorivo Povej, za koliko km še zadošča gorivo ...

Primer problema
• • •
Napisati morate program, ki bo nadzoroval delovanje dvigal Objekt Dvigalo Podatki (stanje) objekta:

– – – – – –

V katerem nadstropju je, koliko oseb je v njemu kakšna je masa teh oseb.

Delovanje dvigala ("znanje", "obnašanje")
vstop oseb v dvigalo, izstop premik gor ali dol

Primer problema

Vodimo skladišče kontejnerjev
Programiranje 1 – VSŠ Informatika

kaj naj počnejo Programiranje 1 – VSŠ Informatika . ki bi znal odgovoriti na določena vprašanja – – – – Izpis vsebine vseh polnih kontejnerjev Koliko je povsem praznih kontejnerjev Vsebina največjega kontejnerja … Razred Kontejner • • • Tabela kontejnerjev Posamezni kontejner – – – – – – – – – Nov razred Za vsak kontejner poznamo Mere Zapolnjenost (v %) Vsebino • Kaj počnemo s posameznim kontejnerjem Napolni z določeno vsebino Poizvedi.C# . koliko je zaseden Dodaj vsebino Izpiši vsebino Poizvedi po merah Programiranje v C# • Sestavljanje razredov – – Opis lastnosti objektov Opis metod (“znanja” objektov)   Ustvarjanje objektov in njihova uporaba "Ukazovanje" objektom. NET 152 • Radi bi napisali program.

C# . NET

153

Objekt za izpolnitev določene naloge potrebuje druge objekte in njihove metode

Začetek

– –

Glavni razred (ki ima metodo Main) Izvajanje metode Main – ustvarjanje objektov, proženje dogodkov, odzivanje na dogodke, …

Objekti • • • •
Objekt je kakršenkoli skupek podatkov, s katerimi želimo upravljati. Osnovni pristop objektnega programiranja

– –

objekt = podatki + metode za delo s podatki.

Ko želimo kak podatek (objekt) obdelati, objektu (podatku) signaliziramo, kaj naj se zgodi.
Pokličemo ustrezno metodo v objektu.

Objekt je "črna škatla“, ki sprejema in pošilja sporočila. Jedro objekta sestavljajo njegove spremenljivke, okrog katerih se nahajajo njegove metode.

Princip črne škatle
• •
Imamo objekt obj, ki hrani podatke o neki osebi. Zanima nas inteligenčni količnik te osebe.

obj.KolikoJeIQ()

• • •

Objekt se odzove z odgovorom Uporabnika ne zanima, kako je objekt prišel do odgovora, le kaj ga lahko vpraša in v kakšni obliki bo dobil odgovor! Ni važno, kako je objekt odgovoril – kako je prišel do IQ (je to podatek, ki je zapisan nekje v objektu, je to rezultat nekega preračunavanja …

Programiranje 1 – VSŠ Informatika

C# . NET

154

Prednosti "črne škatle"
• • •
Če kasneje spremenimo notranjost "črne škatle" (razreda) Spremembe v programih, ki razred uporabljajo, niso potrebne

– –
Npr.:

Seveda, če je način spraševanja in odgovarjanja ostal nespremenjen Če so metode ostale enake (imajo enaka imena, nabor parametrov in tip rezultata)

– –

Šef ugotovi, da bi bilo smiselno, da v vaših programih pri datumu hranite še čas. Ampak stvari naj bi naredili tako, da obstoječi programi ne bi bili prizadeti (beri, da bi delali še naprej) Če je razred "črna" škatla, lahko naredimo spremembe tako, da ne bo "staro" prizadeto

Pomislite samo na "običajno življenje"

– –

Verjetno je zgradba menjalnika danes bistveno drugačna, kot je bila pred 30 leti A kar se šoferja (starega ;-) ) tiče, se ni nič spremenilo – s to črno škatlo (menjalnikom) upravlja še vedno na enak način kot pred 30 leti

Če se bodo v C# 2013 odločili, da razred Random spemenijo (spremenijo notranjost "črne škatle"), a bomo še vedno imeli metodo Next(a, b), se za programerja ne bo nič spremenilo, čeprav bo metoda Next morda "znotraj" delala drugače!

Od kje razredi?

Veliko vgrajenih (oziroma v standardnih knjižnicah) v C#

.NET Framework  C# je .NET jezik – ima dostop do vseh razredov, definiranih v knjižnicah (zbirkah razredov) okolja .NET

 Glej npr. http://msdn2.microsoft.com/sl-si/library/ms229335(enus).aspx

– • •
Drugi viri

Razporejeni v imenske prostore

System, System.IO

– –

Naši “stari” razredi Drugi programerji

Potrebujemo dostop do ustrezne datoteke (dll, exe)

Programiranje 1 – VSŠ Informatika

C# . NET

155

Moj prvi razred
Oglejmo si naslednji program: using System;

public class MojR{ private string mojNiz;

public MojR(string nekNiz) { mojNiz = nekNiz; }

public void Izpisi() { Console.WriteLine(mojNiz); } }

public class Pozdrav { public static void Main(string[] arg) MojR prvi; {

prvi = new MojR("Pozdravljen, moj prvi objekt v C#!"); prvi.Izpisi(); } }

Objekt in ime spremenljivke
• • •
NekiObjekt a;


– –

a je naslov, kjer bo objekt (referenca na objekt)
V pomnilniku se je naredil objekt tipa NekiObjekt() / po pravilih, ki so določena z opisom razreda NekiObjekt

new NekiObjekt();

a = new NekiObjekt();
V pomnilniku se je naredil objekt tipa NekiObjekt() in a kaže na ta novo ustvarjeni objekt
Programiranje 1 – VSŠ Informatika

C# . NET

156

Ustvarjanje objektov
• • •
Razred je šablona, ki definira spremenljivke in metode skupne vsem objektom iste vrste. class

– – – –

Načrt objekta, šablona Ustvarimo ga z new Brez tega objekta NE MOREMO uporabiti NekiObjekt a;

Primerek razreda (instanca) – konkretni objekt

  

Objekt NE obstaja a je IME objekta natančneje

a je ime spremenljivke, kjer hranimo NASLOV objekta vrste NekiObjekt

C#in objekti
• •
Razred (class) je opis vrste objekta (načrt, kako naj bo objekt videti) – opis ideje objekta Primerek razreda (instanca) – konkretni objekt

Ustvarjanje objektov
– – – – – –
Ulomek ime = new Ulomek(3, 4); Rečemo:

    

V objektu ime je shranjen ulomek ‫ݯ‬

Točneje
V spremenljivki ime je naslov nekega objekta tipa Ulomek, ki predstavlja ulomek ‫ݯ‬ Spremenljivka ime kaže na objekt tipa Ulomek, ki …

Prvi ukaz je dejansko spoj dveh stavkov:
deklaracija prireditev

Ulomek ime; ime = new Ulomek(3, 4);

Programiranje 1 – VSŠ Informatika

ki bo prebral nek ulomek in mu prištel 1/2. ime = new Ulomek(3.C# . da bi radi napisali program. NET 157 Ustvarjanje objektov – – Ulomek ime. Še en zgled • • Poglejmo si še en zgled. 4). Denimo. "klasično" se bomo tega lotili takole Programiranje 1 – VSŠ Informatika .

// "delo" stevec = stevec + 1. namespace UlomkiKlasika { class Program { public static void Main(string[] args) { // vnos podatkov Console. Console.ReadLine(). int imenovalec = int. .Write("Števec ulomka: "). // izpis Console. imenovalec = imenovalec + 2. NET 158 Povečaj ulomek "klasično" using System.Write("Press any key to continue . Console. int stevec = int.Parse(beri).ReadKey(true). .Parse(beri). "). } } } Povečaj ulomek .objektno • • • Razred Ulomek Hrani podatke o svojem števcu in imenovalcu "se zna" povečati za drug ulomek – Vsebuje metodo. ki ta ulomek poveča za drug ulomek Programiranje 1 – VSŠ Informatika . Console.Write("Imenovalec ulomka: ").ReadLine(). string beri = Console.WriteLine("Nov ulomek je: " + stevec + " / " + imenovalec).C# . beri = Console.

public int imenovalec. public Ulomek(int st.imenovalec + a. namespace UlomkiObjektno { class Ulomek { public int stevec. int imenovalec = int.imenovalec.Parse(beri). int stevec = int.stevec + a. NET 159 "Objektni" program Ulomki .imenovalec = im. this. } } class Program { public static void Main(string[] args) { // vnos podatkov Ulomki . Programiranje 1 – VSŠ Informatika .Parse(beri).Write("Števec ulomka: ").imenovalec = this. this. } public void Pristej(Ulomek a) { this. beri = Console.stevec = st. string beri = Console.ReadLine(). Console.C# .ReadLine().objektno using System.Write("Imenovalec ulomka: ").stevec.stevec = this.objektno Console. int im) { this.

• objektno Ulomek polovica = new Ulomek(1...WriteLine("Nov ulomek je: " + moj.Pristej(polovica). 2). Primerjava • "klasično" // "delo" stevec = stevec + 1. imenovalec = imenovalec + 2. Ulomek • • Ampak – ulomke smo seštevali narobe. Saj se ulomki ne seštevajo tako.... NET 160 Ulomek moj = new Ulomek(stevec.stevec + " / " + moj. po "Janezkovo"! – Saj veste . moj.. Saj vem. // izpis Console.Pristej(polovica). da se posebej seštejeta števec in imenovalec . Inšpektor reče ... moj. Napisali pa smo že nekaj 10 programov z "janezkovim seštevanjem" Programiranje 1 – VSŠ Informatika . Učitelj Janezek pa .. ampak tako si lažje zapomnijo .imenovalec).C# . 2).. // "delo" Ulomek polovica = new Ulomek(1. imenovalec).

to je vse . . kakšne objekte potrebujemo za reševanje Pregledamo. da pišemo program. ki sestavljajo poljubnega zajca Programiranje 1 – VSŠ Informatika . razredi. da se podatki “držijo” skupaj – – – Tabela je zbirka istovrstnih podatkov Sestavimo razred Zajec Opis podatkov.. Objektno programiranje • Problem – – Z analizo ugotovimo. Od kje in zakaj Združevanje podatkov • • Denimo.C# . ali že imamo na voljo ustrezne razrede – –    Standardna knjižnica Druge knjižnice Naši stari razredi Sestavimo ustrezne manjkajoče razrede Sestavimo “glavni” program. ki bo pomagal upravljati farmo zajcev Za vsakega zajca poznamo: – – – serijsko številko spol težo Tabela ni ustrezna • Kako doseči.. NET 161 – – Klasično: preko kode vseh 10 programov in "iščemo". kje smo pravzaprav seštevali Objektno: le spremenimo metodo Pristej v razredu Ulomek... nato pa  Nič. kjer s pomočjo objektov rešimo problem Objekti.

public MojR(string nekNiz) { mojNiz = nekNiz. prvi = new MojR("Pozdravljen.. } } } Knjižnica razredov • Knjižnice razredov Programiranje 1 – VSŠ Informatika . } } public class Pozdrav { public static void Main(string[] arg) { MojR prvi. moj prvi objekt v C#!"). NET 162 Moj prvi razred • Razredi za uporabo znotraj nekega programa – – "lokalni" razredi Kot prej (Console Application . prvi.) namespace PrviOOP { public class MojR { private string mojNiz..WriteLine(mojNiz).Izpisi().C# . } public void Izpisi(){ Console.

csharphelp. kot ga lahko uporabijo tisti. dejansko se NIČ ne izvede.co.html Razred Zajec public class Zajec { public string serijska. */ : splošen komentar /// dokumentacijski komentar – Glej npr:  http://www. . public double masa. } • • • • S tem imamo napisan opis... NET 163 Komentarji • • • // ..com/archives3/archive598. kakšna naj bo hiša V obliki.XMLComments InCSharp.vrstični komentar /* ..dll (naš zgled: MojiRazredi. kakšni so zajci Ni to konkreten zajec Ni metode Main.dll) – – Še vedno načrt. ki bodo po tem načrtu izdelali konkretno hišo Programiranje 1 – VSŠ Informatika . public bool spol.asp  http://www.com/w/Articles.html  http://www. Ni namenjeno poganjanju kot program Hisa. kako je videti hiša Kot ga je pripravil projektant • • Prevedemo Hisa.C# .cs – – Načrt.uk/tutorials/cSharp/lesson19.softsteel. kako je določen poljuben zajec – – Načrt.winnershtriangle.

NET 164 Uporaba razreda Zajec • Program. kjer delamo z zajci: – – Potrebuje datoteko MojiRazredi. ga napovemo – Zajec rjavko “ustvarimo” z new – new Zajec() – Ustvaril se je konkreten zajec po navodilih za razred Zajec (ta zajec ima torej tri podatke / lastnosti / komponente) – Metoda je vrnila naslov.C# . oziroma using ClassLibrary1. kjer delamo z zajci: – – Potrebuje datoteko ClassLibrary1..dll (ker vsebuje definicijo razreda Zajec) Napovemo uporabo te datoteke Project / Add reference Uporaba razreda Zajec • Program.. kje ta konkretni zajec je Programiranje 1 – VSŠ Informatika . . Če v programu potrebujemo konkretnega zajca.dll (ker vsebuje definicijo razreda Zajec) Napovemo uporabo te datoteke Okolje: Project / Add reference Uporaba razreda Zajec • • • • • Program. kjer delamo z zajci: using MojiRazredi.

– Operator new je nekje ustvaril tabelo. – Ustvarili smo spremenljivko tabZ. v katerih lahko – shranimo podatke o posameznem zajcu.-) Zajec[] tabZ. rjavko. rjavko. v kateri je prostor za 200 naslovov objektov..masa = 3. V tabeli tabZ je na mestu 0 zajec . Trenutno v tej spremenljivki ni nobenega naslova.. Naslov tega prostora za tabelo smo shranili v spremenljivko tabZ. v katero bomo lahko shranjevali naslove objektov tipa Zajec.2.. V spremenljivki tabZ lahko shranimo naslov tabele. NET 165 – Zajec rjavko = new Zajec(). Programiranje 1 – VSŠ Informatika .C# . • tabZ[0] = new Zajec(). Razred Zajec Še končni pogled na naslove • • • Potem bomo malček "popustili" . katere naslov je shranjen v spremenljivki tabZ.serijska = “BRGH_17_A”. V tem trenutku ne obstaja še noben objekt tipa Zajec.spol = true.. – • Seveda pa bomo govorili . V spremenljivki rjavko je naslov. Naslov tega objekta se je shranil v 0-to celico tabele. kje je novo ustvarjeni zajec (objekt) Dostop do podatkov v objektu • • • rjavko. Operator new je nekje ustvaril prostor za objekt tipa Zajec. tabZ = new Zajec[200].

x.imenovalec : enako x. x.stevec + 1. NET 166 Razred – shramba podatkov • public class Ulomek { public int stevec. Kako “napolniti” stevec in imenovalec? Povzetek • Definicija razreda – Običajno v knjižnici! Programiranje 1 – VSŠ Informatika . public int imenovalec.imenovalec = x. } Prevedemo in dobimo Ulomek.class Kaj sedaj? • • • – – – – – – Uporabljamo v drugih programih (razredih) Ulomek x = new Ulomek().stevec = 1.C# .stevec : spremenljivka tipa int! x.

public podatkovni tip element2. } Povzetek • Uporaba razreda – – Če potrebujemo primerek razreda new ImeRazreda() – – Ustvari prostor in pove.starost Konstruktorji • Ob tvorbi objekta bi radi nastavili začetno stanje spremenljivk – in morda opravili še kaj – o tem kasneje • Konstruktor – metoda. denimo mojaSpTipaImeRazreda Dostop do prostorov za hranjenje  Operator . … public podatkovni tip elementn. NET 167 public class ImeRazreda { public podatkovni tip element1.C# . kje ta prostor je  Naslov prostora shranimo v neko spremenljivko (tipa ImeRazreda).elementi – imeObjekta.  imeObjekta. ki jo pokličemo ob tvorbi objekta z new • Brez tipa rezultata! Programiranje 1 – VSŠ Informatika .imeKomponente » mojaSpTipaImeRazreda.

public boolean spol.serijska = “NEDOLOČENO”. // vsem zajcem na this. kot je predpisano v konstruktorju) Kaj je this? this • this • Pomeni objekt.masa = 1.spol = true. } } začetku določimo m.0. ki ga ustvarjamo Programiranje 1 – VSŠ Informatika . spol • Zajca “ustvarimo” z new – – – new Zajec() Ustvaril se je konkreten zajec po navodilih iz konstruktorja Zajec() (ta zajec ima torej tri podatke z vrednostmi. // konstruktor public Zajec() { this. // in tehtajo 1kg this. ki ga "obdelujemo" • V konstruktorju – objekt. NET 168 • Ime kot je ime razreda • Kličemo jo skupaj z new – Klic: new Zajec(). Razred Zajec public class Zajec { public String serijska. public double masa.C# .

C# .10)). da pri metodi Next mislimo na uporabo generatorja ng in ne na g2? • Kako se v metodah razreda sklicati na ta objekt (objekt.MetodaNeka() Kako v postopku za MetodaNeka povedati. objC. nad katerim je izvajana metoda)? – Razred MojRazred in v njem komponenta starost. nad katerim izvajamo metodo. da se je vedelo. – Console. – Random g2 = new Random().spol – Lastnost/komponenta spol objekta. • Zajec belko= new Zajec().MetodaNeka(). ki se ustvarja • Zajec rjavko = new Zajec(). ki se bodo uporabljale nad razredi – Random ng = new Random(). – – Klici bodo npr. NET 169 • this.Next(1. da gre Prvič za objekt z imenom objA drugič za objekt z imenom objC • Programiranje 1 – VSŠ Informatika . pri drugem na belko. Napišimo metodo MetodaNeka(). this v ostalih metodah • Kasneje – pisali bomo metode. – Kako so napisali kodo metode.: objA. ki izpiše starost objekta.WriteLine(ng. • Pri prvem klicu se je v konstruktorju this nanašal na rjavko.

ob drugem pa objC.MetodaNeka() pa starost objekta objC? – Console. • Ob prvem klicu je ???? objA. Konstruktorji • Če konstruktorja ne napišemo (kot ga nismo prej). Napišemo – Console. ga “naredi” prevajalnik sam (a metoda ne naredi nič) – public Zajec() { } • Lahko imamo več konstruktorjev • Konstruktorjev ne moremo klicati posebej (kot ostale metode) – Le ko tvorimo objekt – new – Za vzpostavitev začetnega stanja • Enako ime kot razred • Nimajo tipa rezultata (tudi void ne!) • Ni stavka return Programiranje 1 – VSŠ Informatika . • Ob prvem klicu this pomeni objA.MetodaNeka() uporabi starost objekta objA. To "zamenjavo" dosežemo z this.WriteLine("Starost je: " + this.WriteLine("Starost je: " + ?????.C# .starost). da naj se ob klicu objA. ob drugem pa objC.starost). ob klicu objC. NET 170 this v ostalih metodah • Kako povedati.

NET 171 Več konstruktorjev • Uporabniki bi poleg privzetega zajca.C# . Torej potrebujejo še konstruktor  public Zajec(bool spol) public Zajec(string serijskaSt. bool spol. ampak podpisu Podpis metode – – – Podpis: ime + število in tipi parametrov! public static int NekaMetoda(double Podpis (poenostavljeno): NekaMetoda_double x) Tip rezultata (return tip) NI del podpisa! public static int NekaMetoda(double x) Programiranje 1 – VSŠ Informatika . ko zajca naredijo. double teza) • • • • Včasih pa so zajci "nestandardni"  Potrebujemo več načinov nastavljanja začetnega stanja objekta Več konstruktorjev: – – Več metod z enakim imenom Je to možno? Preobteževanje • Več metod z enakim imenom – Je to možno? Overloading Velja tudi splošno. temu določili še serijsko številko. radi še možnost. za vse metode • • • Preobteževanje – – Metode se morajo razlikovati ne v imenu. Radi bi torej konstruktor – public Zajec(string serijskaSt) Poleg tega pa včasih na farmo dobijo tudi pošiljko samic. da bi takoj.

C# . NET

172

Podpisi metod

Podpis metode: – public static int NekaMetoda(double – Podpis: NekaMetoda_double – “interno” ime – public Zajec(string serijskaStev,
bool spol, double masa) x)

Podpis:

Zajec_String_bool_double

Kaj je lahko sočasno: – public static int NekaMetoda() – public static int NekaMetoda(double y) – public static int NekaMetoda(double x) – public static double NekaMetoda(double x) – public static int NekaDrugaMetoda(double y)

Konstruktorji razreda Zajec
public Zajec() { this.spol = true; // vsem zajcem na this.masa = 1.0; // in tehtajo 1kg this.serijska = “NEDOLOČENO”; }
začetku določimo m. spol

public Zajec(string serijskaStev):this() { this.serijska = serijskaStev; }

• •

: this() – klic konstruktorja Zajec() Izvede se pred vsemi ukazi v konstruktorju

Programiranje 1 – VSŠ Informatika

C# . NET

173

Sklicevanje na konstruktorje
public Zajec(string ser, bool sp, double t) : this(ser) { this.spol = sp; this.masa = t; }

this

this(

– –

Za klic konstruktorja pred začetkom drugega konstruktorja

this() this(<parametri>)
Uporabimo lahko le kot PRVI stavek v konstruktorju Za dostop do lastnosti this.serijska Če ni možnosti zamenjave, lahko izpustimo serijska this.spol = spol; Obstajala je že DRUGO ime spol Ločiti med spremenljivko spol, ki je parameter in lastnostjo objekta z imenom spol

this.

– – – – – –

"Prednost" ima bolj "lokalna" stvar – torej parameter

spol

= spol;

Zgled – člani športnega kluba
• Denimo, da bi radi napisali program, ki vodi
evidenco o članih športnega kluba. Podatki o članu
Programiranje 1 – VSŠ Informatika

C# . NET

174

obsegajo ime, priimek, letnico vpisa v klub in vpisno številke (seveda je to poenostavljen primer). Torej objekt, ki predstavlja člana kluba, vsebuje štiri podatke:

Programiranje 1 – VSŠ Informatika

C# . NET

175

public class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka; }

Klub - uporaba
using MojaKnjiznica; public class TestKlub { public static void Main(string[] args) {

Clan a = new Clan(); a.ime = "Janez"; a.priimek = "Starina"; a.letoVpisa = 2000; a.vpisnaStevilka = "2304";

Clan b = new Clan(); b.ime = "Mojca"; b.priimek = "Mavko"; b.letoVpisa = 2001; b.vpisnaStevilka = "4377";

Clan c = b; c.ime = "Andreja";

Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek + " " + a.letoVpisa + " (" + a.vpisnaStevilka + ")\n");

Programiranje 1 – VSŠ Informatika

C# . NET

176

Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek + " " + b.letoVpisa + " (" + b.vpisnaStevilka + ")\n"); Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek + " " + c.letoVpisa + " (" + c.vpisnaStevilka + ")\n"); Console.ReadLine(); } }

Zakaj
public class TestKlub { public static void Main(string[] args) {

Clan a; a = new Clan(); a.ime = "Janez"; a.priimek = "Starina"; a.letoVpisa = 2000; a.vpisnaStevilka = "2304";

Clan b = new Clan(); b.ime = "Mojca"; b.priimek = "Mavko"; b.letoVpisa = 2001; b.vpisnaStevilka = "4377";

Clan c; c = b; c.ime = "Andreja";

Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek + " " + a.letoVpisa + " (" + a.vpisnaStevilka + ")\n");

Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek +

Programiranje 1 – VSŠ Informatika

C# . NET

177

" " + b.letoVpisa + " (" + b.vpisnaStevilka + ")\n"); Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek + " " + c.letoVpisa + " (" + c.vpisnaStevilka + ")\n"); Console.ReadLine(); } }

Zgled – športni klub, nadaljevanje
• Spremenimo sedaj naš razred Clan tako, da bomo
uporabili konstruktor

Programiranje 1 – VSŠ Informatika

C# . NET

178

public class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka;

public Clan(string i, string p, int l, string v) { this.ime = i; this.priimek = p; this.letoVpisa = l; this.vpisnaStevilka = v; } }

Šprtni klub - test

• Bo naš testni program OK? • Poženimo • Napake!
– Kako, rekli smo, da spreminjanje
razreda ne vpliva na uporabniške programe – Spremenili smo način uporabe – V testnem programu: Clan()
Programiranje 1 – VSŠ Informatika

če nismo napisali nobenega konstruktorja Popravljeni zgled public class Clan { public string ime.ime = i. public int letoVpisa.letoVpisa = 0. this. this. this.letoVpisa = l.priimek = "Ne vem". public string vpisnaStevilka. string p.C# . string v) { this. this. } public Clan(string i.vpisnaStevilka = "Ne vem". int l. NET 179 Tega sedaj ni – C# ga naredi sam le. this.vpisnaStevilka = v. } } Poskus testa • Ni težav! Programiranje 1 – VSŠ Informatika . this.priimek = p. public Clan() { this.ime = "Ne vem". public string priimek.

• Preglednost! – In priprava za naprej Programiranje 1 – VSŠ Informatika . NET 180 • Zakaj ves ta napor.C# . če pa je na koncu le isto ...

letoVpisa = 2000. a.vpisnaStevilka = "4377". . NET 181 Primerjava: brez / s konstruktiorjem public class TestKlub { public static void Main(string[] args) { Clan a = new Clan(). a. a..ime = "Janez".priimek = "Starina". Clan b = new Clan(). b..C# . Clan c = b. public class TestClan{ public static void Main(string[] args) { Clan a = new Clan("Janez". b. "4377"). "2304"). 2001.letoVpisa = 2001. b. "Mavko".priimek = "Mavko".ime = "Andreja". 2000. a.ime = "Mojca". b. Clan c = b. c. Programiranje 1 – VSŠ Informatika . Clan b = new Clan("Mojca".vpisnaStevilka = "2304". "Starina".

WriteLine("To naj se izpiše").Console..ime = "Andreja". NET 182 c.Equals(primerjava) • Metoda v razredu Clan Programiranje 1 – VSŠ Informatika .imeMetode(parametri) – System.C# .. – besedilo. Objektne metode • V definicijo razreda običajno spadajo tudi metode • Klic objektnih metod: – imeObjekta. .

ime + " " + a.C# .vpisnaStevilka + ") "). "2304")." + this. String inicialkeClanaA = a.ime[0] + ". "Starina".Inicialke().WriteLine("ima inicialke: " + inicialkeClanaA). Console. 2000.letoVpisa + " (" + a. Console. NET 183 public string Inicialke() { return this.priimek + " " + a. // knjižnica z razredom Clan public class TestClan{ public static void Main(string[] args) { Clan a = new Clan("Janez". } Uporaba metode using MojiRazredi.priimek[0] + ".Write("Clan a:\n" + a.". Programiranje 1 – VSŠ Informatika . } } Sprememba metode public class Clan { public string ime.

public int letoVpisa. da z – a = b. ampak sedaj a in b označujeta isti objekt. } public Clan(string i. letoVpisa = 0.ime[0] + " " + this. ki vrača objekt iz Razreda • Vemo. string v) : this() { ime = i. NET 184 public string priimek. public Clan() { ime = "Ne vem". v a ne shranimo kopije objekta b.priimek[0]. • kjer sta a in b obe spremenljivki tipa Clan. } } Metoda. public string vpisnaStevilka. vpisnaStevilka = "Ne vem". priimek = p. letoVpisa = l. int l.C# . priimek = "Ne vem". ki naredi kopijo objekta. string p. • Metoda. Programiranje 1 – VSŠ Informatika . vpisnaStevilka = v. } public string Inicialke() { return this.

– V a je nov objekt.Kopija().C# . Programiranje 1 – VSŠ Informatika . NET 185  a = b. ki pa ima iste podatke kot b.

letoVpisa = this. nov. nov.ime + " " + this. nov. } Še metoda za izpis public void Izpis() { Console. NET 186 Kopija public Clan Kopija() { Clan nov = new Clan().letoVpisa. nov.ime.C# .priimek.vpisnaStevilka.priimek + " " + this.vpisnaStevilka = this. return nov.vpisnaStevilka + ")\n").ime = this.priimek = this.letoVpisa + " (" + this. } ali pa še Programiranje 1 – VSŠ Informatika .WriteLine("Clan:\n" + this.

ime = "Andreja".ime = "Tadeja". Clan d = b. Console.Opis()). c. "Mavko".ReadLine(). "Starina". NET 187 public string Opis() { return this. Clan c = b. Console. } } Programiranje 1 – VSŠ Informatika . d.vpisnaStevilka + ").priimek + " " + this.WriteLine("Clan d").WriteLine("Clan b:\n" + b.letoVpisa + " (" + this.ime + " " + this. Console. a. "2304").WriteLine("Clan a"). Console. Clan b = new Clan("Mojca".C# . 2000.Izpis(). } Uporaba public class TestKlub { public static void Main(string[] args) { Clan a = new Clan("Janez".Kopija(). d.Izpis().WriteLine("Clan c:\n" + c). 2001. Console. "4377").

. NET 188 Razred Datum • • • Denimo. Programiranje 1 – VSŠ Informatika .C# .. da v naših programih pogosto delamo z datumi. Zato bomo sestavili ustrezni razred Načrt razreda: – Podatki dan (število) mesec (izbira: število ali pa niz) Leto (število) – Metode Konstruktorji Izpiši Povečaj za 1 dan Je datum smiselen Je leto prestopno Nov datum za toliko in toliko dni pred/za danim datumom Dan v tednu .

1.C# .l (na primer 12.leto = leto. public Datum() { dan = 1.dan = d.1.m. mesec = "januar" leto = 2000.mesec = m. // this ni nujen this. int l) : this(l) { // leto smo že nastavili this. public string mesec.2006 ali Programiranje 1 – VSŠ Informatika . } // privzeti datum je torej 1. } // datum je torej d. // this je nujen } // datum je torej 1. NET 189 Datum – podatki in konstruktor public class Datum { public int dan.leto public Datum(int d. public int leto.3. string m.2000 Dodatni konstruktorji public Datum(int leto) : this() { this.

marec 2006) Prestopno • Zanima nas. ali je leto prestopno Programiranje 1 – VSŠ Informatika . NET 190 // 12.C# .

} Dodaj en dan public void PovecajZaEnDan() { dan = dan + 1. if (dan == 29 && mesec == "februar" && this. return true.IndexOf(mesec) > 0){ mesec = mesec + 1.leto. } Programiranje 1 – VSŠ Informatika . mesec in leto sta ok string[] meseciPo30 = {"april". if (dan < 29) return. // lahko nehamo.JePrestopno()) return. if (dan == 31) { if (meseciPo30. leto++. if (leto % 100 == 0) return false. if (leto % 4 != 0) return false.C# . NET 191 public bool JePrestopno() { int leto = this. if (dan == 29 && mesec != "februar") return."september". if (leto % 400 == 0) return true. "november"}. if (mesec == 13) { mesec = 1."junij".

NET 192 return. } // če je 32 dni.C# . je zagotovo Uporaba razreda • Ugotovi. če je letošnje leto prestopno! Programiranje 1 – VSŠ Informatika .

} else { Console. tako.jePrestopno()) { Console.letoVpisa > drugClan. 3.WriteLine("Ni prestopno leto").letoVpisa) { … • Spremenimo razred Clan. da vodimo datum vpisa Programiranje 1 – VSŠ Informatika . } } Sprememba razreda • Imamo if (enClan. NET 193 using MojiRazredi. public class JeLetosPrestopnoLeto { Datum danes = new Datum(5. if (danes.WriteLine("Je prestopno leto").C# . 2009).

public Clan() { ime = "Ne vem".C# . priimek = "Ne vem".priimek[0] + ". priimek = p. public Datum datumVpisa. vpisnaStevilka = "Ne vem". public string vpisnaStevilka.". Programiranje 1 – VSŠ Informatika .datumVpisa. string p. nov. nov. nov.ime. nov.vpisnaStevilka = this. datumVpisa = new Datum().Kopija(). } public string Inicialke() { return this.vpisnaStevilka.priimek.priimek = this.ime[0] + ". Datum d. datumVpisa = d." + this.datumVpisa = this. } public Clan Kopija() { Clan nov = new Clan(). NET 194 public class Clan { public string ime. vpisnaStevilka = v. string v) : this() { ime = i. public string priimek. } Sprememba razreda public Clan(string i.ime = this.

vpisnaStevilka + ")\n").leto = l. ne spremnimo inč in vrnemo false } } Programiranje 1 – VSŠ Informatika . } Sprememba razreda public string Opis() { return this. } public bool SpremeniLetoVpisa(int l) { if ((2000 <= leto) && (leto <= 2020)) { this. NET 195 return nov.vpisnaStevilka + ").Opis().priimek + " " + this. } public void Izpis() { Console.priimek + " " + this.datumVpisa.C# .WriteLine("Clan:\n" + this.OpisDat() + " (" + this. //leto je smiselno. } public string ToString() { return this.OpisDat() + " (" + this. popravimo stanje objekta in vrnemo true } return false.ime + " " + this.ime + " " + this.datumVpisa. return true.datumVpisa. // leto ni smsielno.

string p.datumVpisa = this.Kopija().ime = this.priimek + " " + this.ime[0] + ".vpisnaStevilkaevilka = this." + this.WriteLine("Clan:\n" + this. } public Clan Kopija() { Clan nov = new Clan(). nov. string v) : this() { ime = i.C# .datumVpisa. nov.vpisnaStevilka. } Sprememba razreda public void Izpis() { Console.ime.priimek = this. priimek = p.datumVpisa. } public string Opis() { Programiranje 1 – VSŠ Informatika " (" + .priimek.OpisDat() + this.". return nov. nov. vpisnaStevilka = v.priimek[0] + ".ime + " " + this. } public string Inicialke() { return this. nov.vpisnaStevilka + ")\n"). NET 196 Sprememba razreda public Clan(string i. datumVpisa = d. Datum d.

priimek + " " + this.OpisDat() + " (" + this.datumVpisa.letoVpisa > drugClan. } return false.ime + " " + this. ne spremenimo nič in vrnemo false } } //leto je smiselno.leto = l. popravimo stanje objekta in vrnemo true Način programiranja • Seveda zaradi spremembe if (enClan.vpisnaStevilka + "). // leto ni smiselno. return true. NET 197 return this.datumVpisa.letoVpisa) { … • ne deluje več! • Kako popraviti? Programiranje 1 – VSŠ Informatika . } public bool SpremeniLetoVpisa(int l) { if ((2000 <= leto) && (leto <= 2020)) { this.C# .

letoVpisa = leto.letoVpisa. // leto ni smiselno. ne spremnimo nič in vrnemo false } public int VrniLetoVpisa() { return this. NET 198 Že v prvotnem razredu public class Clan { public string ime. public bool SpremeniLetoVpisa(int leto) { if ((2000 <= leto) && (leto <= 2020)) { this. return true. } } Ob spremembi razreda Clan • Le metodo Programiranje 1 – VSŠ Informatika . } return false. public string priimek.C# . public string vpisnaStevilka. public int letoVpisa.

če moramo kasneje spremeniti način predstavitve podatkov o objektu Programiranje 1 – VSŠ Informatika .C# .masa = -3. ali so podatki pravilni -vsi postopki po nepotrebnem bolj zapleteni Objekt naj sam poskrbi.leto. Ker ne moremo vedeti. da ni najboljši. je == CENZURA == rjavko.datumVpisa. } • zamenjamo z public int VrniLetoVpisa() { return this.letoVpisa. da bo v pravilnem stanju Nobene kontrole nad pravilnostjo podatkov o objektu! • Težave. } Dostop do stanj objekta • • Možnost.2. da neposredno dostopamo do stanj/lastnosti objekta NI NAJBOLJŠI! – – – – Ne le. NET 199 public int VrniLetoVpisa() { return this.

NET 200 Zgled public class TestClan{ public static void Main(string[] args) { Clan novClan = new Clan(). Dodajmo metodo • Ni problem.letoVpisa = 208.C# . novClan. novClan. napisali bomo metodo. ki bo vnos preverjala Programiranje 1 – VSŠ Informatika .ime = "Katarina".

novClan.letoVpisa = 2007.letoVpisa = leto.SpremeniLetoVpisa(208). novClan. public string priimek. public string vpisnaStevilka. NET 201 public class Clan { public string ime. popravimo stanje objekta in vrnemo true } return false. novClan. public int letoVpisa. //leto je smiselno. ne spremenimo nič in vrnemo false } } Uporaba metode public class TestKlub { public static void Main(string[] args) { Clan novClan = new Clan(). Programiranje 1 – VSŠ Informatika . … // konstruktorji in metode kot prej! public bool SpremeniLetoVpisa(int leto) { if ((2000 <= leto) && (leto <= 2020)) { this. return true.C# . // leto ni smiselno.ime = "Katarina".

NET 202 novClan. Dostopi do stanj • • ime_objekta.10. // v razredu MojObjekt Kdorkoli naredi objekt vrste MojObjekt Programiranje 1 – VSŠ Informatika . od kjerkoli (iz katerihkoli datotek (razredov)) imeObjekta. public • Znotraj razreda NI omejitev.masa = -100. vedno (ne glede na način dostopa) je možen dostop do komponent.C# . private double masa.SpremeniLetoVpisa(2008).stanje Zakaj je to lahko problem? – – “zunanji” uporabnik nastavi napačno vrednost   z1. private Datum datumRojstva. Kasneje je ni mogoče spremeniti Uporabnik pozna predstavitev • Načini dostopa • • internal public string serijska. • public – Do lastnosti lahko dostopajo vsi. public int[] tab.lastnost – – public int javnaLastnost. – – – – public private protected • bool spol.

NET 203 MojObjekt x = new MojObjekt(). – Pri poskusu dostopa do privatnaLastnost x. razen metod znotraj razreda Ko pišemo načrt razreda this. razredu MojObjekt // v – Če kdo naredi objekt vrste MojObjekt MojObjekt x = new MojObjekt(). – lahko dostopa do javnaLastnost x.javnaLastnost private • private – Do lastnosti ne more dostopati nihče.C# .lastnost lastnost – private int privatnaLastnost.privatnaLastnost Prevajalnik javi napako Programiranje 1 – VSŠ Informatika .

false = zenska private double masa. // masa zajca ob zadnjem pregledu public SpremeniTezo(double x) { this. // true = moski. // serijska stevilka zajca public bool spol. } } Dostop do stanj/lastnost • Kako uporabiti: – – Metode za dostop do stanj  "get" metode Metode za nastavljanje stanj  "set" metode • Zakaj je boljši dostop preko metod kot neposredno – – Možnost kontrole pravilnosti! Možnost kasnejše spremembe načina predstavitve (hranjenja podatkov) Programiranje 1 – VSŠ Informatika . // serijska stevilka zajca public bool spol.masa = x. // masa zajca ob zadnjem pregledu } Razred Zajec2 public class Zajec2 { public string serijska. NET 204 Razred Zajec public class Zajec { public string serijska.C# . false = zenska private double masa. // true = moski.

.. – V bistvu isto kot zajcek.masa = -12... ko naredimo objekt (kasneje ne. spol lahko nastavimo le.)..SpremeniTezo(2. saj se ne spreminja .SpremeniTezo(-12.. 2. "navzven" kot ime ("januar". določene vrste živali . NET 205 Dostop do stanj/lastnost • Zakaj je boljši dostop preko metod kot neposredno – Možnost oblikovanja pogleda na podatke  Podatke uporabniku posredujemo drugače. – V bistvu isto kot zajcek. če je taka sprememba teže smiselna! • zajcek.) Dostop do določenih lastnosti lahko omejimo  Npr.5). če odmislimo kakšne operacije. – Nastavitve stanj/podatkov • • Nastavitve stanj – “prireditveni stavek” zajcek...5). . "februar" .)  Hranimo lahko tudi določene podatke. ki jih uporabnik sploh ne potrebuje .5.masa = 2.C# .5. – A metoda spremeniTezo lahko PREVERI. seveda. kot jih hranimo (datum – interno je mesec število (1.. – A tu bomo lahko PREPREČILI postavitev lastnosti objekta v napačno stanje! Programiranje 1 – VSŠ Informatika .

masa = novaTeza.C# . NET 206 Razred Zajec .SpremeniTezo public void SpremeniTezo(double novaTeza) { // smislena nova teza je le med 0 in 10 kg if ((0 < novaTeza) && (novaTeza <= 10)) this. da se teža ne more spremeniti bolj kot za 15% Programiranje 1 – VSŠ Informatika . // sprememba uspela } // v nasprotnem primeru NE spremenimo teže // in javimo.masa = novaTeza. da spremembe nismo naredili return false. } SpremeniTezo • Imamo lahko OBE metodi? – – – NE Imata enak podpis (ime + tipi parametrov) Tip rezultata NI del podpisa! • Metoda je seveda lahko bolj kompleksna – denimo vemo. return true. // v nasprotnem primeru NE spremenimo teže } public bool SpremeniTezo(double novaTeza) { // smislena nova teza je le med 0 in 10 kg if ((0 < novaTeza) && (novaTeza <= 10)){ this.

NET 207 public bool SpremeniTezo(double novaTeza) { // smislena nova teza je le med 0 in 10 kg // in če ni več kot 15% spremembe od zadnjič int sprememba = (int)(0.. da spremembe nismo naredili return false. // sprememba uspela } // v nasprotnem primeru NE spremenimo teže // in javimo. Lahko pa this spustimo! return true. če se uporabnik "obnaša lepo" Zajec neki = new Zajec("X532". 105 kilogramskega zajca verjetno ni.masa – novaTeza) / this.5 + (100 * Math.masa .abs(this. } Teža in konstruktor • Seveda je smiselno. 105). // this. if ((0 < novaTeza) && (novaTeza <= 10) && (sprememba <= 15) ){ masa = novaTeza.05 Zato je kontrola smiselnosti podatkov potrebna tudi v konstruktorjih! • Pogosto na to pozabimo – – – Programiranje 1 – VSŠ Informatika . da zagotovimo..masa). da je teža ustrezna že ves čas! – Pozor na začetno stanje: konstruktor! – Tudi v konstruktorju preverimo.C# . a uporabnik je pozabil na decimalno piko v 1. true.

Equals("NEDLOČENO")) { this.C# . } return false. // ne smemo spremniti že obstoječe! } Dostop do stanj • Poizvedba – – – – “spremenljivka” v izrazu • zajcek. mi pa bomo interno stvar vodili natančneje Programiranje 1 – VSŠ Informatika . je ta metoda odveč . SpremeniSerijsko • Kaj pa SpremeniSpol – Če niste v kakšni čudni industriji ali razvoju. če serijske štev. NET 208 SpremeniSpol. ni if (this.-)) • • Morda tudi metoda SpremeniSerijsko – – Pozor na konstruktor brez parametrov Serijska je "NEDOLOČENO" Metoda SpremeniSerijsko naj pusti spreminjati le take serijske številke! public bool SpremeniSerijsko(string seStev) { // sprememba dopustna le.masa.serijska = seStev. Lahko stvar "oblikujemo" – recimo. return true. da bomo uporabniku vedno povedali le težo na pol kilograma.PovejTezo() Da bomo lahko izvedeli težo zajca Najenostavneje v telesu metode le return this.serijska.

prištejemo k celim kg 0.5 kg natančno 2.905  2.C# . // ali return masa } • Ali pa prilagodimo podatke – – – – – Težo povemo na 0.povejTezo public double PovejTezo() { return this.5.0 Programiranje 1 – VSŠ Informatika . 2.masa.502  .721  2.5.5 Če je več kot 7. 3. 2.. prištejemo k celim kg 1.. NET 209 Razred Zajec . Vzamemo težo v celih kg in pogledamo prvo decimalko decimalnega dela Če je med 3 in 7.

masa – tezaKg) * 10).serijska = "NEDOLOČENO".0. // in tehtajo 1kg this.1 public class Zajec { private string serijska.masa = 1. Programiranje 1 – VSŠ Informatika .0. int decim = (int)((this. NET 210 public double PovejTezo() { // težo bomo povedali le na 0. double masa):this() { this.0.C# . bool spol. this. private double masa. return tezaKg + 1.serijska = serijskaStev. // konstruktor public Zajec() { this.masa.serijska = serijskaStev. } public Zajec(string serijskaStev):this() { this. spol this.5.5 kg natančno int tezaKg = (int)this. // uporabimo metodo za sprem. private bool spol. // vsem zajcem na začetku določimo m.SpremeniTezo(masa). } Celotni razred Zajec . } public Zajec(string serijskaStev. if (decim < 3) return tezaKg + 0. if (decim < 8) return tezaKg + 0.spol = true.

. if (decim < 8) return tezaKg + 0. Programiranje 1 – VSŠ Informatika . } public bool SpremeniTezo(double novaTeza) { // smislena nova teza je le med 0 in 10 kg if ((0 < novaTeza) && (novaTeza <= 10)){ masa = novaTeza. NET 211 this. int decim = (int)((this.spol = spol.5 kg natančno int tezaKg = (int)this. // sprememba uspela } // v nasprotnem primeru NE spremenimo teže // in javimo. da spremembe nismo naredili return false.0.masa. if (decim < 3) return tezaKg + 0. // this.. } Celotni razred Zajec .5. } Celotni razred Zajec .masa – tezaKg) * 10).2 public double PovejTezo() { // težo bomo povedali le na 0.masa .C# . return tezaKg + 1.serijska. Lahko pa this spustimo! return true.0.3 public string PovejSerijsko() { return this.

Console. št. false. if (z1. NET 212 } public void SpremeniSerijsko(string s) { this. else Console.C# . } // ker se spol naknadno NE spremeni.WriteLine("Zajec ima ser.12). metode za // spreminjanje spola sploh ne ponudimo uporabniku! } // Zajec Uporaba razreda Zajec public class ZajčnikNov { public static void Main(string[] ar) { Zajec z1 = new Zajec("1238-12-0".serijska = s.spol.WriteLine("Teža je spremenjena na " + z1. } public bool JeSamec() { return this.PovejSerijsko()). } } Ostale metode • • Poleg get/set metod in konstruktorjev Metode Programiranje 1 – VSŠ Informatika .PovejTezo()).:" + z1.PovejTezo() + 0.3)) Console. 0.WriteLine("Teža je nespremenjena!" + " Prirastek je prevelik! Preveri!").SpremeniTezo(z1.

če so enaki nekemu drugemu nizu: • • "naši" razredi – Sprogramiramo znanje – ustrezne metode Zajec bo znal povedati svojo vrednost. če mu povemo ceno za kg žive teže Programiranje 1 – VSŠ Informatika .Equals("Lokar") Znajo vrniti spremeniti črke v male in vrniti nov niz: Znajo povedati.C# . NET 213 – – Odzivi objektov "znanje objektov" Znajo povedati. kje se v njih začne nek podniz: • Objekti tipa string – – –    "niz".ToLower() mojPriimek.IndexOf("i") nekNiz.

using MojaKniznica. Programiranje 1 – VSŠ Informatika .PovejTezo() > 0). NET 214 Razred Zajec – dodatne metode public double Vrednost(double cenaZaKg) { // pove vrednost zajca // zajce tehtamo na dogovorjeno natančnost return cenaZaKg * this. Console.WriteLine("To je zajec: " + zeko).C# . } Metoda ToString Poglejmo si naslednji program: using System. namespace Izpis { class Program { public static void Main(string[] args) { Zajec zeko = new Zajec().PovejTezo(). če ga je smiselno // napojiti. da bomo "ujeli" naslednjih pol kg // dejanska teža je večja od "izmerjene" return (this. } public bool MeNapojiti() { // ugotovimo.masa – this.

.ToString() + "!".. radi bi kakšne bolj smiselne informacije V razredu. a naletimo na objekt. (se torej pretvorijo v niz) A s pretvorbo nismo ravno zadovoljni. se ta metoda pokliče avtomatično  string niz = "Zajec " + zeko.C# . . ").ReadKey(true). } } } ToString • • • • • • Očitno objekte lahko tudi izpišemo Gre seveda tudi takole – string niz = "Zajec " + zeko + "!". Torej se tudi objekti "obnašajo" tako kot int. double .Write("Press any key to continue . ki ga definiramo (recimo Zajec) napišemo metodo ToString Če na določenem mestu potrebujemo niz. . NET 215 Console. Programiranje 1 – VSŠ Informatika . Console.

NET 216 Metoda ToString Isti program. ").C# . Console. using MojaKniznica.override Programiranje 1 – VSŠ Informatika . . Console. namespace Izpis { class Program { public static void Main(string[] args) { Zajec zeko = new Zajec(). da je v razredu Zajec metoda ToString: using System.PovejSerijsko().ReadKey(true). } • Posebnost . a tako.WriteLine("To je zajec: " + zeko).Write("Press any key to continue . . Console. } } } ToString • V razred Zajec smo napisali public override string ToString() { return "Zajec: " + this.

: starsi Zajca Programiranje 1 – VSŠ Informatika .ToString() + "!". } • Metodo Opis moramo poklicati sami.C# . string niz3 = "Zajec " + zeko. NET 217 • Zaradi "dedovanja" – – – O tem kasneje Z dedovanjem smo avtomatično pridobili metodo ToString (zato je vedno na voljo) Zato override. metoda ToString se kliče avtomatsko (če je potrebno) – – – string niz1 = "Zajec " + zeko. • • Vsi trije niz enaki! ToString obstaja.Opis() + "!". } • in public string Opis() { return "Zajec: " + this. da "povozimo " podedovano metodo ToString in Opis • Razlika med public override string ToString() { return "Zajec: " + this. tudi. če jo ne napišemo (a verjetno z vrnjenim nizom nismo najbolj zadovoljni) Tudi objekti so lahko del razreda • • Ko sestavljamo razred.PovejSerijsko() .PovejSerijsko() . kot objektne spremenljivke lahko uporabimo tudi spremenljivke istega razreda Npr. string niz2 = "Zajec " + zeko + "!".

NET 218 • Razred Clan – public class Clan {    private string ime. .C# . private bool spol.. private string serijska. private Zajec oce. private zajec mati. private Clan gaJePriporocil.. Še malo o zajcih • Preden nadaljujemo – Želimo hraniti tudi starše zajca public class Zajec { private double masa. – Še konstruktor Problemi s konstruktorjem • Sestavimo privzeti konstruktor Programiranje 1 – VSŠ Informatika .

spol = true. Problemi s konstruktorjem • • Rekurzija brez ustavitve Tudi konstruktor je metoda – – Ustavitveni pogoj A pri konstruktorju brez parametrov ni parametrov. morata starša že Programiranje 1 – VSŠ Informatika . mama = null. ki bi lahko določili ustavitveni pogoj Kaj storiti • • • • "Privzeti" zajec ne pozna staršev oce = null.mama = new Zajec(). this. Če malo pomislimo – ko zajca "naredimo".serijska = "NEDOLOČENO". this.C# . je vse v redu.0. this. A ob poskusu – Zajec rjavko = new Zajec(). NET 219 public Zajec() { this.oce = new Zajec().masa = 1. } • Ko stvar prevedemo. this.

Avto lahko vozi le v primeru. trenutnaHitrost (npr.325 litrov).  SpremeniHitrost(h): spremeni trenutnaHitrost na vrednost h km/h. NET 220 obstajati – Ju nima smisla ustvarjati na novo Razred Avto Sprogramirajte razred Avto.05 litra goriva (če ni zadosti goriva se avto ne vžge)  UgasniAvto(): nastavi atribut avtoVzgan na false. pri čemer se porabi 0. ki omogoča ločevanje posameznih avtomobilov.  Vozi(t): vozi t minut s trenutno hitrostjo in vrne koliko poti je v tem času prevozil. dokler ne zmanjka goriva. Metoda povzroči spremembo atributov stevecKm in kolicinaGoriva.0).   Ustavi(): spremeni trenutnaHitrost na vrednost 0 km/h. 234. Trenutno stanje avtomobila se ne spremeni. so tehnične značilnosti opisane z atributi najvecjaHitrost (v km/h). Hitrost avtomobila je med 0 in najvecjaHitrost. VzgiAvto(): nastavi atribut avtoVzgan na true. NapolniGorivo(): nastavi atribut kolicinaGoriva na vrednost velikostRezervoarja.142 km). velikostRezervoarja (v litrih) in povprečnaPoraba (v litrih/100 km). Razred naj vsebuje sledeče attribute: Poleg atributa stevilka. Razred naj vsebuje naslednje metode:  NastaviStevilko(s): nastavi atribut stevilka na s (recimo 1). 56. 14. naj vožnja poteka tako dolgo. Programiranje 1 – VSŠ Informatika . koliko minut in sekund lahko še vozimo glede na trenutno količino goriva. NastaviPovPorabo(l): nastavi atribut povprecnaPoraba na l litrov/100 km (recimo 7.12 km/h) in kolicinaGoriva (npr. ki predstavlja avtomobil z njegovimi tehničnimi značilnostmi in trenutnim stanjem.      NastaviNajvecjoHitrost(h): nastavi atribut najvecjaHitrost na h km/h (recimo 180). pri čemer se lahko avto ugasne le.C# . da je vžgan (atribut avtoVzgan nastavljen na true) in ima trenutno hitrost večjo kot 0. NajvecjiCas(): metoda vrne podatek. ko je njegova hitrost enaka 0.5). stevecKm (npr. Če je goriva premalo. Trenutno stanje avtomobila predstavljajo atributi avtoVzgan (tipa boolean). NastaviVelRezervoar(l): nastavi atribut velikostRezervoarja na l litrov (recimo 48.

v rezervoarju pa imamo trenutno količino goriva. Pri tem je treba upoštevati. z največjo hitrostjo h. da bi d km oddaljen kraj dosegel v t minutah.  Boljsi(a): primerja trenutni avtomobil z avtomobilom a in izpiše stevilko boljšega avtomobila. spreminjanje hitrosti in vse informativne izpise. v sedanjem času pripada temu pristopu. Za generiranje avtomobilov sprogramirajte tri konstruktorje:    prvi naj bo brez parametrov in zgenerira avtomobil. ostale vrednosti pa naj bodo prazne. da prevozimo d kilometrov. zgenerira pa naj avtomobil številke s. da avto pri vseh hitrostih porabi enako količino goriva. M. Kar je v sedemdesetih letih pomenilo strukturirano programiranje. pri čemer upoštevajte tudi čas polnjenja goriva. OOP v C++ (avtor dr. Trenutno stanje avtomobila se ne spremeni. napolniti rezervoar.  PotovalnaHitrost(d. ga znova prižgati in odpeljati naprej. Atributi stevecKm. koliko kilometrov lahko prevozimo z največjo hitrostjo. Ţal je bilo na začetku prav tako tudi področje mnogih napačnih interpretacij. Pri vseh metodah predpostavljamo. tretji naj ima parametre s. Z uporabo vsakega konstruktorja definirajte po en avto. če vozimo z nespremenjeno hitrostjo.t): metoda vrne hitrost. Trenutno stanje avtomobila naj se sicer ne spremeni. Pri tem naj upošteva tudi eventuelna polnjenja rezervoarja. Krašna) 2. h. če je v rezervoarju še l litrov goriva. v in p. Trenutno stanje avtomobila se ne spremeni.  Izpis(): izpiše vse atribute avtomobila. ugasniti avtomobil. NET 221  Doseg(l): metoda vrne podatek. Boljši je tisti avtomobil.C# . S pomočjo metod za nastavljanje atributov dopolnite podatke za prva dva avtomobila. Razmišljanje "po objektno" Zadnjih nekaj let objektno programiranje in objektno usmerjena (objected oriented) tehnologija predstavlja precejšen bum. da količina goriva lahko tudi ne zadošča. ki ima vse atribute prazne (vrednost 0 ali false) drugi naj ima le parameter s in naj zgenerira avtomobil s številko s. trenutnaHitrost in kolicinaGoriva naj imajo vrednost 0. velikostjo rezervoarja v in povprečno porabo p. s katero naj avto vozi. v tem primeru bo treba ustaviti. nato pa izpišite vse podatke o vseh avtomobilih. Z vsemi simulirajte polnjenje goriva. vožnjo. Ponovno izpišite vse avtomobile ter jih primerjajte med seboj. ki v krajšem času prevozi 1000 km. Testiranje razreda Za testiranje razreda Avto napišite razred TestAvto. ki vzamejo dodatnih 15 minut. Različni ljudje so različno Programiranje 1 – VSŠ Informatika . avtoVzgan pa na false.  CasVoznje(d): metoda nam pove vrne koliko časa (v minutah in sekundah) potrebujemo. kar nam vzame dodatnih 15 minut.

priključen tiskalnik obnašanje: . state). torej sedite na objektu. kjer potekajo oz. stanje ali je računalnik priţgan ali ugasnjen. hitrost CD (DVD) enote. vedenje (ang. NET 222 interpretirali posamezne podrobnosti tega pristopa in hitro je prišlo do napačnih razlag kaj je objekt. in obnašanje oz. da mu povečamo kapaciteto pomnilnika ipd. Skupna značilnost vsem tem objektom je. Obnašanje računalnika na drugi strani je recimo formatiranje diska. sedite na stolu. zapisovanje datoteke na disk. Če pogledamo naokoli (pa naj bo kar računalniška učilnica. recept: stanje je predstavljeno s spremenljivkami. Poenostavljeno gledano je torej. seznam priključenih enot nanj. na vsako bitje lahko gledamo. preprosto pravilo oz. so potekale vaje). torej dva objekta.tiskanje dokumenta . ipd. Kako to dvoje poveţemo v delujoče programe predstavlja mnogim na začetku zaradi nekoliko drugačnega razmišljanja teţavo. kaj razred.kapaciteta diska .količina RAM pomnilnika . lahko vidimo več objektov.priţgan ali ugasnjen računalnik . torej objekt. na vsak predmet. behaviour). Ko ste na vajah.brisanje datoteke na disku Programiranje 1 – VSŠ Informatika . Stanje je bolj široko gledan pojem (prevod besede v slovenščino zagotovo ni najbolj primeren) in lahko za računalnik recimo predstavlja moč njegovega procesorja. kakor da je objekt.ugašanje računalnika . ipd. kaj metode. Pred vami je vaš delovni računalnik.zapis datoteke na disk . Tipkovnica je sestavljena iz mnoţice tipk.priţiganje računalnika . tiskanje dokumenta. obnašanje pa z metodami (funkcije in procedure).število USB priključkov .hitrost CD enote . Ključna pojma takšnega pristopa v programiranju sta objekt in razred.hitrost procesorja . kapaciteto diska.C# . Na vsako konkretno zadevo. da imajo: stanje (ang. da zbrišemo datoteko na disku. količino RAM pomnilnika. torej mnoţice objektov. spremenljive. Računalnik med drugim vsebuje miško in tipkovnico. da imamo na eni strani statične lastnosti in na drugi dinamične oz. število USB priključkov. kot recimo ali je priključen tiskalnik. priţiganje računalnika (ali pa da ga ugasnemo). Za računalnik bi lahko recimo imeli naslednjo tabelo stanje: .

bo Programiranje 1 – VSŠ Informatika . ipd. // ugasni računalnik void BrisiDatoteko(ImeDatoteke). // hitrost procesorja v megahercih int KolicinaPomnilnika. // hitrost enote v faktorjih pisanja (52x. ki predstavljajo stanje. Dobra izbira metod je ključnega pomena.. če je ugasnjen zaradi česar imamo pri metodi dve moţnosti: bodisi bomo ugasnili računalnik. ki je ţe ugasnjen.C# . na kateri tiskalnik bomo natisnili dokument. če je priţgan in false. // true. // število USB priključkov bool Prizgan. sicer false Stanje je torej smiselno zapisano s spremenljivkami. kot bo kasneje v primerih iz pisnih izpitov. polja. // zapiše datoteko na disk void NatisniDokument(ImeDokumenta). Recimo. ko ugasnemo računalnik? Kakšna je stanje računalnika pred to metodo in kakšno potem oziroma kakšna je razlika stanja? Na ta in podobna vprašanja moramo pomisliti. V tem preprostem primeru so sedaj le cela števila in dvakrat logična vrednost. da si lahko kvalitetno zamislimo implementacijo vseh metod za obnašanje. // natisni dokument na tiskalnik void PrizgiRacunalnik().). kar predstavimo s parametri metod. da bi obnašanje računalnika ponazorili s temi metodami: obnašanje: void ZapisiDatoteko(ImeDatoteke). ki je priţgan ali pa bomo ţeleli ugasniti računalnik. kot bo na pisnih izpitih) za enostaven primer (nekaj postavk pri obnašanju iz zgornje tabele bo namenoma izpuščenih). ker si stanje nismo recimo dovolj dobro zamislili. da je na tej stopnji potrebno spremeniti spremenljivke. katero datoteko bomo natisnili ali zbrisali. kako si lahko zamislimo metode (kar ne velja za primere. če je priključen tisk.) int SteviloUSBPrikljuckov. Za vsako postavko iz seznama obnašanja si moramo smiselno zamisliti ali bomo uporabili funkcijo ali proceduro. ipd. // kapaciteta diska v megabajtih int HitrostCDEnote.. Na primeru računalnika poglejmo. Ima torej vrednost true. Pri izbiri stanja smo si zamislili. nizi. da ko bomo to metodo izvedli. datoteke. // brisanje datoteke z diska Zakaj na primer procedura za ugašanje računalnika? Kaj v tej proceduri sploh naredimo? Bi bila morda funkcija bolj primerna? Potrebujemo kakšno povratno informacijo. kazalci. Za spremenljivke izberemo smiselne tipe spremenljivk. večkrat pa se izkaţe. prav tako pa tudi ali je morda to specifično obnašanje odvisno od kakšnih sekundarnih faktorjev (npr. // priţiganje računalnika void UgasniRacunalnik().. Ne glede na ti dve moţnosti pa vemo. kadar vam nekdo vnaprej predpiše metode. kar bi za primer z računalnikom recimo lahko bilo: stanje: int HitrostProcesorja. da bomo s spremenljivko Prizgan označili ali je računalnik priţgan ali ne.). // količina RAM pomnilnika v megabajtih int KapacitetaDiska. sicer false bool PrikljucenTiskalnik. če je računalnik priţgan. // true. . NET 223 . lahko pa je stanje opisano tudi mnogo kompleksneje (realna števila.formatiranje diska .povečanje kapacitete RAM-a kar pretvorimo v spremenljivke in metode. Nekoliko več dela je pri obnašanju.

t. če tiskanje ni bilo moţno. // priţgi računalnik V splošnem se lahko ravnamo po tem načelu: bolje več povratne informacije. class) in naš razred o računalniku torej kot CRacunalnik. da vemo da bo po izvedeni metodi računalnik ugasnjen. če bi metoda recimo vrnila true. ko bomo izvedli tiskanje dokumenta (torej. bi vrnili za povratno infomracijo true. Za preprosti primer je to morda dovolj dobro. da bomo razrede poimenovali vedno z začetno veliko črko C kot dodatno oznako. kako bi opisali nek konkreten objekt in to imenujemo razred . Po vzoru delovanja programskega paketa iz vaj. s tem razredom bomo pa hkrati definirali nov tip spremenljivke (enak imenu razreda). ipd. Ko pa so enkrat določene vrednosti tem spremenljivkam. še na hitro razlaga pojma razred. da bo po tej metodi računalnik ugasnjen. torej spremenljivka Prizgan bo imela vrednost false. potem govorimo o konkretnem primerku razreda. če smo ga zares ugasnili. Celotno obnašanje računalnika je za ta zgornji primer zamišljeno s procedurami. je pa stvar programerja. zaradi česar lahko to metodo implementiramo kot proceduro. bi nas morda vseeno lahko zanimalo ali smo računalnik zares ugasnili ali pa je ţe bil ugasnjen. V datoteki Racunalnik. o objektu (v slovenski literaturi najdemo tudi "primerek" in "instanca"). ne potrebujemo nobene povratne informacije. nikjer pa dejansko še ne določimo vrednosti. 80GB disk. V C++ bi zgoraj podani primer zapisali kot sledi v nadaljevanju: definirali bomo razred. če je bilo tiskanje moţno. Tako bi sedaj metodo void PrizgiRacunalnik().zapišemo torej splošne zadeve (stanje in obnašanje). Kar je bilo do sedaj navedeno je bilo zapisano.h je podana Programiranje 1 – VSŠ Informatika . ne vemo ali je dokument sploh moţno natisniti ali ne.. // natisni dokument na tiskalnik Prav tako bi recimo lahko izboljšali metodo za priţiganje (in tudi za ugašanje) računalnika.j. ko bomo v programu poklicali metodo NatisniDokument). njegovo stanje in obnašanje. In ker natančno vemo. če bomo povratno informacijo sploh uporabili. // natisni dokument na tiskalnik bi lahko torej bolj primerno zapisali kot bool NatisniDokument(ImeDokumenta). 512MB pomnilnika. Preden to zapišemo v programskem jeziku C++. oziroma false. Torej. pa false. na primer da imamo računalnik s hitrostjo 2GHz. // priţgi računalnik lahko bolj primerno zapisali kot bool PrizgiRacunalnik(). Ne glede na to. To je hkrati tudi morebitna sprememba stanja pri tej metodi. Na primer.C# . bo definicija razreda zapisana v dveh datotekah. ali je na računalnik sploh priključen tiskalnik ali ne in ali je računalnik sploh priţgan? Obnašanje metode za tiskanje dokumentov bi tako lahko bilo "boljše". za realnejše primere pa je včasih zaţeljeno več informacije. če pa je ţe bil ugasnjen. da gre za razred (ang. NET 224 računalnik ugasnjen. Dogovorimo se. ker na računalnik ni priključen tiskalnik ali pa ker računalnik ni priţgan. Z drugimi besedami. Metodo void NatisniDokument(ImeDokumenta). kakor premalo.

To sledi v naslednji datoteki s končnico *. . // priţiganje računalnika void UgasniRacunalnik().. // hitrost enote v faktorjih pisanja (52x.. Racunalnik. .h. // natisni dokument na tiskalnik bool PrizgiRacunalnik(). // ugasni računalnik void BrisiDatoteko(char* ImeDatoteke). // kapaciteta diska v megabajtih int HitrostCDEnote. V *. return(true).C# . // število USB priključkov bool Prizgan. else return(false). lokalne spremenljivke ali pa spremenljivke. če je računalnik priţgan. Prizgan pa je ze true } void CRacunalnik::UgasniRacunalnik() { if (Prizgan == true) // ce je prizgan. Vsaki metodi je dodan zapis kateremu razredu pripada (tukaj CRacunalnik::). ga prizge Prizgan = true.cpp pa dejanska izvedba (koda) posameznih metod.povpraševanje po stanju. kar se definira v razredu oz.spreminjanje stanja in Programiranje 1 – VSŠ Informatika . Podan primer obnašanja in metode pa niso vse. Racunalnik. sicer false bool PrikljucenTiskalnik. vendar brez dejanske kode kaj se v teh metodah zares zgodi.. } void CRacunalnik::BrisiDatoteko(char* ImeDatoteke) { // koda te metode.cpp v kateri mora seznam metod ustrezati seznamu metod datoteki *.. če je priključen tisk. } V metodah se lahko uporabljajo spremenljivke razreda imenovane tudi razredne spremenljivke (kot sta na primer spremenljivki PrikljucenTiskalnik in Prizgan v zgornjem primeru). ga ugasne Prizgan = false. // zapiše datoteko na disk bool NatisniDokument(char* ImeDokumenta). } bool CRacunalnik::NatisniDokument(char* ImeDokumenta) { if (PrikljucenTiskalnik == true && Prizgan == true) return(true). // true. // brisanje datoteke z diska }.cpp: void CRacunalnik::ZapisiDatoteko(char* ImeDatoteke) { // koda te metode. // količina RAM pomnilnika v megabajtih int KapacitetaDiska. podane kot parameter metode..h datoteki je podan seznam spremeljivk stanja in seznam metod za obnašanje. } return(false).h: class CRacunalnik { // stanje int HitrostProcesorja.) int SteviloUSBPrikljuckov. // sicer vrne false. NET 225 osnovna definicija razreda. Med obnašanje spadajo: .. v datoteki Racunalnik.akcije. // true.. // hitrost procesorja v megahercih int KolicinaPomnilnika. } bool CRacunalnik::PrizgiRacunalnik() { if (Prizgan == false) // ce je ugasnjen. kar se lahko potem dejansko počne z dejanskim objektom. . sicer false // obnasanje void ZapisiDatoteko(char* ImeDatoteke).

enaki razredu. ko je konstruktor namenjen inicializaciji objekta.// povečanje RAM pomnilnika KolicinaPomnilnika += Koliko. Povpraševanje po stanju bi recimo predstavljal primer naslednje metode: int CRacunalnik::DajHitrostProcesorja() { return(HitrostProcesorja). NET 226 . če pa bi si jo zamislili kot funkcijo. ko se rezervira prostor za objekt v pomnilniku. KolicinaPomnilnika = 512. je lahko konstruktorjev mnogo. kot v teh dveh metodah ali pa posredno v drugih metodah (kot je na primer pri priţiganju računalnika). Programiranje 1 – VSŠ Informatika . TiskalnikPrikljucen = true. ta konstruktor pa se pokliče avtomatsko. da je ime metode. } Podobno bi lahko bilo za spreminjanje stanja (direktno ali indirektno) na primer metoda void CRacunalnik::NastaviHitrostProcesorja(int NovaHitrost) { HitrostProcesorja = NovaHitrost. ki predstavlja konstruktor enako imenu razreda. ko kreiramo objekt brez dodatnih parametrov. Namen konstruktorja je tako. je destruktor namenjen pokončanju objekta in "čiščenju" dinamično dodeljenega prostora v času delovanja objekta. ki ima ţe določene vrednosti spremenljivk HitrostProcesorja (2000). KolicinaPomnilnika (512). Prizgan = false. return(KolicinaPomnilnika). } Iz zapisa je razvidno. Primer osnovnega konstrukturja za računalnik bi recimo bil naslednji: CRacunalnik::CRacunalnik() { HitrostProcesorja = 2000. } če bi bila zamišljena kot procedura. da določimo vrednosti razrednim spremenljivkam (ne nujno vsem. le razlikovati se morajo med seboj v parametrih.C# . Prizgan (false) in TiskalnikPrikljucen (true). Medtem. Medtem. Primer akcije je na primer. ki jih sprejmejo. da smo ugasnili ali pa priţgali računalnik. Konstruktor se avtomatsko pokliče. ko je destruktor en sam. bi imeli: int PovecajKapacitetoRAMaZa(int Koliko). Posebni metodi sta pa konstruktor in destruktor in imata imeni. ki kot rezultat vrne novo količino pomnilnika.konstruktor ter destruktor. } "Spreminjanje stanja" je lahko torej neposredno. } ali pa povečanje kapacitete RAM pomnilnika z metodo void PovecajKapacitetoRAMaZa(int Koliko). Ločimo osnovni konstruktor (brez kakršnih parametrov) in dodatne konstruktorje. ampak kar pač potrebujemo).// povečanje RAM pomnilnika KolicinaPomnilnika += Koliko. V pomnilniku se takrat ustvari prostor za spremenljivko tipa CRacunalnik. destruktor pa ko se uniči.

Ime je enako razredu. int KolPom) { // parameter konstruktorja je hitrost procesorja in količina pomnilnika HitrostProcesorja = HitProc. Lahko pa poskrbimo. naštejemo kot parametre konstruktorja (torej parametre metode).ob uničenju objekta. Prizgan = false. Programiranje 1 – VSŠ Informatika . int KolPom) { // parameter konstruktorja je hitrost procesorja in količina pomnilnika HitrostProcesorja = HitProc. le da pred njim zapišemo znak ~ (tilda). obakrat namreč gre za enak seznam parametrov (imena spremenljivk niso pomembna. ki jih prejmejo. CRacunalnik::~CRacunalnik() { } Vsi konstruktorji in destruktorji morajo biti našteti tudi v datoteki s končnico *. Po definiciji konstruktor ne vrača vrednosti. Metoda void ime_metode(int Parameter1) je drugačna metodi void ime_metode(double Parameter1) medtem. TiskalnikPrikljucen = true. Prizgan = false. Dva dodatna konstruktorja bi recimo bila: CRacunalnik::CRacunalnik(int HitProc) { // parameter konstruktorja je hitrost procesorja HitrostProcesorja = HitProc. ker prevajalnik ne bo znal ločiti med njima (med prvo in tretjo metodo). } Paziti moramo. KolicinaPomnilnika = KolPom. da se metode med seboj razlikujejo po tipih parametrov. overloading). da ne bo niti vseboval kode. Za naš primer bo tako zelo preprost. na katere ţelimo vplivati. KolicinaPomnilnika = 512. da lahko uporabljamo ista imena za metode.h (v seznamu metod)! Prizgan = false. v katerih se pa razlikuje seznam parametrov imenujemo preobložene metode (ang. v kolikor bi pa imeli v razrednih spremenljivkah na primer kakšna dinamična polja in bi jih tekom uporabe objekta kreirali z new. TiskalnikPrikljucen = true. Na drugi strani se destruktor avtomatsko pokliče ob sproščanju prostora v pomnilniku . da pri kreiranju objekta vplivamo na določene vrednosti razrednih spremenljivk in spremenljivke in tiste. le tipi). TiskalnikPrikljucen = true. Destruktor nima parametrov in prav tako ne vrača nobene vrednosti. NET 227 Te vrednosti se torej določijo avtomatsko in nanje ne moremo vplivati. } CRacunalnik::CRacunalnik(int HitProc. v destruktorju poskrbimo (če nismo ţe morda prej). } CRacunalnik::CRacunalnik(int HitProc.C# . da ta dinamična polja odstranimo iz pomnilnika (stavke z delete prestavite torej v destruktor). Temu. ko metoda void ime_metode(int Parameter2) predstavlja teţavo. KolicinaPomnilnika = KolPom.

le da pred njim zapišemo znak ~ (tilda). da se metode med seboj razlikujejo po tipih parametrov. le tipi). } return(false). da ta dinamična polja odstranimo iz pomnilnika (stavke z delete prestavite torej v destruktor). PreberiPodatkeIzBIOSa in Programiranje 1 – VSŠ Informatika . ko metoda void ime_metode(int Parameter2) predstavlja teţavo. kakšno naj bo skrivanje elementov razreda oziroma kaj je javnega in kaj privatnega značaja. // sicer vrne false. ne pa popolnoma poljubno. NET 228 Prizgan = false. ResetirajMaticnoPlosco(). overloading).C# . da se lahko uporabljajo samo znotraj metod in na točno določenih mestih. v destruktorju poskrbimo (če nismo ţe morda prej). ga prizge VklopiNapajalnik().ob uničenju objekta.h (v seznamu metod)! 2. da lahko uporabljamo ista imena za metode.1. v kolikor bi pa imeli v razrednih spremenljivkah na primer kakšna dinamična polja in bi jih tekom uporabe objekta kreirali z new. Recimo da bi naš razred o računalniku dodatno poglobili v metodi. da bi metoda izgledala nekako takole: bool CRacunalnik::PrizgiRacunalnik() { if (Prizgan == false) // ce je ugasnjen. ki jih prejmejo. kjer priţgemo računalnik in sicer. Ime je enako razredu. v katerih se pa razlikuje seznam parametrov imenujemo preobložene metode (ang. TiskalnikPrikljucen = true. ker prevajalnik ne bo znal ločiti med njima (med prvo in tretjo metodo). } Paziti moramo. Metoda void ime_metode(int Parameter1) je drugačna metodi void ime_metode(double Parameter1) medtem. če bi zares priţgali računalnik. Prizgan = true. poklicali še štiri metode (VklopiNapajalnik. InicializirajVgrajeneKartice(). se odločamo še o temu. Na drugi strani se destruktor avtomatsko pokliče ob sproščanju prostora v pomnilniku . obakrat namreč gre za enak seznam parametrov (imena spremenljivk niso pomembna. Prizgan pa je ze true } V metodi bi torej. return(true). da ne bo niti vseboval kode. Temu. Za naš primer bo tako zelo preprost. CRacunalnik::~CRacunalnik() { } Vsi konstruktorji in destruktorji morajo biti našteti tudi v datoteki s končnico *. Nekatere spremenljivke ali metode namreč ţelimo. Destruktor nima parametrov in prav tako ne vrača nobene vrednosti. ResetirajMaticnoPlosco. PreberiPodatkeIzBIOSa(). Po definiciji konstruktor ne vrača vrednosti. Javnost/privatnost (enkapsulacija) Ko enkrat določimo kaj so razredne spremenljivke in kaj metode.

. v kateri je nekaj spremenljivk deklariranih kot privatnih.2. če je računalnik priţgan. // klic javne metode Konstruktor se avtomatsko pokliče pri deklaraciji objekta in destruktor avtomatsko. če je priključen tisk. ko se konča metoda v kateri je nek objekt lokalna spremenljivka ali pa ko se konča program. določimo da je privatnega značaja. // priţiganje računalnika void UgasniRacunalnik().. 2.. // destruktor }.. Programiranje 1 – VSŠ Informatika . // brisanje datoteke z diska CRacunalnik(). // osnovni konstruktor CRacunalnik(int HitPro). kar ne ţelimo. razred definira nov tip spremenljivke in ga na tak način tudi obravnavamo. Kot ţe rečeno. // še en dodatni konstruktor ~CRacunalnik(). Dopolnjena datoteka Racunalnik.) int SteviloUSBPrikljuckov. bi tako recimo bila: class CRacunalnik { public: // stanje int HitrostProcesorja. // število USB priključkov public: bool Prizgan. // true.h z besedama private: in public: in vse kar je napisano na desni (in zatem). pri čemer v praksi prevladuje uporaba dinamičnega.HitrostPomnilnika = . // natisni dokument na tiskalnik bool PrizgiRacunalnik(). // količina RAM pomnilnika v megabajtih private: int KapacitetaDiska. ki pa imajo popolnoma privaten značaj. // direktni dostop do javne spremenljivke MojRac1. ne pa tudi recimo.. ţelimo da se to zgodi samo v tem primeru. // zapiše datoteko na disk bool NatisniDokument(char* ImeDokumenta). Uporaba razredov in objektov Uporabljamo jih lahko statično ali dinamično. če je objekt globalna spremenljivka. // hitrost enote v faktorjih pisanja (52x. ker je KapacitetaDiska privatna! MojRac1. V C++ to (javnost in privatnost) določimo v datoteki *.. ima status ali privatnosti ali pa javnosti.. // true. // dodatni konstruktor CRacunalnik(int HitPro. sicer false bool PrikljucenTiskalnik. Z drugimi besedami: če bodo te metode ţe kdaj poklicane.h. // kapaciteta diska v megabajtih int HitrostCDEnote. Enako velja za spremenljivke. // to ne gre. // hitrost procesorja v megahercih int KolicinaPomnilnika. da bi nekdo poklical metodo za resetiranje matične plošče po tiskanju dokumenta. int KolPom).KapacitetaDiska = ..C# .. NET 229 InicializirajVgrajeneKartice). Za statično uporabo imamo torej naslednji "vzorec": CRacunalnik MojRac1. // deklaracija objekta z imenom MojRac1 MojRac1.PrizgiRacunalnik(). da bi nekdo uporabljal izven metod. sicer false // obnasanje void ZapisiDatoteko(char* ImeDatoteke).. // ugasni računalnik void BrisiDatoteko(char* ImeDatoteke).

ki ponazarja točko v treh dimenzijah. Metode za seštevanje imajo vedno isto ime (Sestej). da vsaka spremenljivka predstavlja svoj objekt.h: class CTocka { public: // spremenljivke float X.// direktni dostop do javne spremenljivke MojRac2->PrizgiRacunalnik(). V osnovnem konstruktorju pa smo jih postavili na vrednosti 0. vsebino datoteke *. // uničenje objekta in klic destruktorja Ker je z razredom definiran nov tip spremenljivke je treba v datoteki. ki kot parameter sprejme hitrost procesorja. kjer se uporablja tak razred. // inicializacija preko osnovnega konstrukt. predstavljen kot MojRac1. MojRac2->HitrostPomnilnika = . se pa razlikujejo v parametrih. podati kje se nahaja osnovna definicija razreda. da lahko metoda vrne nek objekt. Stanje računalnika.h. Primer: razred CTocka Definirajmo razred CTocka.cpp ter primer uporabe v glavnem programu. ki jih sprejmejo in v rezultatu. // osnovni konstruktor Programiranje 1 – VSŠ Informatika . Razred vsebuje spremenljivke X. ki ga vrnejo. kjer imamo naslednji "vzorec": CRacunalnik* MojRac2. Tocka. Iz primera je razvidno tudi. katerih ime je napisano pred ločilom (ali piko .Y. // koordinate točke // metode CTocka(). pokličemo pa metodo PrizgiRacunalnik pri spremenljivki MojRac1.h" Pomembno pri uporabi razredov je tudi. // klic javne metode delete MojRac2.Z. ali pa puščico ->). da ločimo. NET 230 Pri MojRac1 se uporabi osnovni konstruktor. V nadaljevanju podajamo vsebino datoteke *. Y in Z. v katerem lahko določimo vrednosti vsem koordinatam. če bi pisalo pa recimo MojRac1(1000) bi se pa avtomatsko uporabil dodatni konstruktor. Dodatno ima ta razred ob osnovnem konstruktorju tudi dodatni konstruktor.. // deklaracija objekta z imenom MojRac2 (tu se // še ne pokliče noben konstruktor!) MojRac2 = new CRacunalnik(). od katerega metoda se je poklicala.. predstavljenega kot MojRac2 ostane nedotaknjeno! Vsak klic metod in dostopanje do spremenljivk je torej izvedeno samo pri objektih.3. Če sta recimo oba računalnika ugasnjena. MojRac1 in MojRac2 posamezna objekta iz razreda CRacunalnik in vsak zase predstavljata samostojno enoto. Nekoliko več pisanja (je pa zato morda celo bolj berljivo programerjem) je pri uporabi dinamičnega pristopa. 2.C# .. Tako sta obe spremenljivki. Zato v glavi programa pri direktivah include zapišemo za naš primer: #include "Racunalnik. ki je enakega tipa kot objekt. ki določajo poloţaj in metodo za izpis podatkov točke (Izpis) ter nekaj metod za seštevanje poloţajev dveh točk (če bi recimo točka predstavljala krajevni vektor). bomo s tem priţgali samo računalnik.

Y += T->Y. void Sestej(CTocka* T).Z). void Sestej(float X1. void Izpis().float &Z2) { X2 = X+X1. } // pristevanje druge tocke. } // destruktor CTocka::~CTocka() {} // izpis podatkov tocke void CTocka::Izpis() { printf("(%f.float &X2. float &Z2).Y. } // pristevanje druge tocke (sprememba se pozna na razrednih spremenljivkah) void CTocka::Sestej(float X1. float Y1. // izpis podatkov točke void Sestej(float X1.float &Y2. float Y1.cpp: #include "Tocka. float Z1) { CTocka* Rezultat = new CTocka(). Y2 = Y+Y1. Y = 0.float Z1. float Z1). } // sestevanje z drugo tocko (sprememba je vrnjena v spremenljivkah X2. return(Rezultat). float Z1. Rezultat->Y = Y+Y1. Z = 0. Spremenljivke X.float Y1. Rezultat->Y ter Programiranje 1 – VSŠ Informatika . }. Y += Y1. Z += T->Z. } V zadnji metodi imamo opravka s tremi "kompleti" koordinat. podane kot objekt (sprememba se pozna v razrednih // spremenljivkah klicanega objekta. Y = Y1. Rezultat->Z = Z+Z1. Y1 in Z1 predstavljajo vrednosti.X. } // sestevanje druge tocke (ni spremembe razrednih spremenljivk. se pa rezultat // sestevanja vrne kot objekt! CTocka* CTocka::Sestej(float X1. Y in Z predstavljajo razredne spremenljivke. float Z1) { X = X1. podane kot parameter metode in spremenljivke Rezultat->X. Z = Z1. } // dodatni konstruktor CTocka::CTocka(float X1. float Y1.%f)\n". float &Y2.%f. spremenljivke X1. float Z1). Z2 = Z+Z1. NET 231 CTocka(float X1.C# .h" // osnovni konstruktor CTocka::CTocka() { X = 0. float Y1. float Z1) { X += X1. float Z1). Z += Z1. ne pa od T!) void CTocka::Sestej(CTocka* T) { X += T->X. float Y1. float Y1. CTocka* Sestej(float X1.float &X2. Rezultat->X = X+X1. float Y1. // dodatni konstruktor ~CTocka(). Tocka.Y2.Z2 // razredne spremenljivke pa se ne spremenijo void CTocka::Sestej(float X1.

6.h" void main() { CTocka* TockaA = new CTocka(). sicer pa je odvisen od podane vrednosti v dodatnem konstruktorju. se pa rezultat // sestevanja vrne kot objekt! CTocka* CTocka::Sestej(float X1. // najvišje nadstropje dvigala int SteviloOseb. TockaC = TockaA->Sestej(10. Dvigalo. // največja dovoljena teţa vseh oseb // metode CDvigalo().108.Z+Z1)).40) (6. V dvigalu ves čas beleţimo v katerem nadstropju je.10) (16.C# . ki je v osnovnem konstruktorju avtomatsko določen na vrednost 10. koliko oseb je v njemu in kakšna je masa teh oseb. } Rezultat tega je naslednji: (0.20. TockaA->Izpis().102.30). Več različnih metod bo definiranih za podobno obnašanje za ponazoritev različne implementacije obnašanja. } V predzadnji metodi smo kot parameter metode uporabili objekt. TockaA->Izpis().7). TockaA->Sestej(TockaB). izstop in za premik gor ali dol.100. float Y1.128.3). // skupna teţa oseb v dvigalu int MaxTezaOseb. Primer: razred CDvigalo Definirajmo razred.108. TockaA->Sestej(1. float Z1) { return(new CTocka(X+X1. To metodo bi lahko krajše zapisali tudi kot: // sestevanje druge tocke (ni spremembe razrednih spremenljivk. ki ga vrnemo kot rezultat metode preko stavka return. CTocka* TockaB = new CTocka(5.h: class CDvigalo { public: // spremenljivke int Nadstropje. NET 232 Rezultat->Z predstavljajo razredne spremenljivke od objekta Rezultat.7) (1.2.0.3) (6.4. // osnovni konstruktor Programiranje 1 – VSŠ Informatika . // trenutno nadstropje dvigala int MaxNadstropje. TockaC->Izpis(). ki ponazarja delovanje dvigala. Delovanje dvigala je prikazano z metodami za vstop oseb v dvigalo. CTocka* TockaC. TockaA->Y = 100. TockaB->Izpis().0) (5.6. TockaA->Izpis().0) (0.10) 2. TockaA->Izpis().Y+Y1. // trenutno število oseb v dvigalu int TezaOseb. oba tipa metod (predzadnja in zadnja) pa sta v objektnem programiranju zelo pogosta. Še primer uporabe v glavnem programu: #include "Tocka. TockaA->Izpis(). Dvigalo se lahko nahaja v nadstropjih od 0 (klet) do maksimalnega.

Nadstropje = Kam. // vstop več oseb v dvigalo bool IzstopOseb(int StOseb. int Teza). SteviloOseb = 0. ki posebej nastavi najvišje nadstropje CDvigalo::CDvigalo(int MaxNad) { Nadstropje = 0. } // dodatni konstruktor. } // dodatni konstruktor. NET 233 CDvigalo(int MaxNad). MaxNadstropje = MaxNad. int MaxTeza) { Nadstropje = 0. // dodatni konstruktor CDvigalo(int MaxNad. } // dviganje dvigala v niţja nadstropja (če ţelimo spustiti višje kot na // vrh ali pa če je ţeljeno nadstropje niţje od trenutnega (torej ne gre za // dviganje dvigala) javi false. SteviloOseb = 0.cpp: #include "Dvigalo. // vstop ene osebe v dvigalo bool IzstopOsebe(int Teza).C# . // je v dvigalu kaj oseb? bool VstopOsebe(int Teza). // destruktor bool SpustiDvigaloV(int Kam). TezaOseb = 0. MaxTezaOseb = MaxTeza. MaxNadstropje = 10. MaxNadstropje = MaxNad. return(true). } // destruktor (v tem primeru je prazen) CDvigalo::~CDvigalo() {} // spuščanje dvigala v niţja nadstropja (če ţelimo spustiti niţje kot v // klet ali pa če je ţeljeno nadstropje višje od trenutnega (torej ne gre za // spuščanje dvigala) javi false. } // vrne true. int MaxTeza). TezaOseb = 0. Dvigalo. ki posebej nastavi najvišje nadstropje in največjo // dovoljeno teţo CDvigalo::CDvigalo(int MaxNad. Nadstropje = Kam. // dviganje dvigala bool JeDvigaloVKleti(). sicer vrne false bool CDvigalo::JeDvigaloVKleti() { Programiranje 1 – VSŠ Informatika . // izstop ene osebe iz dvigala bool VstopOseb(int StOseb. // izpis aktualnih podatkov dvigala }. SteviloOseb = 0. // je dvigalo trenutno v kleti? bool JeDvigaloNaVrhu(). int Teza). // spuščanje dvigala bool DvigniDigaloV(int Kam).// dodatni konstruktor ~CDvigalo(). MaxTezaOseb = 800.h" // osnovni konstruktor CDvigalo::CDvigalo() { Nadstropje = 0. // izstop več oseb iz dvigala void IzpisStanjaDvigala(). MaxTezaOseb = 800. return(true). sicer javi true in temu primerno aţurira // trenutno nadstropje dvigala bool CDvigalo::DvigniDvigaloV(int Kam) { if (Kam <= Nadstropje || Kam > MaxNadstropje) return(false). sicer javi true in temu primerno aţurira // trenutno nadstropje dvigala bool CDvigalo::SpustiDvigaloV(int Kam) { if (Kam >= Nadstropje || Kam < 0) return(false). // je dvigalo trenutno na vrhu? bool JeVDvigaluKajOseb(). če je dvigalo v kleti. TezaOseb = 0.

sicer // vrne false bool CDvigalo::JeDvigaloNaVrhu() { if (Nadstropje == MaxNadstropje) return(true). } // izpis aktualnih podatkov od dvigala (trenutno nadstropje. SteviloOseb++. sicer true) bool CDvigalo::IzstopOseb(int StOseb. } // izstop več oseb iz dvigala z določeno teţo (če v dvigalu ni toliko teţe // ali pa če je nepozitivna vrednost teţe metoda javi false. če je dvigalu na vrhu (na najvišjem moţnem nadstropju).C# . NET 234 if (Nadstropje == 0) return(true). } // izstop ene osebe iz dvigala z določeno teţo (če v dvigalu ni toliko teţe // ali pa če je nepozitivna vrednost teţe metoda javi false. TezaOseb -= Teza.Nadstropje). return(true). } // vrne true. če je v dvigalu kaj oseb (metoda bi bila ekvivalentna. sicer true) bool CDvigalo::IzstopOsebe(int Teza) { if (TezaOseb > Teza || Teza < 0) return(false). int Teza) { if (TezaOseb+Teza > MaxTeza || Teza < 0) return(false). število oseb v // dvigalu in njihova skupna teţa) void CDvigalo::IzpisStanjaDvigala() { printf("trenutno v nadstropju : %d\n". return(false).5. TezaOseb += Teza. } 2. SteviloOseb--. SteviloOseb -= StOseb. } // vrne true. če bi // gledali ali je v dvigalu skupna teţa oseb večja kot 0) bool CDvigalo::JeVDvigaluKajOseb() { if (SteviloOseb > 0) return(true). SteviloOseb += StOseb. TezaOseb -= Teza. TezaOseb += Teza. printf("v njem stevilo oseb : %d s skupno tezo : %d\n". return(false). return(true). } // vstop več oseb v dvigalo z določeno teţo (če teţa presega največjo // dovoljeno skupno teţo ali pa če je nepozitivna vrednost teţe metoda javi // false.TezaOseb). Dedovanje Programiranje 1 – VSŠ Informatika .SteviloOseb. return(false). int Teza) { if (TezaOseb > Teza || Teza < 0) return(false). sicer true) bool VstopOseb(int StOseb. return(true). return(true). } // vstop ene osebe v dvigalo z določeno teţo (če teţa presega največjo // dovoljeno skupno teţo ali pa če je nepozitivna vrednost teţe metoda javi // false. sicer true) bool VstopOsebe(int Teza) { if (TezaOseb+Teza > MaxTeza || Teza < 0) return(false).

pri čemer moramo biti zelo pazljivi. class CKrog : CLik { // nadrazredi so našteti za podpičjem! double Radius. // premik središča lika CLik(). imamo nek razred A. razlika je le dodatna spremenljivka. da smo razred B izpeljali iz razreda A oziroma. kaj javno in kaj kot prijateljsko (ang. ker sicer pride do zmede. }. Namesto. Pri dedovanju je še posebej pomembno. Splošne lastnosti objektnega programiranja ("na Programiranje 1 – VSŠ Informatika . da nadrazredi ne vsebujejo istoimenskih spremenljivk in metod. zapišemo. predstavljen z določeno mnoţico spremenljivk in metod. Imamo pa tudi razred CKrog. // koordinati središča void Premakni(int ZaX. Vsi nadrazredi (ker lahko razred naenkrat deduje lastnosti večih razredov) so našteti za dvopičjem. je pa to eden od pomembnejših principov objektnega programiranja!). inheritance). }. friendly). da imamo splošen razred CLik. ~CKrog(). int ZaY). da bi spet pisali (kopirali ali pa pretipkali) isto kodo in le dodali eno vrstico zaradi te dodatne spremenljivke. ki se med seboj le malo razlikujejo (dopolnjujejo v kodi ali pa drugače implementirajo del kode) in jih je smiselno zaradi urejenosti in pregleda ustrezno hierarhično urediti. Pravimo. ki ima prav tako središče kroga in še polmer in metodo za izračun površine. Na primer. Recimo. vendar to presega okvire vaj in tega teksta. podatke in operacije od drugih razredov. ki določata središče lika in metodo Premakni za premik lika za podane koordinate.Y. // površina kroga CKrog(). ki je v skoraj vsem enak.6. ki vsebuje spremenljivki X in Y. 2. zatem pa ţelimo napisati nov razred B. da je razred CKrog podedoval lastnosti od razreda CLik ima pa še svojo spremenljivko Radius: class CLik { double X. da je razred A nadrazred razredu B. ~CLik(). lahko preprosteje določimo. da ima razred B vse lastnosti in metode enake kot razred A. kaj je v nadrazredu določeno kot privatno. Običajno se uporabljajo postopki dedovanja (ang. le da ima še eno dodatno spremenljivko. // radius kroga double IzracunajPovrsino(). Da ne ponavljamo kode. kjer izpeljani razredi (in temu primerno potem tudi objekti) podedujejo nekatere lastnosti. V implementacijah se nam lahko pojavi mnoţica razredov. NET 235 Na hitro še nekaj besed o dedovanju (na samih vajah to ne boste potrebovali.C# .

NET 236 hitro") Lastnosti objektno usmerjenih programskih jezikov/okolij bi lahko na hitro strnili v1: .enkapsulacija : programski jezik omogoča kontrolo nad tem. 4. avtor). da operatorje priredimo tudi za delo z novimi tipi. .nastanek/uničenje objektov : objekti pri svojem nastanku zavzamejo prostor v pomnilniku in ga ob koncu sprostijo. Zapišite deklaracije in definicije metod obeh razredov. Razred CPesem naj vsebuje tipične podatke neke pesmi (naslov pesmi. Pri tem mora programski jezik za vsak nov objekt dovoliti dve proceduri: konstruktor ob nastanku in destruktor ob uničenju. . CAlbum in CPesem Napišite razreda CAlbum in CPesem.dedovanje : lastnosti enega ali več razredov se prenesejo na nov razred in dopolnijo z novimi lastnostmi. da vgrajenim podatkovnim tipom ob definiciji priredimo začetno vrednost. Vrednosti teh spremenljivk naj bo moţno spremeniti in (ločeno!) povprašati po njihovih vrednostih z javnimi metodami (torej 4 metode!). 4. char* Avtor. Razred CAlbum naj vsebuje v privatnih spremenljivkah podatke o zaloţbi albuma.polimorfizem (mnogoličnost) osnovnih operatorjev : isti operator ali funkcija dela različne stvari glede na različne parametre. Objektno programiranje se dolgoročno gledano bogato obrestuje. večinoma bolj učinkovito in bolj zanesljivo. char* DajAvtorja(). ker je programiranje s knjiţnicami razredov cenejše. CPesem::CPesem() {} CPesem::~CPesem() {} Programiranje 1 – VSŠ Informatika . kako bi "pripravili" album dvajsetih različnih avtorjev (vsak eno pesem) iz koncertov na ŠTUKu in kako bi ugotovili avtorja tretje pesmi na tem albumu. Velikost polja pesmi naj se določi v konstruktorju razreda CAlbum in takrat naj se v pomnilniku tudi rezervira prostor za polje pesmi. Obstajati mora mehanizem. }. Enako mora veljati tudi za nove podatkovne tipe. ~CPesem(). CPesem(). v delu programa (ne pišite vsega!) pa nakaţite. Primeri iz izpitov Zaenkrat so v nadaljevanju samo teksti iz izpitnih nalog. kdo pozna detajle nekega razreda in kdo ga lahko uporablja samo prek za to določenih podprogramov. . char* DajNaslov().C# . rešitve še sledijo. Vse vdelane tipe smemo prirejati med seboj. 1 delno povzeto iz Objektno programiranje v C++. void NastaviAvtorja(char* Avt). ki naj bodo shranjene v privatnih spremenljivkah. Stanko Dolenšek. število pesmi in polje s podatki o pesmih (polje objektov razreda CPesem). class CPesem { private: char* Naslov. public: void NastaviNaslov(char* Nas). .inicializacija/prirejanje : C++ dovoljuje.1.

double* Cene. } void CPesem::NastaviAvtorja(char* Avt) { Avtor = Avt. int). char* Avtor). kjer izpišete vse zadeve. int SteviloStvari. CPesem* Pesmi. Razred naj vsebuje metodo DodajNaRacun(char*.cpp) in kratek primer uporabe. ceno in tipom stopnje davka: 1 za recimo 10%. public: void DodajNaRacun(char* Kaj. } char* CPesem::DajAvtorja() { return(Avtor). npr. kjer boste neko zadevo odstranili iz računa. } } CPesem CAlbum::DajPesem(int ZapSt) { if (ZapSt>0 && ZapSt <= SteviloPesmi) return(Pesmi[ZapSt]). Prav tako naj obstaja metoda OdstraniIzRacuna(char*).C# . int Davek).2. s katerimi spremenljivkami boste realizirali seznam zadev "na računu" (naj jih bo recimo največ 30). 2 recimo za 20%). } CAlbum::~CAlbum() { delete[] Pesmi. char* Avtor) { if (ZapSt>0 && ZapSt <= SteviloPesmi) { Pesmi[ZapSt]. void IzpisRacuna(). kjer boste uporabili te metode. Pesmi[ZapSt].Avtor = Avtor. Sami razmislite o tem. kjer boste "na račun" dodali novo zadevo (z nekim imenom. CRacun Napišite razred CRacun. Programiranje 1 – VSŠ Informatika . } class CAlbum { private: char* Zalozba. public: void NastaviPesem(int ZapSt. } char* CPesem::DajNaslov() { return(Naslov). ki so se nabrale "na računu". int* Davki.Naslov = Naslov. double. SteviloPesmi = StPesmi. double Cena. ki predstavlja račun v nekem nakupu.} void CAlbum::NastaviPesem(int ZapSt.h). ~CAlbum(). njihovo skupno ceno in posebej. else return(false). CAlbum(int StPesmi). NET 237 void CPesem::NastaviNaslov(char* Nas) { Naslov = Nas. char* Naslov. za primerjavo nizov pa lahko uporabite kar vgrajeno funkcijo strcmp! Napišite deklaracijo razreda (*. char* Naslov. void OdstraniIzRacuna(char* Kaj). izvedbo metod (*. koliko zadev (število in njihova skupna cena) je bilo za stopnjo davka 1 in koliko za stopnjo davka 2. } 4. CAlbum::CAlbum(int StPesmi) { Pesmi = new CPesem[StPesmi]. CPesem DajPesem(int ZapSt). Dodatna naj bo še metoda IzpisRacuna(). int SteviloPesmi. trgovini. }. class CRacun { private: char** Stvari.

i++) Stvari[i] = new char*[100].i<30.i++) { SkupnaCena += Cene[i]. printf("izdelkov dav. double SkupnaCenaDavek1 = 0. Stvari[SteviloStvari] = Kaj. Cene[j] = Cene[j+1]. } } printf("Stanje racuna:\n").0. SkupnaCenaDavek1 += Cene[i]. da je ime izdelka najvec 100 znakov SteviloStvari = 0. int Davek) { if (SteviloStvari == 30) // je sploh se mozno dati kaj na racun? return. printf("skupna cena izdelkov : %f\n". CTekma Napišite razred CTekma. // recimo.SteviloStvari).i++) delete[] Stvari[i].SkupnaCena).j<SteviloStvari-1. } CRacun::~CRacun() { for (int i=0.i<30. double SkupnaCenaDavek2 = 0. SkupnaCenaDavek2).i++) { if (strcmp(Stvari[i]. double Cena.3. printf("stevilo izdelkov : %d\n". } void CRacun::DodajNaRacun(char* Kaj. ki predstavlja neko poljubno tekmo. CRacun::CRacun() { Stvari = new char*[30]. SteviloStvari++.Kaj) == 0) { // izdelek s tem imenom najden! for (int j=i.0. stopnje 1 : %d v skupni ceni : %f\n".KolikoDavek1. SkupnaCenaDavek1). printf("izdelkov dav. } // if } // for i } void CRacun::IpisRacuna() { double SkupnaCena = 0.} for (int i=0. NET 238 CRacun(). } else KolikoDavek2++. recimo nogometno. Davki[SteviloStvari] = Davek. Davki[j] = Davki[j+1].j++) { Stvari[j] = Stvari[j+1]. } void CRacun::OdstraniIzRacuna(char* Kaj) { for (int i=0. }.i<SteviloStvari. ~CRacun(). } SteviloStvari--. int KolikoDavek1 = 0. Cene[SteviloStvari] = Cena. SkupnaCenaDavek2 += Cene[i].0.C# . stopnje 2 : %d v skupni ceni : %f\n". ker je Programiranje 1 – VSŠ Informatika . } 4. delete Stvari.i<SteviloStvari. if (Davki[i] == 1) { KolikoDavek1++. int KolikoDavek2 = 0. for (int i=0.KolikoDavek2.

char* Mostvo2). PrekrsekRd2. void RumeniKarton(char* Mostvo). void IzpisRezultata().h>)! Napišite deklaracijo razreda (*. int Gol1. char* Mostvo2) { Gol1 = 0.ImeMostva1) == 0) Gol1--. izvedbo metod (*. int PrekrsekRd1. RumeniKarton(ime_moštva). rumeni kartoni. razveljavi gol. V teh metodah se moštvu. ImeMostva1 = Mostvo1. zadnji dve metodi pa sta namenjeni izpisu rezultata (koliko golov je na kateri strani) in statistiki tekme (rezultat. katerega ime je podano kot parameter: doda gol.cpp) in kratek primer uporabe.h). zabeleţi napravljen prekršek. Prekrsek2 = 0. zabeleţi dobljen rumeni in rdeči karton.ImeMostva1) == 0) PrekrsekRu1++. CTekma(char* Mostvo1. } CTekma::~CTekma() {} void CTekma::DalGol(char* Mostvo) { if (strcmp(Mostvo. Gol2. PrekrsekRu1 = 0. else PrekrsekRu2++. kjer boste uporabili te metode. PrekrsekRu2. Prekrsek2.ImeMostva1) == 0) Gol1++. RazveljaviGol(ime_moštva). Tekma se odvija med dvema moštvoma (vsako moštvo ima svoje ime). else Gol2--. dogajanje na tekmi pa se beleţi z naslednjimi metodami: DalGol(ime_moštva). rdeči kartoni in prekrški). void RazveljaviGol(char* Mostvo). ~CTekma(). Prekršek(ime_moštva) in IzpisRezultata() ter IzpisStatistike(ime moštva). PrekrsekRd1 = 0. void RdeciKarton(char* Mostvo). NET 239 to trenutno najbolj aktualno. void Prekrsek(char* Mostvo). class CTekma { public: char* ImeMostva1. Sami razmislite o tem. Za primerjavo nizov lahko uporabite kar vgrajeno funkcijo strmcp (<string. PrekrsekRd2 = 0.C# . RdeciKarton(ime_moštva). void DalGol(char* Mostvo). } void CTekma::RdeciKarton(char* Mostvo) { Programiranje 1 – VSŠ Informatika . char* ImeMostva2. Imena moštev se določita s parametroma v konstruktorju razreda. int Prekrsek1. } void CTekma::RumeniKarton(char* Mostvo) { if (strcmp(Mostvo. } void CTekma::RazveljaviGol(char* Mostvo) { if (strcmp(Mostvo. Gol2 = 0. int PrekrsekRu1. PrekrsekRu2 = 0. s katerimi spremenljivkami boste realizirali statistiko (in rezultat tekme). ImeMostva2 = Mostvo2. }. else Gol2++. CTekma::CTekma(char* Mostvo1. Prekrsek1 = 0.

ImeMostva2). else Prekrsek2++.ImeMostva1. } Programiranje 1 – VSŠ Informatika . printf("rezultat : %d:%d\n".Prekrsek2).Prekrsek1.PrekrsekRd1.Gol2). printf("rdeci kartoni : %d:%d\n".PrekrsekRd2). } void CTekma::IzpisRezultata() { printf("Stanje na tekmi med %s in %s:\n". NET 240 if (strcmp(Mostvo. printf("prekrski : %d:%d\n".ImeMostva1) == 0) PrekrsekRd1++.Gol1. } void CTekma::Prekrsek(char* Mostvo) { if (strcmp(Mostvo.PrekrsekRu1.PrekrsekRu2). else PrekrsekRd2++.C# .ImeMostva1) == 0) Prekrsek1++. printf("rumeni kartoni : %d:%d\n".

Sign up to vote on this title
UsefulNot useful