27
Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in Ministrstva za šolstvo in šport. Fakulteta za matematiko in fiziko http://up.fmf.uni- lj.si 1 Objekti, razredi, ... Od kje in zakaj

Objekti, razredi,

  • Upload
    meris

  • View
    52

  • Download
    4

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

1

Objekti, razredi, ...

Od kje in zakaj

Page 2: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si2

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

Page 3: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

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) { MojR prvi; prvi = new MojR("Pozdravljen, moj prvi objekt v C#!"); prvi.Izpisi(); } }}

3

Page 4: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Knjižnica razredov• Knjižnice razredov

4

Page 5: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

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

5

Page 6: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si6

Razred Zajecpublic 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

Page 7: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si7

Uporaba razreda Zajec• Program, kjer delamo z zajci:

– Potrebuje datoteko MojiRazredi.dll (ker vsebuje definicijo razreda Zajec)– Napovemo uporabo te datoteke

Project / Add reference

Page 8: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si8

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

Page 9: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si9

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)

Page 10: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si10

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

}

}

Page 11: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si11

Razred Zajecpublic 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

S tipom Zajec lahko "počnemo vse", torej tudi ustvarimo tabelo spremenljivk tipa Zajec

Page 12: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

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

12

spol: masa:serijska:

tabZ

Page 13: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si13

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;

Page 14: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Povzetek• Definicija razreda

– Običajno v knjižnici!public class ImeRazreda {

public podatkovni tip element1;

public podatkovni tip element2;

…public podatkovni tip elementn;

}

14

Page 15: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

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

15

Page 16: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si16

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

Page 17: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si17

Razred Zajecpublic 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?

Page 18: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si18

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.

Page 19: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si19

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

Page 20: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

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.

20

Page 21: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si21

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

Page 22: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si22

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?

Page 23: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si23

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

Page 24: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si24

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)

Page 25: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si25

Konstruktorji razreda Zajecpublic 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

Page 26: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sklicevanje na konstruktorjepublic Zajec(string ser, bool sp, double t) : this(ser){

this.spol = sp; this.masa = t;

}

26

Page 27: Objekti, razredi,

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si27

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;