Objekti, razredi, ...

Objekti, razredi, ...

Avtor: Matija Lokar

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

Knjižnica razredov

Knjižnice razredov

(4a.png) (4b.png)

Komentarji

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
(7a.png) (7b.png)

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
(8a.png) (8b.png)

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)
(9.png)

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);
   }
}
(10.png)

Razred Zajec

(11.jpg)

Š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 .
(12.jpg)
  • 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;

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

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

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) (int = 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;
0%
0%