C# Objektno

  • Upload
    bozapub

  • View
    253

  • Download
    2

Embed Size (px)

Citation preview

  • 7/23/2019 C# Objektno

    1/240

    Programski jezik

    C#

    Osnoveobjektnega

    programiranja

    Gregor Jere, Matija Lokar in Sreo Urani

    V 0.9

    marec 2009

  • 7/23/2019 C# Objektno

    2/240

    C# . NET

    Programiranje 1 VS Informatika

    2

  • 7/23/2019 C# Objektno

    3/240

    C# . NET

    Programiranje 1 VS Informatika

    3

  • 7/23/2019 C# Objektno

    4/240

    C# . NET

    Programiranje 1 VS Informatika

    4

    Predgovor

    Omenjeno gradivo pokriva osnove objektnega programiranja v C# .

    Gradivo vsekakor ni dokonano in predstavlja delovno razliico. V njem so zagotovo napake (upava, da

    immanj), za katere se vnaprej opraviujeva. Da bo laje spremljati spremembe, obstaja razdelek Zgodovina

    sprememb, kamor bova vpisovala spremembe med eno in drugo razliico. Tako bo nekomu, ki si je prenesel

    starejo razliico, laje ugotoviti, kaj je bilo v novi razliici spremenjeno.

    Gregor Jere, Matija Lokar in Sreo Urani

    Kranj, november 2008

  • 7/23/2019 C# Objektno

    5/240

    C# . NET

    Programiranje 1 VS Informatika

    5

    Zgodovina sprememb

    14. 11. 2008: Razliica V0.8 le prenos (e neurejeno) Matijevega, Gregorjevega (str. 1120) in Saovegagradiva. Premisliti je e potrebno kaj in kako.5. 3. 2009: Razliica V0.9 e vedno povsem neurejeno. Dodano nekaj gradiva, ki ga je smiselno vkomponirati.Gradivo dodano na konec in sicer:

    Vsebina prosojnic, ki naj bi bile spredavane letos Zgled za Avto Gradivo, ki pokriva uvod v OOP iz C++. Tam je nekaj smiselnih zgledov, ki pa jih je potrebno prepisati v

    C#.

  • 7/23/2019 C# Objektno

    6/240

    C# . NET

    Programiranje 1 VS Informatika

    6

    KAZALO

    Objektno programiranje ...................................................................................................................................... 9

    Motivacija ....................................................................................................................................................... 9Objektno usmerjeno programiranje kaj je to .............................................................. ................................ 10Objekti........................................................................................................................................................... 11Objekti........................................................................................................................................................... 13Programiranje v C# ....................................................................................................................................... 14Objekti........................................................................................................................................................... 14Klasino/objektno programiranje ............................................................. ..................................................... 14Od kje razredi? .............................................................................................................................................. 15Objekt in ime spremenljivke ......................................................................................................................... 15Ustvarjanje objektov ..................................................................................................................................... 15C# in objekti .................................................................................................................................................. 15Ustvarjanje objektov ..................................................................................................................................... 16Zgled ............................................................................................................................................................. 16Objektno programiranje ................................................................................................................................ 18

    Objekti, razredi, ... ............................................................................................................................................ 19Zdruevanje podatkov ........................................................ ................................................................. .......... 19Uporaba razreda Zajec .................................................................................................................................. 21Dostop do podatkov v objektu ...................................................................................................................... 22e en primer - Ulomek .................................................................................................................................. 25Povzetek ........................................................................................................................................................ 26Konstruktorji ................................................................................................................................................. 26this ................................................................................................................................................................. 27

    Uporaba razreda: ........................................................................................................................................... 28Privzeti konstruktor ....................................................................................................................................... 28Ve konstruktorjev ........................................................................................................................................ 29Preobteene metode ...................................................................................................................................... 29Konstruktorji razreda Zajec navzkrino sklicevanje .................................................................................. 30e malo o this .......................................................... ................................................................. ..................... 30Zgled ............................................................................................................................................................. 31Objektne metode ........................................................................................................................................... 34

    Zgledi .......................................................................................................... ...................................................... 37Datum ........................................................... ................................................................. ................................ 37Fibonaccijevo zaporedje................................................................................................................................ 38

    Vaje ................................................................................................................................................................... 40

    Kochova rta ................................................................................................................................................. 40Razred Toka in Kochova rta ...................................................................................................................... 40Ulomek ......................................................... ................................................................. ................................ 40Razred Majica ............................................................................................................................................... 40Razred Zajec ................................................................................................................................................. 41Razred Kolega ......................................................... ................................................................. ..................... 41Uporaba razreda Kolega ..................................................... ................................................................. .......... 41Uporaba razreda Zajec .................................................................................................................................. 42Datum ........................................................... ................................................................. ................................ 42Zajci z datumom............................................................................................................................................ 42Uporaba razreda Zajec z datumom ........................................................... ..................................................... 42

    Nadgradimo datum ............................................................. ................................................................. .......... 42

    Dostop do stanj objekta .......................................................... ................................................................. .......... 42Dostopi do stanj ............................................................................................................................................ 43Zgledi ............................................................................................................................................................ 48

  • 7/23/2019 C# Objektno

    7/240

    C# . NET

    Programiranje 1 VS Informatika

    7

    Dostop do stanj/lastnosti ............................................................................................................................... 48Nastavitve podatkov (stanj) ........................................................... ................................................................ 49Dostop do stanj.............................................................................................................................................. 51Ostale metode .......................................................... ................................................................. ..................... 52Metoda ToString ........................................................................................................................................... 52Celotni razred Zajec ...................................................................................................................................... 54

    Gradnja razredov - zgled .................................................................................................................................. 58Ustvarjanje objektov ..................................................................................................................................... 58Problem Banke Butale .................................................................................................................................. 58Okostje razreda ............................................................................................................................................. 59Razred Kovanec ............................................................................................................................................ 59Uporaba razreda Kovanec ............................................................. ................................................................ 61Zgled - razred Kvader ................................................................................................................................... 62Ustvarjanje razredov in objektov: povzetek ....................................................... ........................................... 66

    Zgledi .......................................................................................................... ...................................................... 67

    Vaje ................................................................................................................................................................... 72

    Razred Kolega ......................................................... ................................................................. ..................... 74Datum ........................................................... ................................................................. ................................ 76Oseba............................................................................................................................................................. 76Majica ........................................................................................................................................................... 77Kandidat za direktorja banke ........................................................................................................................ 77Denarnica ...................................................................................................................................................... 79Podatkovni nosilec ........................................................................................................................................ 80

    Razred Zajec................................................................................................................................................. 80

    Statino in objektno ..................................................... ................................................................. ..................... 87Statine komponente ..................................................................................................................................... 87Statine spremenljivke .................................................................................................................................. 87Uporaba statinih spremenljivk ................................................................ ..................................................... 88

    Statine komponente dostop ...................................................................................................................... 88Statine komponente naslavljanje ......................................................... ..................................................... 88Zajec ................................................................ .............................................................. ................................ 88Statine metode ............................................................................................................................................. 95Statine metode ............................................................................................................................................. 96Privatne metode............................................................................................................................................. 97

    Dedovanje ........................................................ ................................................................. ................................ 97Pogosto uporabljani postopki I ................................................................ ...................................................... 97Dedovanje ..................................................................................................................................................... 98Razred BoljsiUlomek .................................................................................................................................... 98Uporaba Boljega ulomka ............................................................................................................................. 98Pogosto uporabljani postopki ........................................................................................................................ 99Dedovanje ..................................................................................................................................................... 99

    Dedovanje ................................................................................................................................................... 100Iz muhe slon ................................................................................................................................................ 106Osnova: razred ZajecNov .............................................................. .............................................................. 106Prekrite metode ........................................................................................................................................... 106"Umazane" podrobnosti .............................................................................................................................. 106Uporaba ....................................................................................................................................................... 106

    Zgledi .......................................................................................................... .................................................... 107

    Vaje ................................................................................................................................................................. 107Zival ............................................................................................................................................................ 107Razred Pes ............................................................... ................................................................. ................... 109Razred Dalmatinec ...................................................................................................................................... 109

    Naloge brez raunalnika ..................................................... ................................................................. ........ 110Razred Pes II ............................................................................................................................................... 111Zajec iz ivali .............................................................................................................................................. 113

  • 7/23/2019 C# Objektno

    8/240

    C# . NET

    Programiranje 1 VS Informatika

    8

    Embi d.o.o ................................................................................................................................................... 113Vaje "pe" ................................................................................................................................................... 114Halo Kitajc .................................................................................................................................................. 118Trojiko ....................................................................................................................................................... 119Redki vektorji .......................................................... ................................................................. ................... 119Plavalec ....................................................................................................................................................... 120Plavalec II ................................................................................................................................................... 121

    Razredi in objekti (osnove) ...................................................... ................................................................. ........ 121

    Razred - class .............................................................. ................................................................. ................... 122Enkapsulacija .............................................................................................................................................. 122Konstruktor ................................................................................................................................................. 127Preobloeni (overloaded) konstruktorji ............................................................... ........................................ 129Kopirni (copy) konstruktorji ....................................................................................................................... 130Statini (static) konstruktorji ......................................................... .............................................................. 130Polja tipa readonly ...................................................................................................................................... 131Destruktorji ................................................................................................................................................. 131

    Lastnost (Property) ............................................................. ................................................................. ........ 134Statine metode ........................................................................................................................................... 137Statina polja ........................................................... ................................................................. ................... 137

    Dedovanje (Inheritance) izpeljani razredi .......................................................... ......................................... 139Kaj je to dedovanje ..................................................................................................................................... 139Bazini razredi in izpeljani razredi.............................................................................................................. 139Klic konstruktorja bazinega razreda ................................................................. ......................................... 140Doloanje oz. prirejanje razredov ............................................................................................................... 140

    Nove metode ........................................................... ................................................................. ................... 141Virtualne metode ..................................................... ................................................................. ................... 143Prekrivne (Override) metode ........................................................ .............................................................. 143

    Polimorfizem - mnogolinost ............................................................................................ .............................. 146

    Uporaba oznaevalca protected ..................................................................................................................... 148

    Prosojnice M. Lokar 2009 ................................................................................................................................ 149

    Razred Avto ....................................................................................................................................................... 149

    Testiranje razreda ........................................................................................................................................... 221

    OOP v C++ (avtor dr. M. Krana)................................................................................................................... 221

  • 7/23/2019 C# Objektno

    9/240

    C# . NET

    Programiranje 1 VS Informatika

    9

    Objektno programiranjeMotivacija

    Pri programiranju se je izkazalo, daje zelo koristno, e podatke in postopke nad njimi zdruujemo v celote, ki jihimenujemo objekte. Programiranje je potem sestavljeno iz tega, da objekte ustvarimo in jim naroamo, daizvedejo doloene postopke. Veina sodobnih programskih jezikov je objektno ali kot tudi reemo predmetnousmerjenih. Pri uporabi tovrstnih jezikov hitro naletimo naletimo na pojme kot so zdruevanje (enkapsulacija),velinost (polimorfizem), dedovanje (inheritenca), ki so vsaj na prvi pogled zelo zapleteni, Nas ne bodozanimali, kot tudi ne tevilne druge podrobnosti. Objektno usmerjeno programiranje nam omogoa, da naproblem gledamo kot na mnoico objektov, ki med seboj sodelujejo in vplivajo drug na drugega. Na ta nainlaje piemo sodobne programe, kjer se nenehno odvija veliko tevilo dogodkov kot so premikanje mike,zapiranje oken, klikanje na gumbe, potrditev doloenih izbir, ki se med sabo prepletajo, vplivajo drug na

    drugega in kar bi le s teavo sprogramirali na klasien nain z nizanjem zaporedja stavkov in ukaz ov.tevilni jeziki (JavaScript, Visual Basic for Applications, Java, C#, Python, ) nudijo okolja v katerih so edoloeni objekti, nad katerimi lahko izvajamo doloene metode, funkcije. Tako "iz ni" dobimo grafini objekt g,na katerim potem z doloenometodo nariemokrog. Ko program zaenemo, ta samodejno ustvari okno zdoloenim imenomin gumbom za zapiranje Veina jezikov omogoa, da program zlahka dopolnimo z gumbi, potrditvenimi stikali in podobnimi elementi.Vse to so objekti, ki imajo lastnosti in metode, s katerimi na te objekte vplivamo.

    Na primer v jeziku JavaScript. Zanima nas le oznaeni delvar i = 0;function animacija() {

    i = i + 1;if (i == 6) i = 1;

    document.menjajocaSlika.src = "album" + i + ".jpg";

    setTimeout("animacija()", 1000)}

    JavaScript spletno stran, na kateri se nahaja, imenuje kot objekt z imenom document. Na tem objektu imamo

    tudi druge objekte, v naem konkretnem primeru sliko (vstavljeno v jeziku HTML zznako IMG), poimenovanokot menjajocaSlika:

    S pomojo stavkov v jeziku JavaScript vplivamo na ta objekt (document.menjajocaSlika) tako, da muspremenimo lastnost src, kjer je zapisana datoteka, ki naj jo ta objekt prikazuje

    document.menjajocaSlika.src = "album" + i + ".jpg";

    Podobno z metodo writelnvstavimo v samo dototeko ustrezno kodo v jeziku html. e v kodi spletne stranipie

    document.writeln("

    To naj se pojavi na spletni strani!

    ");

    pomeni, da naj se objekt document(kar pomeni kar ta spletna stran) spremeni tako, da vsebuje tekst, zapisan

    med narekovaji. Dejansko je torej uinek isti, kot e bi na spletni strani napisali kar

    To naj se pojavi na spletni strani!

    Seveda pa smo se doslej nauili e dovolj, da vemo, kakne vse monosti s tem imamo verjetno bomoJavaScript uporabili, da bomo napisali na spletno stran kaj bolj zapletenega, na primer besedilo, ki ga bomo prej

    s pomojoustreznega postopka obdelali. Tako smo na primer pri esti nalogi hitrega testa v uvodu uporabilimonost pisanja na spletno stran zato, da smo na enostaven nain poenotili vse naslove na spletni strani.

  • 7/23/2019 C# Objektno

    10/240

    C# . NET

    Programiranje 1 VS Informatika

    10

    Ko torej piemo programe, imamo s samim izvajalnim okoljem ponavadi na voljo bogato zbirko razlinihobjektov (natanneje nartov za to, kakni so objekti doloene vrste).Ni nam potrebno pisati na stotine vrstickode le za to, da bi dosegli, da na program uporabniku omogoa vnos datuma preko posebnega okna z eizpisanim koledarjem. Vedeti je potrebno le, da imamo v izvajalnem okolju e na voljo (nart za) tovrstni objekt.

    Ostane nam le e, da tak objekt ustvarimo in s pripravljenimi metodami nanj vplivamo.Tako s spodnjim zgledom v programskem jeziku Java ustvarimo okno z vnosno povrino, po kateri lahkopiemo.

    e ne bi imeli na voljo e ustreznih objektov, bi na program sestavljalo na desetine ali celo stotine ustreznihukazov. Tako pa le uporabimo dana narta za objekta JFramein JTextArea, z ukazom newustvarimo objektaustrezne vrste in z metodami, kot so setSize, showin drugimi vplivamo nanju.

    import javax.swing.*;import java.awt.*;

    public class JFrameTest {public static void main(String[] args) {

    JFrame okno = new JFrame("Moje okno");okno.setSize(250, 250);okno.setLocation(300,200);okno.getContentPane().add(BorderLayout.CENTER,

    new JTextArea(10, 40));

    okno.show();}

    }

    In seveda imamo na voljo take objekte tudi v standardnih knjinicah jezika C#.

    Objektno usmerjeno programiranje nam omogoa, da na problem gledamo kot na mnoico objektov, ki medseboj sodelujejo in vplivajo drug na drugega. Za nas je pomembno to, da veina sodobnih jezikov prinaa vsvojem izvajalnem okolje celo vrsto e pripravljenih objektov in metod za delo z njimi. Ti objekti so na primerspletna stran, slika na spletni strani, izbire v menuju programov v okolju Microsoft Office, grafino okno,tiskalnik, . S pripravljenimi metodami potem vplivamona te objektena primer zamenjamo sliko na spletnistrani, spremenimo privzeto delovanje ukaza Print v izbiri File, na grafino povrino nariemo krog,

    Objektno usmerjeno programiranje kaj je toPri objektno (ali kot tudi reemo predmetno) usmerjenem programiranju se ukvarjamo z objekti seveda.Objekt je nekakna rna katla, ki dobiva in poilja sporoila. V tej rni katli (objektu) se skriva tako koda (torejzaporedje programskih stavkov), kot tudi podatki (informacije nad katerimi se izvaja koda). Pri klasinemprogramiranju imamo kodo in podatke loene. Tudi mi smo do sedaj programirali ve ali manj na klasien nain.Pisali smo metode, ki smo jim podatke posredovali preko parametrov. Parametri in metode niso bile prav nitesno povezane. e smo npr. napisali metodo, ki je na primer poiskala najveji element v tabeli tevil, tabela inmetoda nista bili zdrueni tabela ni ni vedela o tem, da naj bi kdo npr. po njej iskal najveja tevila.V objektno usmerjenem (vasih boste sreali tudi kratico OO ali O-O, kar izvira iz object oriented)programiranju pa sta koda in podatki zdueni v nedeljivo celoto objekt. To prinaa doloene prednosti. Kouporabljamo objekte nam nikoli ni potrebno pogledati v sam objekt. To je dejansko prvo pravilo OO

    programiranjauporabniku ni nikoli potrebno vedeti, kaj se dogaja znotraj objekta.

  • 7/23/2019 C# Objektno

    11/240

    C# . NET

    Programiranje 1 VS Informatika

    11

    Objekt

    Zakaj ni potrebno vedeti tega? Vsi objekti med samo komunicirajo preko sporoil. Za vsak objekt se tono ve,kakna sporoila lahko sprejme in kakna lahko polje. Vse, kar objekt zna narediti, je doloeno z vmesnikomobjekta.

    Se vam zdi to zapleteno? No, pa povejmo malo bolj "po domae". Gre dejansko zato, da nad objektom izvajamorazline metode. In za vsak objekt se tono ve, katere metode zanj obstajajo in kakne rezultate vraajo.Recimo, da imamo doloen objekt z imenom obj,ki predstavlja doloeno osebo in vemo, da ta objekt lahkopovpraamo(mu poljemo sporoilo) o tem, koliko je njegov IQ. To storimo tako, da nad njem izvedemometodo

    obj.KolikoJeIQ()Objekt odgovori s sporoilom (metoda vrne rezultat), ki je neko celo tevilo.

    Tisto, kar je pomembno, je to, da nam, kot uporabnikom objekta, ni potrebno vedeti, kako objekt izrauna IQ(je to podatek, ki je zapisan nekje v objektu, je to rezultat nekega preraunavanja ). Kot uporabnikom nam jevano le, da se z objektom lahko pogovarjamo o njegovem IQ. Vse "umazane podrobnosti" o tem, kaj je znotrajkatle, je prepueno tistim, ki napiejo kodo s pomojo katere se ustvari objektin (e je zadeva sevedasprogramirana prav) uporabnik (programer, ki pie drug program, ki te objekte uporablja) se vanje ne morevtikati.

    Seveda se lahko zgodi, da se kasneje ugotovi, da je potrebno "preurediti notranjost objekta". In tu se izkaeprednost OO koncepta. Ker v programih, kjer objekte uporabljamo, ni ne vemo o tem, kaj je znotraj katle, kajse na primer dogaja, ko objekt povpraamo po IQ, bodo programi navkljub spremembam znotraj katle evedno delovali.

    e torej na objekte gledamo kotna rne katle (zakaj rne zato, da se ne vidi, kaj je znotraj!) in z njimiravnamo le preko sporoil (preko klicev metod), nai programi delujejo ne glede na morebitne spremembe vsamih objektih.

    Omogoanje dostopa do objekta samo preko sporoil in onemogoanje uporabnikom, da vidijo (in brskajo) popodrobnostih, se imenuje skrivanje informacij (information hidding)ali e bolj ueno enkapsulacija(encapuslation).

    In zakaj je to pomembno? Velja namre, da se programi ves as spreminjajo. Velika veina programov sedandanes ne napie na novo, ampak se spremeni obstoje program. In veina napak izhaja iz tega, da nekdo

    spremeni doloen delek kode, ta pa potem povzroi, da drug del programa ne deluje ve. e pa so tisti delkivarno zapakirani v kapsule, se spremembe znotraj kapsule ostalega sistema prav ni ne tiejo.

    Objekti

    Objekt je skupek podatkov, s katerim elimo upravljati kot s celoto. Ima : Podatke:

    kaj o objektu vemo, kakne podatke o objektu hranimo Metode:

    Kaj objekt zna Kakne 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.

    Koliko je

    tvoj IQ ?92

  • 7/23/2019 C# Objektno

    12/240

    C# . NET

    Programiranje 1 VS Informatika

    12

    Pravzaprav smo se e ves as ukvarjali z objekti, saj smo v naih programih uporabljali razline objekte, ki so epripravljeni v standardnih knjinicah jezika C#. Oglejmo si nekaj primerov objektov iz standardne knjinice jezika:

    Objekt tipa StreamReaderpredstavlja vhodni kanal. Kadar elimo brati s tipkovnice ali z datoteke,

    naredimo tak objekt in kliemo njegovo metodo readLineza branje ene vrstice. Objekt System.Console predstavlja standardni izhod. Kadar elimo kaj izpisati na zaslon, pokliemometodo Write na objektu System.Console.

    Objekt tipa Randompredstavlja generator nakljunih tevil. Metoda Next(a, b), ki jo izvedemo nadobjektom tega tipa pa nam vrne neko nakljuno celo tevilo med a in b.

    StreamWriter pisanje = new StreamWriter(datoteka);

    //kreiranje objekta StreamWriter

    pisanje.Flush(); //uporaba metode objekta

    new Random().Next(1,100);

    //uporaba metode na objektu iz razreda Random

    Console.WriteLine();

    //uporaba metode WriteLine na objektu Console

    Nauili smo se torej uporabnosti objektnega programiranja, nismo pa se e nauili izdelave svojih razredov.In e se vrnemo na razlago v uvodukot uporabniki isto ni ne vemo (in nas pravzaprav ne zanima), kakometoda Next doloi nakljuno tevilo. In tudi, e se bo kasneje "katla" Random spremenila in bo metoda Nextdelovala na drug nain, to ne bo "prizadelo" programov, kjer smo objekte razreda Random uporabljali. Seveda,e bo sporoilni sistem ostal enak. V omenjenem primeru to pomeni, da se bo metoda e vedno imenovalaNext, da bo imela dva parametra, ki bosta doloala meje za nakljuna tevila in da bo odgovor (povratnosporoilo) nekonakljuno tevilo z elenega intervala.Seveda pa nismo omenjeni le na to, da bi le uporabljali te "rne katle", kot jih pripravi kdo drug (npr. jihdobimo v standardni knjinici jezika). Objekti so uporabni predvsem zato, ker lahko programer definira nove

    razrede in objekte, torej sam ustvarja te nove rne katle, ki jih potem on sam in drugi uporablja. Oglejmo si primer programa v C#, ki uporablja objekte, ki jih napiemo sami.

    PRVI OBJEKTNI PROGRAM

    1: using System;2:3: public class MojR {4: private string mojNiz;5:6: public MojR(string nekNiz) {7: mojNiz = nekNiz;8: }

    9:

    10: public void Izpisi() {11: Console.WriteLine(mojNiz);12: }13: }14:15: public class Pozdrav {16: public static void Main(string[] arg) {17: MojR prvi = new MojR("Pozdravljen, moj prvi objekt v C#!");18: prvi.Izpisi();19: }20: }

  • 7/23/2019 C# Objektno

    13/240

    C# . NET

    Programiranje 1 VS Informatika

    13

    Program napiimo kar na obiajni nain v okolju SharpDevelop torej New Solution/WindowsApplications/Console Application. Vnesene vrstice kar vse pobriimo in napiimo zgornjo kodo. Ko programprevedemo in poenemo, dobimo

    Na kratko razloimo, "kaj smo se li".V vrsticah 313 smo definirali nov razred z imenom MojR. Ta je tak, da o vsakem objektu te vrste poznamonek niz, ki ga hranimo v njem (vrstica 4). Vse znanje, ki ga objekti tega razreda imajo, je, da se znajo odzvati ne

    metodo Izpis(), ko izpiejo svojo vsebino (torej niz, ki ga hranimo v njem).V vrsicah 1520 je na "pravi program", torej tisti del reitve, ki opravi dejansko neko delo. V vrstici 17naredimo primerek objekta iz razreda MojR in vanj shranimo niz "Pozdravljen, moj prvi objekt v C#!". V vrstici

    18 pa temu objektu naroimo, naj izpie svojo vsebino.

    Objektio stanja:

  • 7/23/2019 C# Objektno

    14/240

    C# . NET

    Programiranje 1 VS Informatika

    14

    Lastnosti, podatki, komponenteo znanje

    Odzivanje na dogodkeo Zdrueno v celoto

    Podatki in metode, ki opisujejo neko stvar/objekt oga: Podatki: velikost, barva, poloaj v prostoru, Metode: sprememba velikosti, sprememba poloaja,

    Ulomek: Podatki: tevec, imenovalec Metode: spremeni tevec, spremeni imenovalec, setej, obratna vrednost, lepo izpii, ...

    o Razlika med ogo kot idejo oge in mojo ogo (konkretni primerekrealizacija ideje oge) oziromamed ulomkom kar tako in ulomkom .

    Programiranje v C#

    Sestavljanje razredov:

    Opis lastnosti objektov Opis metod (znanja objektov):

    Ustvarjanje objektov in njihova uporaba "Ukazovanje" objektom, kaj naj ponejo Objekt za izpolnitev doloene naloge potrebuje druge objekte in njihove metode

    Zaetek: Glavni razred (ki ima metodo Main) Izvajanje metode Mainustvarjanje objektov, proenje dogodkov, odzivanje na dogodke,

    Razredje abstraktna definicija objekta in e elimo nek razred uporabiti, mora obiajno obstajati vsaj en

    primerekrazreda. Primerek nekega razreda imenujemo objekt. Ustvarimo ga s kljuno besedo new.ImeRazreda primerek = new ImeRazreda();

    Objekt je raunalniki model predmeta ali stvari iz vsakdanjega ivljenja (avto, oseba, datum). Za reitevproblema uvedemo mnoico objektov, ki si medsebojno poiljajo sporoila. Lastnosti objektov so zapisane v

    razredih (class), ki vsebujejo:

    podatkein ,

    metodeoz. odzive objektov na sporoila.

    Stanje objekta opiemo s spremenljivkami, njihovo obnaanje oz. odzive pa z metodami.

    Objekti

    Objekt je kakrenkoli 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: Pokliemo ustrezno metodo v objektu.

    Objekt je "rna katla, ki sprejema in poilja sporoila. Jedro objekta sestavljajo njegove spremenljivke, okrogkaterih se nahajajo njegove metode.

    Klasino/objektno programiranjeKlasino programiranje:

    program = metode

    Ko elimo kak podatek obdelati v klasinem programiranju: pokliemo ustrezno metodo z argumenti argumenti: podatki, ki naj jih obdela.

    e elimo izvesti metodof na podatku x:o Klasino:

  • 7/23/2019 C# Objektno

    15/240

    C# . NET

    Programiranje 1 VS Informatika

    15

    izvedi statino metodo f na podatku x f(x);

    o Objektno: podatku/objektu x signaliziraj, da naj izvede metodo f

    x.f();

    Od kje razredi?

    Veliko razredov je e vgrajenih (so v standardnih knjinicah) v C# in njegovo oklolje. Taki razredi so na primerMath, System, StreamReader,

    o .NET Framework

    C# je .NET jezik ima dostop do vseh razredov, definiranih v knjinicah (zbirkahrazredov) okolja .NET

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

    o Razporejeni v imenske prostore

    System, System.IO

    Razrede lahko dobimo tudi iz drugih virov:

    o Nai stari razredi

    o Drugi programerji

    Potrebujemo dostop do ustrezne datoteke (dll, exe)

    Objekt in ime spremenljivkeNekiObjekt a;

    a je naslov, kjer bo objekt (referenca na objekt)new NekiObjekt();

    V pomnilniku se je naredil objekt tipa NekiObjekt() / po pravilih, ki so doloena z opisom razredaNekiObjekt

    a = new NekiObjekt(); V pomnilniku se je naredil objekt tipa NekiObjekt() in a kae na ta novo ustvarjeni objekt

    Ustvarjanje objektov

    Razred je ablona, ki definira spremenljivke in metode skupne vsem objektom iste vrste.class:

    Nart objekta, ablonaPrimerek razreda (instanca)konkretni objekt:

    Ustvarimo ga z new Brez tega objekta NE MOREMO uporabiti NekiObjekt a;

    Objekt NE obstaja

    a je IME objekta natanneje

    a je ime spremenljivke, kjer hranimo NASLOV objekta vrste NekiObjekt

    C# in objektiRazred (class) je opis vrste objekta (nart, kako naj bo objekt videti) opis ideje objekta.Primerek razreda (instanca)konkretni objekt.

    http://msdn2.microsoft.com/sl-si/library/ms229335(en-us).aspxhttp://msdn2.microsoft.com/sl-si/library/ms229335(en-us).aspxhttp://msdn2.microsoft.com/sl-si/library/ms229335(en-us).aspxhttp://msdn2.microsoft.com/sl-si/library/ms229335(en-us).aspx
  • 7/23/2019 C# Objektno

    16/240

    C# . NET

    Programiranje 1 VS Informatika

    16

    Ustvarjanje objektov

    Ulomek ime = new Ulomek(3, 4);

    Reemo:V objektu ime je shranjen ulomek ;Toneje: v spremenljivki ime je naslov nekega objekta tipa Ulomek, ki predstavlja ulomek . Spremenljivka ime kae na objekt tipa Ulomek, ki

    Prvi ukaz je dejansko spoj dveh stavkov: deklaracija in prireditev

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

    ime: _2h11b11__2h11b11:

    o Brez new objekta e NIo vasih skrito

    Nizi string a = "bla"; string a = new string("bla");

    Tabele int[] tabela = {1, 2, 3}; int[] tabela = new int[3]; tabela[0] = 1;

    Zgled

    Poglejmo si e en zgled. Denimo, da bi radi napisali program, ki bo prebral nek ulomek in mu pritel 1/2."Klasino" se bomo tega lotili takole (seveda pisec ni pozabil, kako se setevajo ulomki, a takojle, po Janezkovo,si je laje zapomniti ;-) )

    POVEAJMO ULOMEK KLASINO

    1: using System;

    2: namespace UlomkiKlasika {

    3: class Program

    4: {

    5: public static void Main(string[] args)6: {

  • 7/23/2019 C# Objektno

    17/240

    C# . NET

    Programiranje 1 VS Informatika

    17

    7: // vnos podatkov

    8: Console.Write("tevec ulomka: ");9: string beri = Console.ReadLine();

    10: int stevec = int.Parse(beri);

    11: Console.Write("Imenovalec ulomka: ");12: beri = Console.ReadLine();

    13: int imenovalec = int.Parse(beri);

    14: // "delo"

    15: stevec = stevec + 1;

    16: imenovalec = imenovalec + 2;

    17: // izpis

    18: Console.WriteLine("Nov ulomek je: " + stevec + " / " +imenovalec);

    19: Console.Write("Press any key to continue . . . ");

    20: Console.ReadKey(true);

    21: }22: }

    23: }

    Sedaj pa to naredimo e "objektno". Oitno bomo potrebovali razred Ulomek. Objekt tipa Ulomek hranipodatke o svojem tevcu in imenovalcu. Njegovo znanje je, da "se zna" poveati za drug ulomek. To pomeni, davsebuje metodo, ki ta ulomek povea za drug ulomek.Shematsko bo program (kjer so doloeni deli skriti) videti kot

    Cel program pa bo:

    POVEAJMO ULOMEK -OBJEKTNO

    24: using System;25: namespace UlomkiObjektno26: {27: class Ulomek {28: public int stevec;

    29: public int imenovalec;30:

  • 7/23/2019 C# Objektno

    18/240

    C# . NET

    Programiranje 1 VS Informatika

    18

    31: public Ulomek(int st, int im) {32: this.stevec = st;33: this.imenovalec = im;34: }

    35:36: public void Pristej(Ulomek a) {37: this.stevec = this.stevec + a.stevec;38: this.imenovalec = this.imenovalec + a.imenovalec;39: }40: }41: class Program42: {43: public static void Main(string[] args)44: {45: // vnos podatkov46: Console.Write("tevec ulomka: ");

    47: string beri = Console.ReadLine();48: int stevec = int.Parse(beri);49: Console.Write("Imenovalec ulomka: ");50: beri = Console.ReadLine();51: int imenovalec = int.Parse(beri);52: Ulomek moj = new Ulomek(stevec, imenovalec);53: // "delo"54: Ulomek polovica = new Ulomek(1, 2);55: moj.pristej(polovica);56: // izpis57: Console.WriteLine("Nov ulomek je: " + moj.stevec + " / " +58: moj.imenovalec);

    59: }60: }61: }

    e posebej oznaimo kljune toke (poleg definicije razreda Ulomek v vrsticah 4 17):

    Objektno programiranjeImamo nek problem. Kako se torej lotiti nartovanja reitve s pomojo objektnega programiranja?

  • 7/23/2019 C# Objektno

    19/240

    C# . NET

    Programiranje 1 VS Informatika

    19

    Z analizo ugotovimo, kakne objekte potrebujemo za reevanje Pregledamo, ali e imamo na voljo ustrezne razrede

    Standardna knjinica Druge knjinice

    Nai stari razredi Sestavimo ustrezne manjkajoe razrede Sestavimo glavni program, kjer s pomojo objektov reimo problem

    Objekti, razredi, ...

    Zdruevanje podatkovDenimo, da piemo program, ki bo pomagal upravljati farmo zajcev . Za vsakega zajca poznamo:

    serijsko tevilko spol teo

    Kako dosei, da se podatki drijo skupaj: Tabela ni ustrezna

    Tabela je zbirka istovrstnihpodatkov

    Pri tabelah smo omenili, da so sestavljen podatkovni tip. Vsebujejo elemente istega tipa. Velikokrat pa elimoustvariti tip, ki je prav tako sestavljen, a iz razlinih podatkovnih tipov.V ta namen imamo v jeziku C# tako imenovane strukture. A ker gre v bistvu le za posebni primer objektov, jih

    bomo kar preskoili in si raji kar neposredno ogledali objekte. Da pa boste vedeli zakaj gre, e boste v kaknemprogramu naleteli na kljuno besedo struct, si zapomnimo le, da gre za nekakne "poenostavljene" objekte.

    Sestavimo razredZajec Opis podatkov, ki sestavljajo poljubnega zajca

    V zgledih do sem smo razrede pisali le za "lokalno uporabo", znotraj doloenega programa. Sedaj se nauimo

    e, kako na najlaji nain gradimo svojo knjinico razredov, ki jih bomo uporabljali v razlinih programih. Na tanain bomo tudi bolj loili tisti del programiranja, ko gradimo razrede in tisti del, ko uporabljamo objektedoloenega razreda.V okolju SharpDevelop tokrat ne izberemo Windows Applications/Console Application, ampak C# / Class Library

  • 7/23/2019 C# Objektno

    20/240

    C# . NET

    Programiranje 1 VS Informatika

    20

    Kot ime bomo napisali MojiRazredi. V ta projekt bomo dodajali vse tiste razrede, ki jih bomo ustvarjali,vkljuno z naim razredom Zajec.

    Vidimo, da je SharpDevelop pripravil okolje in naredil tako imenovam imenski prostor MojiRazredi. Znotrajtega imenskega prostora bomo zlagali nae razrede. Ker nam ime MyClassni ve, bomo to spremenili vZajec.

    Omenimo e komentarje, ki se zano z ///. To so tako imenovani dokumentacijski komentarji. Ti sluijo za to, da

    pripravimo dokumentacijo o razredu. Ta je zelo pomembna, saj nosi tisto informacijo, ki jo kasnejepotrebujemo, e elimo razred uporabljati. Zanekrat si zapomnimo le, da na ustrezno mesto napiemo kratekpovzetek o tem, emu je razred namenjen. Veo tem si lahko preberete:

    http://www.softsteel.co.uk/tutorials/cSharp/lesson19.html

    http://www.winnershtriangle.com/w/Articles.XMLCommentsInCSharp.asp

    http://www.csharphelp.com/archives3/archive598.html

    ...

    RAZRED ZAJEC

    21: public class Zajec {22: public string serijska;23: public bool spol;24: public double masa;25: }

    http://www.softsteel.co.uk/tutorials/cSharp/lesson19.htmlhttp://www.softsteel.co.uk/tutorials/cSharp/lesson19.htmlhttp://www.winnershtriangle.com/w/Articles.XMLCommentsInCSharp.asphttp://www.winnershtriangle.com/w/Articles.XMLCommentsInCSharp.asphttp://www.csharphelp.com/archives3/archive598.htmlhttp://www.csharphelp.com/archives3/archive598.htmlhttp://www.csharphelp.com/archives3/archive598.htmlhttp://www.winnershtriangle.com/w/Articles.XMLCommentsInCSharp.asphttp://www.softsteel.co.uk/tutorials/cSharp/lesson19.html
  • 7/23/2019 C# Objektno

    21/240

    C# . NET

    Programiranje 1 VS Informatika

    21

    S tem imamo napisan opis, kako je doloen poljuben zajec: Nart, kakni so zajci Ni to konkreten zajec

    Ni metode Main, dejansko se NI ne izvede, ...Ni namenjeno poganjanju kot program.Zato bo stvar potrebno prevesti drugae. V Build izberemo Build Moji Razredi (oziroma pritisnemo na F9). S temsmo ustvarili ustrezno prevedeno obliko in sicer MojiRazredi.dll. TA vsebuje med drugim tudi definicijo razreda

    Zajec.

    Uporaba razreda Zajec

    Denimo, da sedaj piemo nek program, kjer bomo potrebovali Zajce. V ta namen sedaj sestavimo program v C#.Obnaamo se tako kot smo pisali programe do sedaj.

    v SharpDevelop: File/New Solution/Winows applications/Console Application

    Sedaj moramo dodati e t.i. referenco, da bo na program prepoznal na razred.

    Project / Add reference

  • 7/23/2019 C# Objektno

    22/240

    C# . NET

    Programiranje 1 VS Informatika

    22

    V oknu, ki se odpre, izberemo .Net Assembly Browser. Poiemo imenik MojiRazredi/bin/Debug in v njemdatoteko MojiRazredi.dll.

    Da bomo kraje pisali, dodamo sedaj imenski prostor MojiRazredi (ker vsebuje definicijo razreda Zajec)using MojiRazredi;

    e sedaj v programu potrebujemo konkretnega zajca, 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, kje ta konkretni zajec je Zajec rjavko = new Zajec();

    V spremenljivki rjavkoje naslov, kje je novo ustvarjeni zajec (objekt)

    Dostop do podatkov v objektu rjavko.spol = true; rjavko.serijska = BRGH_17_A; rjavko.masa = 3.2;

    UPORABA RAZREDA ZAJEC

    26: using System;27: using MojiRazredi;62:

  • 7/23/2019 C# Objektno

    23/240

    C# . NET

    Programiranje 1 VS Informatika

    23

    63: namespace TestZajec64: {65: class Program66: {

    67: public static voidMain(string[] args)68: {69: Zajec z1 = new Zajec();70: z1.serijska = "1238-12-0";71: z1.spol = false;72: z1.masa = 0.12;73: z1.masa = z1.masa + 0.3;74: Console.WriteLine("Zajec ima ser. t.:" + z1.serijska);75:76: Console.Write("Press any key to continue . . . ");77: Console.ReadKey(true);78: }

    79: }80: }

    FARMAZAJCEV

    28: public class FarmaZajcev {29: public static void Main(atring[] ar) {30: Zajec[] zajci = new Zajec[10]; // na farmi imamo do 10 zajcev31: int i = 0;32: while (i < 10) {33: zajci[i] = new Zajec(); // rodil se je nov zajec34: zajci[i].serijska = "1238-12-+ i;35: zajci[i].spol = false;36: zajci[i].masa = 0.12;37: i++;38: }39: ...40: }41: }

  • 7/23/2019 C# Objektno

    24/240

    C# . NET

    Programiranje 1 VS Informatika

    24

  • 7/23/2019 C# Objektno

    25/240

    C# . NET

    Programiranje 1 VS Informatika

    25

    e en primer - UlomekDenimo, da bi potrebovali e podatkovni tip Ulomek. Na projekt MojiRazredi (seveda bi lahko naredili novoknjinico razredov) dopolnimo z

    RAZRED ULOMEK

    81: public class Ulomek {82: public int stevec;83: public int imenovalec;84: }

    Potem, ko z Build/Build MojiRazredi prevedemo stvar na novo, je knjinica z novim razredom Ulomekpripravljena za uporabo. To pomeni, da novi razred (e elite novi podatkovni tip) lahko uporabljamo v drugihprogramih, kot tudi pri sestavljanju drugih razredov. Ne pozabimoe elimo narediti objekt vrste (tipa)Ulomek, napiemoUlomek x = new Ulomek();

    Kako napolniti stevec in imenovalec?

    x.stevec: spremenljivka tipa int! x.imenovalec: enako

    x.stevec = 1; x.imenovalec = x.stevec + 1;

  • 7/23/2019 C# Objektno

    26/240

    C# . NET

    Programiranje 1 VS Informatika

    26

    No, ne pozabimo, da e doloen razred potrebujemo le v sklopu reitev enega primera, ga lahko ustvarimo tudi"lokalno", znotraj tistega programa.

    PRIMER IZDELAVE IN UPORABE RAZREDA

    42: using System;43: public class Vozilo44: {45: public int letnik;46: public string proizvajalec;47: public int prevozeniKilometri;48: }49: class Program50: {51: public static void Main()52: {53: Vozilo mojAvto = new Vozilo();//kreiramo primerek54: mojAvto.proizvajalec = "Citron";55: mojAvto.letnik = 2000;56: mojAvto.prevozeniKilometri = 90000;57: Console.WriteLine("Proizvajalec: " + mojAvto.proizvajalec);58: Console.WriteLine("Letnik: " + mojAvto.letnik);59: Console.WriteLine("Kilometri: " + mojAvto.prevozeniKilometri);60: }61: }

    Razlaga. Najprej ustvarimo razred z imenom vozilo (vrstice 2-7). V glavnem programu kreiramo nov primerek

    (objekt) z imenom mojAvtorazreda Vozilo (vrstica 12). Objektu doloimo vrednosti (vrstice 13 -15) in izpiemovrednosti (vrstice 16-18).

    Povzetek

    Najenostavneji razred kreiramo tako, da doloimo spremenljivke, ki doloajo objekte tega razreda. Te so lahkorazlinih podatkovnih tipov. Sintaksa najenostavneje definicije razreda je naslednja:

    public class ImeRazreda {public podatkovni tip element1;public podatkovni tip element2;public podatkovni tip elementn;

    }

    e elimo tak razred uporabljati v nekem programu, moramo v programu dodati referenco na ustreznoprevedeno obliko (dll) tega razreda.

    Objekt tega razreda ustvarimo z new ImeRazreda();

    S tem dobimo naslov, kje ta objekt je in ga shranimo v spremenljivko tipa ImeRazreda:

    ImeRazreda imeObjekta = new ImeRazreda();

    Do posameznih spremenljivk (reemo jim tudi komponente ali pa lastnosti), dostopamo zimeObjekta.imeKomponente

    KonstruktorjiOb tvorbi objekta bi radi nastavili zaetno stanje spremenljivk (in morda opravili e kaj a o tem kasneje).

  • 7/23/2019 C# Objektno

    27/240

    C# . NET

    Programiranje 1 VS Informatika

    27

    V ta namen imamo v C# posebne metode, ki jih imenujemo konstruktorji.

    Konstruktor je metoda, ki jo pokliemo ob tvorbi objekta z new. Je brez tipa rezultata. To ne smemo zamenjatiz metodami, ki rezuultata ne vraajo so tipa void). Konstruktor tipa rezultata sploh nima, tudi void ne. Pravtako smo omenjeni pri izbirri imena te metode. Konstruktor mora imenti ime nujno tako. kot je ime razreda.

    Najveja omejitev, ki loi konstruktorje od drugih metod pa je ta, da konstruktor ne moremo klicati napoljubnem mestu (kot lahko ostale metode). Kliemo ga izkljuno skupaj z new: Klic: new Zajec();

    Razred Zajec

    RAZRED ZAJEC S KONSTRUKTORJEM

    85: public class Zajec {86: public string serijska;87: public bool spol;88: public double masa;89:90: // konstruktor

    91: public Zajec() {92: this.spol = true; // vsem zajcem na zaetku doloimo m. spol93: this.masa = 1.0; // in tehtajo 1kg94: this.serijska = NEDOLOENO;95: }96: }

    this

    V zgornjem primeru smo v konstruktorju uporabili prijem, ki ga doselj e nismo sreali. Napisali smo this. Kajto pomeni?

    thisoznaujeobjekt, ki ga "obdelujemo". V konstruktorju je to objekt, ki ga ustvarjamo. this.spol se torej

    nanaa na lastnost/komponentospol objekta, ki se ustvarja (ki ga je ravno naredil new).Denimo, da v nekem programu napiemo

    Zajec rjavko = new Zajec();Zajec belko= new Zajec();

    Pri prvem klicu se ob uporabi konstruktorja Zajec()thisnanaal na rjavko, pri drugem na belko.Na ta nain (z this) se lahko sklicujemo na objekt vedno, kadar piemo metodo, ki jo izvajamo nad nekimobjektom. Denimo, da smo napisali

    Random ng = new Random();Random g2 = new Random();Console.WriteLine(ng.Next(1,10));

    Kako so programerji, ki so sestavljali knjinico in v njej razred Randomlahko napisali kodo metode, da se jevedelo, da pri metodi Nextmislimo na uporabo generatorja ngin ne na g2?

    Denimo, da imamo razred MojRazred(v njem pa komponento starost) in v njem metodo MetodaNeka. Vprogramu, kjer razred MojRazreduporabljamo, ustvarimo dva objekta tipa MojRazred. Naj bosta to objAin objC. Kako se znotraj metode MetodaNekasklicati na ta objekt (objekt, nad katerim je izvajana metoda)?e torej metodo MetodaNekakliemo nad obema objektoma z objA.MetodaNeka() oziroma zobjC.MetodaNeka(), kako v postopku za metodaNekapovedati, 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),

    kako povedati, da naj se ob klicu objA.MetodaNeka() uporabi starost objekta objA, ob klicuobjC.MetodaNeka() pa starost objekta objC?

    Console.WriteLine("Starost je: " + ?????.starost);Ob prvem klicu so ????objA, ob drugem paobjC. To "zamenjavo" doseemo z this. Napiemo

    Console.WriteLine("Starost je: " + this.starost);

  • 7/23/2019 C# Objektno

    28/240

    C# . NET

    Programiranje 1 VS Informatika

    28

    Ob prvem klicuthis pomeniobjA, ob drugem paobjC.Torej v metodi na tistem mestu, kjer potrebujemo konkretni objekt, nad katerim metodo izvajamo, napiemothis.

    Uporaba razreda:Kot smo povedali e vekrat, je razred le nart, kako so videti objkekti doloenega razreda. e potrebujemokonkreten primer, v naem primeru Zajca, ga ustvarimo z new:new Zajec()

    S tem se je ustvaril konkreten zajec (torej tak, ki ima tri spremenjlivke za hranjenje podatkov), nad katerim smo

    takoj potem izvdeli doloeno akcijo po navodilih iz konstruktorja Zajec(). Kombinacija new Zajec()jetorej poskrbela, da ima objekt tipaZajec tri podatke z vrednostmi, kot je predpisano v konstruktorju.

    Privzeti konstruktor

    e konstruktorja ne napiemo (kot ga nismo prej), ga naredi prevajalnik sam (a metoda ne naredi ni) . Doklerje bil na razred zajec

    RAZRED ZAJEC1: public class Zajec {2: public string serijska;3: public bool spol;4: public double masa;5: }

    je prevajalnik sam dodal privzeti kostruklor.

    PRIVZETI KONSTRUKTOR RAZREDA ZAJEC

    97: public Zajec() {98: }

    Kakor hitro pa smo konstruktor Zajec()napisali sami, se seveda prevajalnik ni ve "vmeaval":

    Ko smo napisali

    RAZRED ULOMEK

    99: public class Ulomek {100: public int stevec;101: public int imenovalec;102: }

    je torej to enako, kot e bi napisali

    RAZRED ULOMEK S PRIVZETIM KONSTRUKTORJEM

    103: public class Ulomek {104: public int stevec;105: public int imenovalec;106:107: public Ulomek() {108: }109: }

    Konstruktorjev ne moremo klicati posebej (kot ostale metode), ampak le, ko tvorimo objekt z new.Konstruktorje uporabljamo za vzpostavitev zaetnega stanjaobjekta. Ne pozabimo, da imajo enakoime kot razred. Nimajo tipa rezultata (tudi voidne!). Prat tako ne vsebujejo stavka return.

  • 7/23/2019 C# Objektno

    29/240

    C# . NET

    Programiranje 1 VS Informatika

    29

    Ve konstruktorjevUporabniki bi poleg privzetega zajca, radi e monost, da bi takoj, ko zajca naredijo, temu doloili eserijsko tevilko. Radi bi torej konstruktor

    public Zajec(string serijskaSt)

    Poleg tega pa vasih na farmo dobijo tudi poiljko samic. Torej potrebujejo e konstruktor public Zajec(bool spol)Vasih pa so zajci "nestandardni"

    public Zajec(string serijskaSt, bool spol, double teza)Potrebovali bi torej, da ima razred ve konstruktorjev. A ker morajo imeti vsi konstruktorji ime tono tako, kotje ime razreda, to pomeni, da mora biti metoda

    public Zajec(string serijskaStev, bool spol, double masa)

    Ker pa imamo e od prej metodopublic Zajec()

    to pomeni, da bi imeli ve metodz enakim imenom. Je to sploh mono?

    Jezik C# podpria tako imenovano preobteevanje (overloading) metod. Tako imamo lahko znotraj istegaprograma ve metod z enakim imenom. To ne velja le za konstruktorje, ampak tudi v splonem.Metode se morajo razlikovati ne v imenu, ampak podpisu. Podpis metode je sestavljen iz imena metode in

    tipov vseh parametrov. Konstruktor

    Zajec()

    ima torej podpis enostavno Zajec, konstruktor

    public Zajec(string serijskaStev, bool spol, double masa)

    pa podpis Zajec_string_bool_double

    Preobteene metodeKot smo omenili, so lahko preobteenetudi navadne metode (ne le konstruktorji). Prav tako enako velja e

    enkratpreobteenost oznauje monost, da imamo ve enako poimenovanih metod, ki pa sprejemajoparametre razlinega tipa.Zakaj je to uporabno?

    Denimo, da imamo metodo Ploscina, ki kot parameter dobi objekt iz razreda Kvadrat, Krog ali Pravokotnik.

    Kako jo zaeti?public static double Ploscina(X lik)

    Ker ne vemo, kaj bi napisali za tip parametra, smo napisali kar X. e preobteevanje ne bi bilo mon o, bi moralinapisati metodo, ki bi sprejela parameter tipa X, kjer je X bodisi Kvadrat, Krog ali Pravokotnik. Seveda to ne gre,

    saj prevajalnik nima naina, da bi zagotovil, da je X oznaka bodisi za tip Kvadrat, tip Krog ali pa tip Pravokotnik.Pa tudi ebi lo kako bi nadaljevali? V kodi bi morali rei ... e je lik tipa kvadrat, uporabi to formulo, e je liktipa Krog spet drugo ...

    S preobteevanjem pa problem reimo enostavno. Napiemo 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 tono vemo, kaken je, tudi ni teav z uporabo pravilne forumule. Imamo torejtri metode, z enakim imenom, a razlinimi podpisi. Seveda bi lahko problem reili brez preobteevanja, recimotakole:

    public static double PloscinaKvadrata(Kvadrat lik) { public static double PloscinaKroga(Krog lik) { public static double PloscinaPravokotnika(Pravokotnik lik) {

    A s stalia uportabnika metod je uporaba preobteenih metod enostavneja. e ima nik lik bla, ki je bodisi tipa

    Kvadrat, tipa Krog ali pa tipa Pravokotnik, metodo poklie z Ploscina(bla), ne da bi mu bilo potrebno

    razmiljati, kakno je pravilno ime ustrezne metode ravno za ta lik. Prav tako je enostavneje, e dobimo e

  • 7/23/2019 C# Objektno

    30/240

    C# . NET

    Programiranje 1 VS Informatika

    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. 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 soasno: 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 navzkrino sklicevanjePoglejmo, kako bi kostruktorje razreda Zajec napisali "zares".

    KONSTRUKTORJI RAZREDA ZAJEC

    62: public Zajec() {63: this.spol = true; // vsem zajcem na zaetku doloimo m. spol64: this.masa = 1.0; // in tehtajo 1kg65: this.serijska = NEDOLOENO;66: }67:68: public Zajec(string serijskaStev) : this() {69: this.serijska = serijskaStev;70: }

    71: public Zajec(string serijskaStev,72: bool spol, double masa) : this(serijskaStev) {73: this.masa = masa; // popravimo maso74: this.spol = spol; // popravimo spol75: }

    Kljuna beseda thisv zgornjem zgledu nastopa v dveh vlogah. Enkrat je uporabljena za ime objekta, kar epoznamo (this.spol, this.serijska), novo pa je uporaba this(takoj za seznamom parametrovnekega konstruktorja.

    e malo o thiso this(

    Za klic drugega konstruktorja pred vsemi ostalimi stavki drugega konstruktorja this() this()

    o this. Za dostop do lastnosti

    this.serijska e ni monosti zamenjave, lahko izpustimo

  • 7/23/2019 C# Objektno

    31/240

    C# . NET

    Programiranje 1 VS Informatika

    31

    serijska this.spol = spol; Obstajaloje e DRUGO ime spol

    Loiti med spremenljivkospol, ki je parameter in lastnostjo objekta z imenom spol

    "Prednost" ima bolj "lokalna" stvartorej parameter spol = spol;

    ZgledOglejmo si e en primer sestavljanja razredov. Denimo, da bi radi napisali program, ki vodi evidenco o lanihportnega kluba. Podatki o lanuobsegajo ime, priimek, letnico vpisa v klub in vpisno tevilke (seveda je topoenostavljen primer). Torej objekt, ki predstavlja lana kluba, vsebuje tiri podatke:

    RAZRED CLAN

    76: public class Clan {77: public string ime;78: public string priimek;79: public int leto_vpisa;

    80: public string vpisna_st;81: }

    S tem smo povedali, da je vsak objekttipa Clan sestavljen iz tirih komponente: ime, priimek, leto_vpisa,vpisna_st.

    e je a objekt tipa Clan, potem lahko dostopamo do njegove komponente ime tako, da napiemo a.ime.Nov objekt naredimo z ukazom new, kot to kae naslednji primer:

    TESTKLUB

    82: public class TestKlub {83: public static void Main(string[] args) {84:

    85:

    Clan a = new Clan();86: a.ime = "Janez";87: a.priimek = "Starina";88: a.leto_vpisa = 2000;89: a.vpisna_st = "2304";90:91: Clan b = new Clan();92: b.ime = "Mojca";93: b.priimek = "Mavko";94: b.leto_vpisa = 2001;95: b.vpisna_st = "4377";96:

    97:

    Clan c = b;98: c.ime = "Andreja";99:100: Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek +101: " " + a.leto_vpisa + " (" + a.vpisna_st + ")\n");102:103: Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek +104: " " + b.leto_vpisa + " (" + b.vpisna_st + ")\n");105:106: Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek +107: " " + c.leto_vpisa + " (" + c.vpisna_st + ")\n");108: Console.ReadLine();

    109: }110: }

  • 7/23/2019 C# Objektno

    32/240

    C# . NET

    Programiranje 1 VS Informatika

    32

    Hm, kako to, da sta dva zadnja izpisa enaka?

    V programu smo naredili dva nova objekta razreda Clan, ki sta shranjena v spremenljivkah a in b. Kot vedno, se

    nove objekte naredi z ukazom new. Spremenljivka c paje isti objekt kot b, se pravi, da se v 16. vrstici ninaredila

    nova kopija objekta b, ampak se spremenljivki b in c sklicujetana isti objekt. In zato smo z vrstico 23 vplivali

    tudi na ime objekta b!

    V vrsticah 48 smo naredili objekt a in nastavili vrednosti njegovih komponent. Takole nastavljanje je v praksidokaj neprimerno, ker se zlahka zgodi, da kako komponento pozabimo nastaviti. Zato C# omogoa, da delamonove objekte na bolj praktien nain s pomojo konstruktorjev. Konstruktor je posebna metoda, ki ima enakoime kot je ime razreda. Konstruktor uporabimo v ukazu new. C# najprej naredi nov objekt, nato pa pokliekonstruktor. Znotraj konstruktorja se pravkar narejeni objekt imenuje this. Primer:111: public class Clan {112: public string ime;113: public string priimek;114: public int leto_vpisa;115: public string vpisna_st;116:117: public Clan(string i, string p, int l, string v) {

    118: this.ime = i;119: this.priimek = p;120: this.leto_vpisa = l;121: this.vpisna_st = v;122: }123: }

    Poskusimoali nae "pacanje" po razredu kaj vpliva na testni program.Ko poskusimo prevesti program, prevajalnik "protestira". Kako, kaj pa tisto govorjenje o tem, da spremembe

    razreda ne vplivajo na programe, ki razred le uporabljajo. Se je kje spremenilo kaj na nivoju sporoil? Saj jih vprvotnem programu sploh nimamo. Torej se ne bi smelo ni pokvariti! Razlog je v tem, da uporabimo privzeti konstruktor (Clan()), ki ga pa v razredu Clan nismo napisali. Ampak,

    saj ga prej tudi ni bilo? Kako je pa prej delovalo? Kot smo rekli e prej, e konstruktorja ne napiemo, C# samdoda konstruktor Clan(). Zato je prej zadeva delovala.Kakor hitro pa napiemo poljubni konstruktor, se C# ne vmeava ve. Zato sedaj ni sam dodal konstruktor

    Clan(), in testni program ne dela ve prav. V ta namen si je dobro zapomniti, da v razredih vedno napiemotudi konstruktor Clan().

    RAZRED CLAN

    110: public class Clan {111: public string ime;112: public string priimek;113: public int leto_vpisa;114: public string vpisna_st;

    115:116: public Clan() {

  • 7/23/2019 C# Objektno

    33/240

    C# . NET

    Programiranje 1 VS Informatika

    33

    117: this.ime = "Ne vem";118: this.priimek = "Ne vem";119: this.leto_vpisa = 0;120: this.vpisna_st = "Ne vem";

    121: }122:123: public Clan(string i, string p, int l, string v) {124: this.ime = i;125: this.priimek = p;126: this.leto_vpisa = l;127: this.vpisna_st = v;128: }129: }

    Ko sedaj poskusimo izvesti na testni program,teav ni ve in dobimo isti rezultat. A emu smo potem pisali edrugi konstruktor in zakaj smo se sploh ubadali z njimi, e pa je stvar enaka kot prej. Poglejmo ta testni

    programTESTCLAN

    130: public class TestClan{131: public static void Main(string[] args) {132: Clan a = new Clan("Janez", "Starina", 2000, "2304");133: Clan b = new Clan("Mojca", "Mavko", 2001, "4377");134: Clan c = b;135: c.ime = "Katarina";136:137: Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek +138: " " + a.leto_vpisa + " (" + a.vpisna_st +

    ")\n");139:140: Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek +141: " " + b.leto_vpisa + " (" + b.vpisna_st +

    ")\n");142:143: Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek +144: " " + c.leto_vpisa + " (" + c.vpisna_st + ")\n");145: }146: }

    Zgornji program deluje povsem enako kot prejnji testni program, je pa vsekakor bolj pregleden. Namenkonstruktorja je, da nastavi vrednosti komponent objekta. Ker konstruktorji (pa tudi druge metode znotraj

    razreda) zelo pogosto dostopajo do komponent, nam C# omogoa, da namesto this.komponentapiemokar komponenta:

    RAZRED CLAN (BREZ THIS)

    124: public class Clan {125: public string ime;126: public string priimek;127: public int leto_vpisa;128: public string vpisna_st;129:130: public Clan() {131: ime = "Ne vem";

    132: priimek = "Ne vem";133: leto_vpisa = 0;

  • 7/23/2019 C# Objektno

    34/240

    C# . NET

    Programiranje 1 VS Informatika

    34

    134: vpisna_st = "Ne vem";135: }147:136: public Clan(string i, string p, int l, string v) {

    137: ime = i;138: priimek = p;139: leto_vpisa = l;140: vpisna_st = v;141: }142: }

    Objektne metode

    Svoj pravi pomen dobi sestavljanje razredov takrat, ko objektu pridruimo e metode, torej znanje nekegaobjekta. Kot e vemo iz uporabe vgrajenih razredov, metode nad nekim objektom kliemo tako, da navedemoime objekta, piko in ime metode. Tako e elimo izvesti metodo WriteLine nad objektom System.Consolenapiemo

    System.Console.WriteLine("To naj se izpie");e elimo izvesti metodo Equals nad nizom besedilo, napiemo

    besedilo.Equals(primerjava)in tako dalje. Denimo, da potrebujemo metodo, ki vrne inicialke nekega lana. To bomo napisali takole:

    METODA V RAZREDU CLAN

    148: public string Inicialke() {149: return this.ime[0] + "." + this.priimek[1] + ".";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", "Starina", 2000, "2304");154: string inicialnkeClanaA = a.Inicialke();155: Console.Write("Clan a:\n" + a.ime + " " + a.priimek +156: " " + a.leto_vpisa + " (" + a.vpisna_st + ")

    ");157: Console.WriteLine("ima inicialke: " + inicialnkeClanaA);158: }159: }

    Denimo, da smo kasneje ugotovili, da bi bili uporabniki razreda Clan veliko bolj zadovoljni, e bi metodaInicialke vrnila niz brez pik, le s presledkom med zaetnico imena in priimka. Kaj storiti?Potrebno je popraviti le razred Clan, kjer spremnimo metodo

    METODA V RAZREDU CLAN

    160: public string Inicialke() {161: return this.ime[0] + " " + this.priimek[0];162: }

    Ko razred ponovno prevedemo, imamo e vse pripravljeno za "pravilno" izvajanje vseh tistih programov, kiuporabljajo ta razred. Brez kakrnekoli spremembe v uporabnikem programu (in tudi brez ponovnegaprevajanja tega programa), metoda sedaj deluje v skladu z v razredu narejenimi spremembami. e torejopazimo, da je potrebno v razredu narediti kaken popravek, le vsem naim uporabnikom poljemo novo

    razliico prevedenega razreda (ali knjinice, ki vsebuje ta razred). Brez kakrnihkoli sprememb na straniuporabnika njihovi programi delujejo "popravljeno".

  • 7/23/2019 C# Objektno

    35/240

    C# . NET

    Programiranje 1 VS Informatika

    35

    Vemo, da z

    a = b;kjer sta a in b obe spremenljivki tipa Clan, v a ne shranimo kopije objekta b, ampak sedaj a in b oznaujeta istiobjekt.

    Zato napiimo metodo, ki naredi kopijo objekta.a = b.Kopija();V a je nov objekt, ki pa ima iste podatke kot b.

    KOPIJA OBJEKTA

    163: public Clan Kopija() {164: Clan nov = new Clan();165: nov.ime = this.ime;166: nov.priimek = this.priimek;167: nov.leto_vpisa = this.leto_vpisa;168: nov.vpisna_stevilka =169: this.vpisna_stevilka;170: }

    Uporabna je tudi metoda, ki izpie objekt

    IZPIS OBJEKTA

    171: public void Izpis() {172: Console.WriteLine("Clan:\n" + this.ime + " " +173: this.priimek + " " + this.leto_vpisa +174: " (" + this.vpisna_st + ")\n");175: }

    ali pa e

    OPIS OBJEKTA

    176: public string Opis() {177: return this.ime + " " + this.priimek + " " +178: this.leto_vpisa +179: " (" + this.vpisna_st + ");180: }

    e sedaj navedemo celotni razred

    RAZRED CLAN

    181: public class Clan {182: public string ime;183: public string priimek;

    184: public int leto_vpisa;185: public string vpisna_st;186:187: public Clan() {188: ime = "Ne vem";189: priimek = "Ne vem";190: leto_vpisa = 0;191: vpisna_st = "Ne vem";192: }193:194: public Clan(string i, string p, int l, string v) : this() {195: ime = i;

    196: priimek = p;197: leto_vpisa = l;

  • 7/23/2019 C# Objektno

    36/240

    C# . NET

    Programiranje 1 VS Informatika

    36

    198: vpisna_st = v;199: }200:201: public string Inicialke() {

    202: return this.ime[0] + "." + this.priimek[0] + ".";203: }204:205: public Clan Kopija() {206: Clan nov = new Clan();207: nov.ime = this.ime;208: nov.priimek = this.priimek;209: nov.leto_vpisa = this.leto_vpisa;210: nov.vpisna_stevilka = this.vpisna_stevilka;211: return nov;212: }213:

    214: public void Izpis() {215: Console.WriteLine("Clan:\n" + this.ime + " " +216: this.priimek + " " + this.leto_vpisa +217: " (" + this.vpisna_st + ")\n");218: }219:220: public string Opis() {221: return this.ime + " " + this.priimek + " " +222: this.leto_vpisa + " (" + this.vpisna_st + ");223: }224: }

    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", "Starina", 2000, "2304");229: Clan b = new Clan("Mojca", "Mavko", 2001, "4377");230: Clan c = b;231: c.ime = "Andreja";

    232:

    Clan d = b.Kopija();233:234: Console.WriteLine("Clan a"); a.Izpis();235: Console.WriteLine("Clan b:\n" + b.Opis());236: Console.WriteLine("Clan c:\n" + c.Opis());237: Console.WriteLine("Clan d"); d.Izpis();238: Console.ReadLine();239: }240: }

  • 7/23/2019 C# Objektno

    37/240

    C# . NET

    Programiranje 1 VS Informatika

    37

    Zgledi

    Datum

    Denimo, da v naih programih pogosto delamo z datumi.Zato bomo sestavili ustrezni razred. Najprej

    moramo pripraviti nart razreda. Odloiti se moramo torej, kako bi hranili podatke o datumu. Podatki, kisestavljajo datum, so:o dan (tevilo)o mesec (izbira: tevilo ali pa niz)o Leto (tevilo)

    Denimo, da se odloimo, da bomo dan in leto hranili kot tevilo, mesec pa kot niz (torej kot januar, februar, ...).Sedaj se moramo odloiti, katere metode bo poleg konstruktorjev poznal na razred. Nekaj idej:

    o Lepo izpiio Poveaj za 1 dano Je datum smiseleno Je leto prestopnoo Nov datum za toliko in toliko dni pred/za danim datumomo Dan v tednuo ...

    Potem, ko smo si pripravili nart, se lotimo sestavljanja razreda

    RAZRED DATUM

    241: public class Datum {242: public int dan;243: public string mesec;244: public int leto;245: public Datum() {246: dan = 1;247: mesec = "januar"248: leto = 2000;

    249: } // privzeti datum je torej 1.1.2000

    Dodajmo e dva konstruktorja250: public Datum(int leto) : this() {251: this.leto = leto; // this je nujen252: } // datum je torej 1.1.leto253: public Datum(int d, string m, int l) : this(l)254: { // leto smo e nastavili255: this.mesec = m; // this ni nujen256: this.dan = d;257: } // datum je torej d.m.l

    Sedaj se lahko lotimo metod. Kot prvno, nas zanima, ali je leto prestopno258: public bool JePrestopno() {259: int leto = this.leto;260: if (leto % 4 != 0) return false;261: if (leto % 400 == 0) return true;262: if (leto % 100 == 0) return false;263: return true;264: }

    Vejih teav ni bilo. No, verjetno bolj uporabna pa bop metoda, ki bo dani datum poveala za en dan. Topomeni, da bomo objektu, nad katerim bomo metodo izvedli, poveali dan za 1. Potem pa se lahko zaplete, sajs tem lahko naredimo neobstoje datum, recimo32. Januar. Sveda ne smemo pozabiti na prestopna leta.

    Lotimo se metode

  • 7/23/2019 C# Objektno

    38/240

    C# . NET

    Programiranje 1 VS Informatika

    38

    265: public void PovecajZaEnDan() {266: dan = dan + 1;267: if (dan < 29) return;268: if (dan == 29 && mesec != "februar") return;

    269: if (dan == 29 && mesec == "februar" && this.JePrestopno()) return;270: // lahko nehamo, mesec in leto sta ok271: string[] meseciPo30 = {"april","junij","september", "november"};272: if (dan == 31) {273: if (meseciPo30.IndexOf(mesec) > 0){274: mesec = mesec + 1;275: if (mesec == 13) {276: mesec = 1;277: leto++;278: }279: return;280: }

    281: // e je 32 dni, je zagotovo

    Ko privandramo do sem, pa ugotovimo da imamo teave. Vrstica 34 je pa napana (sintaktino sicerpravilna, a pomensko povsem zgreena). Ker v spremenljivki mesec hranimo niz, bi mora li namestopoveanja za 1 vzeti naslednje ime meseca. Tudi vrstica 35 je narobe .... Ko e enkrat premislimo, vidimo, da bi lo z manj truda, e bi si tudi za mesec namesto imena meseca rajezapomnili kar tevilko. e elimo datum videti z imeni mesecev pa za to lahko poskrbimo denimo ob izpisu.Zato se spodobi lotiti stestavljanja razreda datum znova. Vendar to, kot tudi preostale metode z naegaspiska, prepustimo bralcu v izziv.

    Denimo, da smo razred Datum uspeno naredili. Sedaj pa ga e koristno uporabimo. Denimo, da elimougotoviti, e je letonje leto prestopno. Dovolj bo, e le naredimo objekt, v katerega shranimo katerikoliletonji datum in pokliemo pripravljeno metodo JePrestopno().

    JE LETONJE LETO PRESTOPNO282: using MojiRazredi;283: public class JeLetosPrestopnoLeto {284: Datum danes = new Datum(22, 1, 2008);285: if (danes.jePrestopno()) {286: Console.WriteLine("Je prestopno leto");287: } else {288: Console.WriteLine("Ni prestopno leto");289: }290: }

    Fibonaccijevo zaporedjeV naravi vekrat opazimo zanimive vzorce. Tako e gremo teti koliko je zrn v posamezni spirali sonninegacveta pa tudi npr v tevilu lusk ananasa, brovega stora, semen na jagodi ... dobimo zanimivo zaporedje, ki gaimenujemo Fibonnaccijevo zaporedje.

    Fibonaccijeva tevila definiramo z zaetnima pogojema (prvo in drugo tevilo sta enaka 1) ter z rekurzivnoformulo (n-to Fibonaccijevo tevilo je vsota prejnjih dveh) . S temi podatki lahko izraunamo vsa ostala tevila. Fibonaccijevo zaporedje je torej 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

    e zaetna pogoja spremenimo (rekurzivno pravilo pa ostane isto), dobimo posploena Fibonaccijeva tevila. esi npr. za prvo tevilo izberemo 3 in za drugo -1 dobimo zaporedje tevil 3, -1, 2, 1, 3, 4, 7, 11...

    Sestavimo razred PosploseniFibonacci, ki bo vseboval metodo public int VrniNto(int n), ki boizraunal n-to posploeno Fibonaccijevo tevilo. Razred naj vsebuje dva konstruktorja:

    publicPosploseniFibonacci() - ta naj za zaetni pogoj postavi pogoj za obiajna

    Fibonaccijeva tevila.

  • 7/23/2019 C# Objektno

    39/240

    C# . NET

    Programiranje 1 VS Informatika

    39

    public PosploseniFibonacci(int prvo, int drugo)- temu podamo vrednostiprvega in drugega posploenega Fibonaccijevega tevila.

    e torej ustvarimo objekta PosploseniFibonacci fibo = new PosploseniFibonacci()inPosploseniFibonacci splosni = new PosploseniFibonacci(3, -1)nam klica metodfibo.VrniNto(4)in splosni.VrniNto(4)vrneta 3 oz. 1.Hraniti bo potrebno zaetna lena

    RAZRED POSPLOENIFIBONACCI

    291: public class PosploseniFibonacci {292: public int prvo;293: public int drugo;294:295: public PosploseniFibonacci() {296: this.prvo = 1;297: this.drugo = 1;298: }

    299:300: public PosploseniFibonacci(int p, int d) {301: this.prvo = p;302: this.drugo = d;303: }Metoda bo enostaven primer uporabe rekurzije

    304: public int VrniNto(int n) {305: if (n == 1) return this.prvo;306: if (n == 2) return this.drugo;307: return this.VrniNto(n 2) +308: this.VrniNto(n 1);309: }

    Tako, konali smo. A ni nam preve ue hitrost tega naega razreda. Bi lo hitreje? Zelo pogosto potrebujemoprvih 20 lenov Fibonnacijevega zaporedja, ostala pa bolj redko. Kaj storiti, da izboljamo odzivnost?Naj objekt hrani tabelo prvih 20 lenov, e potem uporabimo VrniNto(i) in je i

  • 7/23/2019 C# Objektno

    40/240

    C# . NET

    Programiranje 1 VS Informatika

    40

    329: }330: }

    Vaje

    Kochova rta

    Sestavi metodo, ki s pomojo rekurzije izrauna dolino vodoravne Kochove rtestopnje N, ki jo nariemo odkoordinate x1 do koordinate x2.Na osnovi prejnje metode sestavi metodo, ki izrauna dolino Kochove rte, ki greod toke T1 s koordinatami (x1,y1) do toke T2 s koordinatami (x2, y2). Namig:sestavi metodo, ki ima 5 parametrov: n, x1, x2, y1 in y2.

    Razred Toka in Kochova rta

    Pri prvi podtoki naloge 1 se koordinati x in y nista "drali" skupaj. Zato sestavirazred, ki vsebuje koordinato x in y in metodo iz naloge 1 prepii tako, da bo imelatri parametre: n (stopnjo rte), T1 in T2 (ki sta tipa Tocka, ki si ga ravno sestavil).

    Ulomek

    Sestavite razred Ulomek in napiite metodo, ki ustvari tabelo nakljunih ulomkov stevci med 1 in 10 ter imenovalci med 1 in 10. Velikost tabele naj bo parametermetode. Nato napiite e eno metodo, ki v tabeli ulomkovpoie najveji ulomek.e tretja metoda pa naj zna izpisati ulomek. Vse skupaj pa zloite v program, ki vtabeli nakljunih ulomkov velikosti 20 izpie vse ulomke, ki so (matematino) enaki

    najvejemu ulomku. e je npr. najveji ulomek 2/4, naj program izpie (seveda,e so v tabeli) tudi vse pojavitve ulomkov 1/2, 3/6, 5/10in 4/8.

    Razred Majica

    Sestavite razredMajica, ki hrani osnovne podatke o majici:

    o velikost: tevilo med 1 in 5,o barvo: poljuben niz ino ali ima majica kratke ali dolge rokave.

    Razred mora tudi poznati metode za nastavljanje in branje teh vrednosti.Podpisi teh metod naj bodo:

    o public int VrniVelikost()ter public voidSpremeniVelikost(int velikost)

    o public string VrniBarvo()ter public voidSpremeniBarvo(string barva)

    o public boolean ImaKratkeRokave()ter public voidNastaviKratkeRokave(boolean imaKratkeRokave)

    Napii testni program, ki naredi tabelo 100 razlinih majic. Potem prepii totabelo v datoteko tako, da podatke o vsaki majici zapie v svojo vrstico.

  • 7/23/2019 C# Objektno

    41/240

    C# . NET

    Programiranje 1 VS Informatika

    41

    Nato razred Majica dopolni s konstruktorjem, ki kot parameter dobi niz vtakni obliki, kot si podatke zapisal na datoteko in v skladu s podatki v temnizu nastavi ustrezne podatke o majici.

    Testni program potem dopolni tako, da potem, ko si podatke o majicahzapisal na datoteko, naredi novo tabelo 100 majic, ki pa podatke o tehmajicah prebere s pravkar ustvarjene datoteke.

    Celotni program zakljui s tem, da napie e metodo, ki preveri, e sta obetabeli enaki!

    Razred Zajec

    Denimo, da piemo program, ki bo pomagal upravljati farmo zajcev. Zavsakega zajca poznamo serijsko tevilko, spol in maso.

    Sestavi razred Zajec, ki vsebuje komponente:

    spol//vrednost true, e je zajec mokega spola in false, e enskega(kaj hoete, moki ovinisti ...)

    masa//masa zajca v kilogramih (tip double) serijska//serijska tevilka zajca (tip String)

    Sestavi program, ki naredi tri zajce s teami, ki so nakljuna tevila med 1.2in 5.5. Izpii vse tri tee zajcev. Enemu poveaj njegovo teo za 2kg. Izpii

    serijsko tevilko najlajega zajca.

    Razred Kolega

    Sestavi razred Kolega, ki ima tri komponente:

    ime priimek telefonska tevilka

    Vse tri komponente naj bodo tipa String in javno dostopne.

    Napiikonstruktor:

    ki vse tri komponente nastavi na "NI PODATKOV".

    Sestavi testni program, v katerem ustvari dva objekta tipa Kolega. Obaobjekta tudi izpii na zaslon.

    Uporaba razreda Kolega

    Napii program, ki sestavi tabelo 10ih objektov tipa Kolega, preberetelefonsko tevilko in izpie tiste objekte iz tabele, ki imajo tako telefonskotevilko. e takega objekta v tabeli ni, naj se izpie: "Noben moj koleganima take telefonske tevilke."

  • 7/23/2019 C# Objektno

    42/240

    C# . NET

    Programiranje 1 VS Informatika

    42

    Uporaba razreda Zajec

    Sestavi program, ki ustvari farmo zajcev (tabelo n zajcev) in med njimiizpie:

    1. najtejega2. najcenejega3. vse zajklje4. najtejega samca

    Datum

    Denimo, da v naih programih pogosto delamo z datumi.Zato bomo sestaviliustrezni razred. Vsebuje naj le dva konstruktorja.

    Zajci z datumom

    Razred Zajec nadgradi tako, da bo za vsakega zajca tudi hranil datum, klose je skotil in datum, ko je bil zadnji pregledan.

    Uporaba razreda Zajec z datumom

    Ustvari farmo zajcev in na njej poii vse tiste zajce, ki v tem koledarskem letu e niso bili pregledani. Nato paizpii e tiste zajklje, ki so bile se skotile v obdobju enega leta (torej med 23. 1. 2007 in 22. 1. 2008.

    Nadgradimo datum

    Razred Datum nadgradimo tako, da naj poleg kostruktorjev pozna naslednjemetode

    Lepo izpii Poveaj 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 ...

    Dostop do stanj objektaMonost, da neposredno dostopamo do stanj/lastnosti objekta ni najbolji! Glavni problem je v tem, da na tanain ne moremo izvajati nobene kontrole nad pravilnostjo podatkov o objektu! Tako lahko za naega zajcarjavkav programu mirno napiemo

    rjavko.masa = -3.2;

    Ker ne moremo vedeti, ali so podatki pravilni, so vsi postopki (metode) po nepotrebnem bolj zapleteni, oziroma

    so nai programi bolj podvreni napakam. Ideja je v tem, da naj objekt sam poskrbi, da bo v pravilnem stanju.Seveda potem moramo tak neposreden dostop do spremenljivk, ki opisujejo objekt, prepreiti.Dodatna teava pri neposrednem dostopu do spremenljivk, ki opisujejo lastnosti objekta se pojavi , e moramokasneje spremeniti nain predstavitve podatkov o objektu. S tem bi "podrli" pravilno delovanje vseh starih

    programov, ki bi temeljili na prejnji predstavitvi.

  • 7/23/2019 C# Objektno

    43/240

    C# . NET

    Programiranje 1 VS Informatika

    43

    Torej bomo, kot smo omenjali e v uvodu, objekt res imeli za "rno katlo", torej njegove notranje zgradbe nebomo "pokazali javnosti". Zakaj je to dobro? e malo pomilsimo, uporabnika razreda pravzaprav ne zanima,kako so podatki predstavljeni. e podamo analogijo z realnim svetom:

    Ko med vonjo avtomobila prestavimo iz tretje v etrto prestavo, nas ne zanima, kako so prestave

    realizirane. Zanima nas le to, da se stanje avtomobila (prestava) spremeni. Ko kupimo nov avtonam je naeloma vseeno, e ima ta drugano vrsto menjalnika, z drugano tehnologijo.Pomembno nam je le, da se nain prestavljanja ni spremenil, da e vedno v takih in takohokoliinah prestavimo iz tretje v etrto prestavo.

    S "skrivanjem podrobnosti" omogoimo, da e pride do spremembe tehnologije se za uporabnika se stvar nespremeni. V naem primeru programiranja v C# bo to pomenilo, da e spremenimo razred (popravimoknjinico), se za uporabnike razreda ne bo ni spremenilo.Denimo, da so v C# 3.0 spremenili nain hranjenja podatkov za doloanje nakljunih tevi v objektih razredaRandom. Ker dejansko nimamo vpogleda (neposrednega dostopa) v te spremenljivke, nas kot uporabnike

    razreda Random ta sprememba ni ne prizadane. Programe e vedno piemo na enak nain, kliemo istemetode. Skratka - ni potrebno spreminjati programov, ki razred Random uporabljajo .e posebej je pomembno,da programi, ki so delovali prej, e vedno delujejo (morda malo bolje, hitreje, a bistveno je, da delujejo enako). In e enkrat .- s tem ko "ne dovolimo" vpogleda v zgradbo objekta, lahko poskrbimo za zaito prednedovoljenimi stanji. Do sedaj smo spremenljivke, ki opisujejo objekt, kazali navzven (imele so doloilo public).To pomeni, da uporabnik lahko neposredno dostopa do teh spremenljivk in morebiti objekt spravi v nemogoestanje:

    mojAvto.prestava = -10;

    Dostopi do stanj

    Do sedaj smo pisali programe tako, da smo naredili objekt. Ko smo eleli v objekt zapisati kak podatek, smouporabili zapis

    ime_objekta.stanje = ;

    DOSTOP DO PODATKOV

    331: public class TestClan{332: public static void Main(strin