Objekti - gradnja

Objekti - gradnja

Avtor: Matija Lokar

Ustvarjanje objektov

  • Razred je šablona, ki definira spremenljivke in metode skupne vsem objektom iste vrste.
  • class

    • Načrt objekta, šablona
  • Primerek razreda (instanca) – konkretni objekt

    • Ustvarimo ga z new
    • Brez tega objekta NE MOREMO uporabiti
    • NekiObjekt a;

      • Objekt NE obstaja
      • a je IME objekta
      • natančneje

        • a je ime spremenljivke, kjer hranimo NASLOV objekta vrste NekiObjekt

Problem

  • Banka Butale se intenzivno pripravlja na prihod nove valute arve
  • Med drugim bo potrebno nakovati nove kovance
  • Za ustrezno informacijsko podporo kovačnici najamejo tebe
  • Po nekajmesečnih pogovorih ugotoviš:

    • Potrebovali bomo objekte vrste Kovanec
    • Potrebujemo torej razred Kovanec

Kako do svojega razreda

Na tržišču ni niti približno ustreznega razreda

Naredimo razred

  • Analiza:

    • Pa ne matematični predmet
    • Katera so stanja/lastnosti:

      • Kaj hočemo o objektih te vrste vedeti
      • Kakšne lastnosti imajo
    • Katere so metode:

      • Kakšno je “znanje” objektov
      • Na katere “ukaze” se odzovejo

Naredimo razred

  • Predstavitev razreda (class)

    • Način predstavitve lastnosti objekta (podatke o objektu) skrijemo:

      • private
      • enkapsulacija
    • Odločitev o načinu predstavitve
    • Pisanje metod
  • Preverjanje delovanja posameznih metod

    • Pisanje testnih programov, s katerimi preverimo, ali se posamezna metoda obnaša na predpisan način
  • S pomočjo ustreznih orodij izdelamo dokumentacijo (na podlagi dokumentacijskih komentarjev)

Okostje razreda


public class Razred {
  // deklaracija lastnosti - komponent - polj - ...

  // konstruktorji


  // metode


  // ToString


}

Razredi in objekti

  • Sestavimo razred Kovanec , s katerim predstavimo kovance.
  • Naredimo analizo:

    • Denimo, da so kovanci okrogli, z danim polmerom in višino. Poleg konstruktorjev in standardnih metod, ki nastavijo in vrnejo vrednosti lastnosti in za pretvorbo v niz, naj razred pozna še metodi, ki vrneta površino in volumen kovanca.
  • Odločitev o načinu predstavitve podatkov

    • Kje, kako bomo podatke (polmer, višina) hranili

Kovanec


public class Kovanec {

  private int polmer;
  private int visina;

  // konstruktorji
  public Kovanec() {}
  public Kovanec(int r, int v) {}                   le navedba metod

  // "SET" metode
  public void NastaviPolmer(int r) { }
  public void NastaviVisino(int visina) { }

  // "GET" metode
  public int PovejPolmer() { }
  public int PovejVisino() { }

  // ToString
  public override string ToString() { } // kako je objekt “videti” kot niz

  // "znanje"
  public double Volumen() { }
  public double Povrsina() { }

}

Kovanec


public class Kovanec {
  private int polmer;
  private int visina;

  // konstruktorji
  ...

  // metode
  public void NastaviPolmer(int r) {                    le skica
      this.polmer = r;
  }

  public void NastaviVisino(int visina) {
      // smiselna visina je le med 1 in 100
      // drugace jo pustimo pri miru
      if ((1 <= visina) && (visina <= 100))
         this.visina = visina;
  }

  public int PovejPolmer() {
     return this.polmer;
  }

  public int PovejVisino() {
     return this.visina;
  }

  public override string ToString() {
     return “r = “ + this.PovejPolmer() + “\nvisina = “ +  this.PovejVisino();
  }
 }

Uporaba

  • Državna kovnica te najame, da napišeš program, ki reši naslednji problem
  • Ali lahko iz bakrenega kvadra velikosti 20 x 12 x 30 naredimo n "običajnih" kovancev?

    • Če bi res poskusili rešiti zadevo (iz kvadra izrežemo n "valjčkov – kovancev") gre za težak problem. Zato ga poenostavimo.
    • interpretacija odgovorov (DA/NE)

      • ne: nikakor to ne gre
      • da: mogoče, ni pa nujno
  • new Kovanec() ustvari nov, “običajni” kovanec.

Kovanci


public static Drzava {
  public static void Main(string[] a) {
    int kvader_x = 20;
    int kvader_y = 12;
    int kvader_z = 30;
    int volumenKvadra = kvader_x * kvader_y * kvader_z;
    Console.Write("Koliko kovancev potrebujemo: ");
    int n = int.Parse(Console.ReadLine());
    Kovanec en = new Kovanec();
    int volKovanca = en.Volumen();
    if (volumenKvadra > n * volKovanca) Console.WriteLine("DA");
    else Console.WriteLine("NE");
  }
}

Uporaba

  • Državni zakladnik spremeni dimenzije "običajnih" kovancev. Je potrebno spremeniti tvoj program? Kje so potrebne spremembe?
  • Razrede sestavljamo tako, da uporabniki tega razreda niso prizadeti ob morebitnih spremembah razredov

    • Glave metod pustimo enake (podpis + tip rezultata + način dostopa)
    • Uporabniški programi ostanejo enaki
    • Potrebujejo le nove datoteke (dll) z opisom razreda
    • Za uporabnika se s tem ne spremeni nič!

Razred Kvader

  • Geometrijsko telo
  • Podatki

    • Komponente
    • opisujejo stanje objekta
  • Metode

    • Konstruktorji (posebne metode)

      • Kaj se zgodi ob new
    • “znanje” objektov tega razreda

      • volumen, površina, ...
    • Metode za ravnanje s podatki

      • Nastavi podatek
      • Vrni podatek
    • ToString
(14.jpg)

Kvader - podatki

  • Podatki:

    • Stranice: a, b, c
    • Odločitev o načinu predstavitve

      • Kako bo imel objekt predstavljene stranice
      • Ena od možnosti:

        • 3x spremenljivka tipa int
      • Druga možnost

        • Tabela s tremi polji
      • Tretja možnost: ….
  • private int a; // stranica a

Zakaj enkapsulacija?

  • Način predstavitve uporabnika NE zanima – s private mu preprečimo dostop
  • Kako potem do podatkov:

    • Pripravimo ustrezne metode
  • Če se podpisi metod ne spreminjajo – ni težav s spreminjanjem razreda

    • Vsi programi, ki uporabljajo objekte določenega razreda, si podatke izmenjujejo le preko metod
    • Če se klic ne bo spremenil, je vseeno, kako je spremenjen razred!

Kvader – metode za delo s podatki

  • Za podatke za katere je smiselno, da jih uporabnik vidi:

    • Metode, ki povejo vrednost podatka
    • PovejA(), …
  • Za podatke za katere je smiselno, da jih uporabnik spremeni:

    • Metode, ki spremenijo vrednost podatka
    • Možnost kontrole
    • StranicaA(), …

Kvader - konstruktorji

  • Standardno – konstruktor brez parametrov
  • Naredi “privzeti” objekt
  • Denimo – kvader s stranicami
    1 x 1 x 1

  • public Kvader(){
      this.a = 1;
      this.b = 1;
      this.c = 1;
    }
  • Kaj pa, če bi uporabniku radi ponudili več možnosti “začetnega” kvadra?

Kvader - konstruktorji

(19a.jpg) (19b.jpg)
(19c.jpg)

const

  • // minimalna dolzina stranice
  • public const int MIN_DOL_STR = 1;
  • // maksimalna dolzina stranice
  • public const int MAX_DOL_STR = 100;

ToString

  • Metoda, ki se uporabi avtomatično, če moramo objekt spremeniti v niz
  • Vedno obstaja (dedovanje), a verjetno nekoristna
  • Zato običajno – sestavljamo sami

public override string ToString() {
  return "Kovanec# r: " + polmer + "h: " + visina;
}

ToString


override public string ToString(){
       // Metoda vrne podatek v obliki Kvader: a x b x c
       return "Kvader: " + PovejA() + " x " + PovejB() + " x "
                         + PovejC();
       /* tudi znotraj razreda se splaca uporabljati metode za
          delo s podatki
          ceprav imamo neposreden dostop do spremenljivk, saj
          nam ob morebitni
          spremembi predstavitve ni potrebno toliko popravljati! */
 }

Ustvarjanje razredov: povzetek

  • Konkretni objekt je primerek nekega razreda
  • Nastane z new

    • Izjema: string
    • Ni izjema, le drugačen zapis!
    • Podobno tabele z inicializacijo
  • Posamične lastnosti objekta

    • Dostop: private
    • Uporabnika ne zanima način hranjenja lastnosti objekta
  • Metode za delo s podatki/lastnosti

    • VrniPodatek, NastaviPodatek
  • Konstruktorji

    • Kaj se zgodi ob kreaciji novega podatka

Povzetek

  • Komponente (lastnosti) imajo dostop private
  • konstruktorji
  • metode, s katerimi nastavljamo vrednost (set)
  • preverjanje pravilnosti (stanje objekta mora biti ves čas pravilno)

    • pozor pri konstruktorjih
  • metode, s katerimi vračamo vrednost (get)
  • ToString
  • ostale metode

Ustvarjanje razredov: povzetek

  • ToString

    • Da objekt pretvorimo v niz
    • Za “predstavitev” objekta
  • Metode

    • Namenjene uporabnikom: public
    • “interne” (pomožne) metode: private
  • Več metod z enakim imenom

    • Preobteževanje (overloading)
0%
0%