Predstavitev se nalaga. Prosimo počakajte.

Predstavitev se nalaga. Prosimo počakajte.

Objekti, razredi, ... Od kje in zakaj.

Podobne predstavitve


Predstavitev na temo: "Objekti, razredi, ... Od kje in zakaj."— Zapis predstavitve:

1 Objekti, razredi, ... Od kje in zakaj

2 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

3 Knjižnica razredov Do sedaj Knjižnice razredov
Razredi za uporabo znotraj nekega programa Knjižnice razredov

4 Komentarji // - vrstični komentar /* ... */ : splošen komentar
/// dokumentacijski komentar Glej npr:

5 Razred Zajec Prevedemo
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

6 Uporaba razreda Zajec Program, kjer delamo z zajci:
Potrebuje datoteko MojiRazredi.dll (ker vsebuje definicijo razreda Zajec) Napovemo uporabo te datoteke Project / Add reference

7 Uporaba razreda Zajec Program, kjer delamo z zajci: using MojiRazredi;
Če 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 rjavko je naslov, kje je novo ustvarjeni zajec (objekt)

8 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 = " "; z1.spol = false; z1.masa = 0.12; z1.masa = z1.masa + 0.3; Console.WriteLine("Zajec ima ser. št.:" + z1.serijska); }

9 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 = " " + 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

10 Še končni pogled na naslove
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 ... spol: masa: serijska: tabZ

11 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;

12 Povzetek Definicija razreda Običajno v knjižnici!
public class ImeRazreda { public podatkovni tip element1; public podatkovni tip element2; public podatkovni tip elementn; }

13 Povzetek Uporaba razreda Ustvari prostor in pove, kje ta prostor je
Č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

14 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();

15 Razred Zajec Zajca “ustvarimo” z new
public class Zajec { public String serijska; public boolean spol; public double masa; // konstruktor 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”; } 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?

16 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.

17 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

18 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 pa objC. To "zamenjavo" dosežemo z this. Napišemo Console.WriteLine("Starost je: " + this.starost); Ob prvem klicu this pomeni objA, ob drugem pa objC.

19 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

20 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?

21 Preobteževanje Več metod z enakim imenom Preobteževanje
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! Tip rezultata

22 Podpisi metod Podpis metode: Kaj je lahko sočasno:
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 double NekaMetoda(double x) public static int NekaDrugaMetoda(double y)

23 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

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

25 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;


Prenesi ppt "Objekti, razredi, ... Od kje in zakaj."

Podobne predstavitve


Oglasi od Google