objekti, razredi,
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 PresentationTRANSCRIPT
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
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
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
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
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
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
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
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
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)
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);
}
}
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
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
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;
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
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
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();
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?
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.
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
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
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
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?
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
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)
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
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
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;