280 likes | 447 Views
Objekti, razredi,. Od kje in zakaj. Združevanje podatkov. Denimo, da pišemo program, ki bo pomagal upravljati farmo zajcev Za vsakega zajca poznamo: serijsko številko spol težo Kako doseči, da se podatki “držijo” skupaj Tabela ni ustrezna Tabela je zbirka istovrstnih podatkov
E N D
Objekti, razredi, ... Od kje in zakaj
Združevanje podatkov Denimo, da pišemo program, ki bo pomagal upravljati farmo zajcev Za vsakega zajca poznamo: serijsko številko spol težo Kako doseči, da se podatki “držijo” skupaj Tabela ni ustrezna Tabela je zbirka istovrstnih podatkov Sestavimo razred Zajec Opis podatkov, ki sestavljajo poljubnega zajca
Moj prvi razred • Razredi za uporabo znotraj nekega programa • "lokalni" razredi • Kot prej (Console Application ...) namespace PrviOOP{ 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) { MojRprvi; prvi = new MojR("Pozdravljen, mojprviobjekt v C#!"); prvi.Izpisi(); } } }
Knjižnica razredov • Knjižnice razredov
Komentarji • // - vrstični komentar • /* ... */ : splošen komentar • /// dokumentacijski komentar • Glej npr: • 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 public class Zajec { public string serijska;public bool spol;public double masa; } S tem imamo napisan opis, kako je določen poljuben zajec Načrt, kakšni so zajci Ni to konkreten zajec Ni metode Main, dejansko se NIČ ne izvede, ... Ni namenjeno poganjanju kot program Hisa.cs Načrt, kako je videti hiša Kot ga je pripravil projektant Prevedemo Hisa.dll (naš zgled: MojiRazredi.dll) Še vedno načrt, kakšna naj bo hiša V obliki, kot ga lahko uporabijo tisti, ki bodo po tem načrtu izdelali konkretno hišo
Uporaba razreda Zajec Program, kjer delamo z zajci: Potrebuje datoteko MojiRazredi.dll (ker vsebuje definicijo razreda Zajec) Napovemo uporabo te datoteke Project / Add reference
Uporaba razreda Zajec Program, kjer delamo z zajci: Potrebuje datoteko ClassLibrary1.dll (ker vsebuje definicijo razreda Zajec) Napovemo uporabo te datoteke Okolje: Project / Add reference
Uporaba razreda Zajec Program, kjer delamo z zajci: using MojiRazredi; oziroma using ClassLibrary1; ... Če v programu potrebujemo konkretnega zajca, 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, kje ta konkretni zajec je Zajec rjavko = new Zajec(); V spremenljivki rjavko je naslov, kje je novo ustvarjeni zajec (objekt)
Dostop do podatkov v objektu rjavko.spol = true; rjavko.serijska = “BRGH_17_A”; rjavko.masa = 3.2; public class Zajčnik { public static void Main(string[] ar) { Zajec z1 = new Zajec(); z1.serijska = "1238-12-0"; z1.spol = false; z1.masa = 0.12; z1.masa = z1.masa + 0.3; Console.WriteLine("Zajec ima ser. št.:" + z1.serijska); } }
Razred Zajec S tipom Zajec lahko "počnemo vse", torej tudi ustvarimo tabelo spremenljivk tipa Zajec • public class FarmaZajcev { • public static void Main(string[] ar) { • Zajec[] zajci = new Zajec[10]; // na farmi imamo do 10 zajcev • int i = 0; • while (i < 10) { • zajci[i] = new Zajec(); // “rodil” se je nov zajec • zajci[i].serijska = "1238-12-" + i; • zajci[i].spol = false; • zajci[i].masa = 0.12; • i++; • } • ... • } • } Zajcev (objektov) še nimamo! – imamo le tabelo, kamor jih bomo shranjevali (ozroma kamor bomo shranjevali njihove naslove) V spremenljivki zajci je naslov, ki kaže na tabelo, ki lahko vsebuje naslove 10 objektov tipa Zajec
Še končni pogled na naslove tabZ spol: masa: serijska: • Potem bomo malček "popustili" ;-) • Zajec[] tabZ; • Ustvarili smo spremenljivko tabZ. V spremenljivki tabZ lahko shranimo naslov tabele, v katero bomo lahko shranjevali naslove objektov tipa Zajec. Trenutno v tej spremenljivki ni nobenega naslova. • tabZ = new Zajec[200]; • Operator new je nekje ustvaril tabelo, v kateri je prostor za 200 naslovov objektov, v katerih lahko shranimo podatke o posameznem zajcu. Naslov tega prostora za tabelo smo shranili v spremenljivko tabZ. • V tem trenutku ne obstaja še noben objekt tipa Zajec. • tabZ[0] = new Zajec(); • Operator new je nekje ustvaril prostor za objekt tipa Zajec. Naslov tega objekta se je shranil v 0-to celico tabele, katere naslov je shranjen v spremenljivki tabZ. • Seveda pa bomo govorili ... V tabeli tabZ je na mestu 0 zajec ...
Razred – shramba podatkov public class Ulomek { public int stevec; public int imenovalec;} Prevedemo in dobimo Ulomek.class Kaj sedaj? Uporabljamo v drugih programih (razredih) Ulomek x = new Ulomek(); Kako “napolniti” stevec in imenovalec? x.stevec : spremenljivka tipa int! x.imenovalec : enako x.stevec = 1; x.imenovalec = x.stevec + 1;
Povzetek • Definicija razreda • Običajno v knjižnici! public class ImeRazreda { public podatkovni tip element1; public podatkovni tip element2; … public podatkovni tip elementn; }
Povzetek • Uporaba razreda • Če potrebujemo primerek razreda • new ImeRazreda() • Ustvari prostor in pove, kje ta prostor je • Naslov prostora shranimo v neko spremenljivko (tipa ImeRazreda), denimo mojaSpTipaImeRazreda • Dostop do prostorov za hranjenje • Operator . • imeObjekta.elementi • imeObjekta.imeKomponente • mojaSpTipaImeRazreda.starost
Konstruktorji Ob tvorbi objekta bi radi nastavili začetno stanje spremenljivk in morda opravili še kaj – o tem kasneje Konstruktor – metoda, ki jo pokličemo ob tvorbi objekta z new Brez tipa rezultata! Ime kot je ime razreda Kličemo jo skupaj z new Klic: new Zajec();
Razred Zajec public class Zajec { public String serijska;public boolean spol;public double masa; // konstruktorpublic Zajec() { this.spol = true; // vsem zajcem na začetku določimo m. spol this.masa = 1.0; // in tehtajo 1kg this.serijska = “NEDOLOČENO”; } } Zajca “ustvarimo” z new new Zajec() Ustvaril se je konkreten zajec po navodilih iz konstruktorja Zajec() (ta zajec ima torej tri podatke z vrednostmi, kot je predpisano v konstruktorju) Kaj je this?
this this Pomeni objekt, ki ga "obdelujemo" V konstruktorju – objekt, ki ga ustvarjamo this.spol Lastnost/komponenta spol objekta, ki se ustvarja Zajec rjavko = new Zajec(); Zajec belko= new Zajec(); Pri prvem klicu se je v konstruktorju this nanašal na rjavko, pri drugem na belko.
this v ostalih metodah Kasneje – pisali bomo metode, ki se bodo uporabljale nad razredi Random ng = new Random(); Random g2 = new Random(); Console.WriteLine(ng.Next(1,10)); Kako so napisali kodo metode, da se je vedelo, da pri metodi Next mislimo na uporabo generatorja ng in ne na g2? Kako se v metodah razreda sklicati na ta objekt (objekt, nad katerim je izvajana metoda)? Razred MojRazred in v njem komponenta starost. Napišimo metodo MetodaNeka(), ki izpiše starost objekta, nad katerim izvajamo metodo. Klici bodo npr.: objA.MetodaNeka(), objC.MetodaNeka() Kako v postopku za MetodaNeka povedati, da gre Prvič za objekt z imenom objA drugič za objekt z imenom objC
this v ostalih metodah • Kako povedati, da naj se ob klicu objA.MetodaNeka() uporabi starost objekta objA, ob klicu objC.MetodaNeka() pa starost objekta objC? • Console.WriteLine("Starost je: " + ?????.starost); • Ob prvem klicu je ????objA, ob drugem paobjC. To "zamenjavo" dosežemo z this. Napišemo • Console.WriteLine("Starost je: " + this.starost); • Ob prvem klicu this pomeni objA, ob drugem pa objC.
Konstruktorji Če konstruktorja ne napišemo (kot ga nismo prej), 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
Več konstruktorjev Uporabniki bi poleg privzetega zajca, radi še možnost, da bi takoj, ko zajca naredijo, temu določili še serijsko številko. Radi bi torej konstruktor public Zajec(string serijskaSt) Poleg tega pa včasih na farmo dobijo tudi pošiljko samic. Torej potrebujejo še konstruktor public Zajec(bool spol) Včasih pa so zajci "nestandardni" public Zajec(string serijskaSt, bool spol, double teza) 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? Preobteževanje Overloading Velja tudi splošno, za vse metode Metode se morajo razlikovati ne v imenu, ampak podpisu Podpis metode Podpis: ime + število in tipi parametrov! public static int NekaMetoda(double x) Podpis (poenostavljeno): NekaMetoda_double Tip rezultata (return tip) NI del podpisa! public static int NekaMetoda(double x) Tip rezultata
Podpisi metod Podpis metode: public static int NekaMetoda(double x) Podpis: NekaMetoda_double “interno” ime public Zajec(string serijskaStev, bool spol, double masa) 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 začetku določimo m. spol this.masa = 1.0; // in tehtajo 1kg this.serijska = “NEDOLOČENO”; } public Zajec(string serijskaStev):this() { this.serijska = serijskaStev; } : this() – klic konstruktorja Zajec() Izvede se pred vsemi ukazi v konstruktorju
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 this. 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 "Prednost" ima bolj "lokalna" stvar – torej parameter spol = spol;