Ključna reč this

this ključna reč označava tekući primerak (objekt) neke klase. Koristi se za pristup članovima klase unutar klase. Recimo kada argumenti metode imaju isti naziv kao i članovi atributi.

class Tacka
{
    private double x{get; set;}
    private double y {get; set;}

    public Tacka(double x, double y)
    {
       this.x = x;
       this.y = y;
    }  
    
    ...
}

Zadatak: u prethdnom zadatku vezanom za geometrijske figure implementirati ključnu reč this.

Indexer

class Predemt
{
   string naziv;
   int[] ocene = new int[5];            

   public int this[int index]
   {
       set
       {
           ocene[index] = value;
       }

       get
       {
            return ocene[index];
       }
    }     
 }

static void Main(string[] args)
{
    Predemt p1 = new Predemt();
    p1[0] = 5;
    p1[1] = 3;
    p1[2] = 8;

    Console.WriteLine("{0}  {1}  {2}",p1[0],p1[1],p1[2]);
    Console.ReadKey();
}

Indexeri su specijalne metode slične Get i Set metodama. Mogu da se koriste u slučaju kada je član klase niz elemenata.  Omogućavaju da se nizu elemenata pristupa preko naziva objekta i operatora []. Osnovna razlika jeste da Indexer ima argumente. Za definisanje indexera se koristi ključna reč this.

class Predemt
{
    string naziv;
    List<int> ocene = new List<int>();            
    
    public int this[int index]
    {
       set
       {
           ocene.Insert(index,value);
       }

       get
       {
           return ocene[index];
       }
     }     
}
static void Main(string[] args)
{
    Predemt p1 = new Predemt();
    p1[0] = 5;
    p1[1] = 3;
    p1[2] = 8;

    Console.WriteLine("{0}  {1}  {2}",p1[0],p1[1],p1[2]);
    Console.ReadKey();
}

Statički atributi

Statičke promenljive se kreiraju pomoću ključne reči static. Statičke promenljive se dele među svim kreiranim objektima neke klase. Jedan od primera njihove upotreba jeste da u njima čuvamo informaciju o ukupnom broju kreiranih objekata. Ove promenljive moga da se koriste i u metodama koje nisu statičke i u statičkim metodama. 

private static int broj;

static public int Broj
{
    get
    {
        return broj;
    }

    set
    {
        broj = value;
    }
} 

Statički atributi i konstante

Konstante su u suštini statični atributi. To je iz razloga jer konstante isto imaju istu vrednost za sve objekte klase. Ako predstavljaju javno svojstvo klase pristup konstantnim vrednostima van klase se ostvaruje preko naziva klase. Razlika je u tome što statični atributi mogu da menjaju vrednost a konstante ne.

Konstante ne mogu da se definišu pomoću ključne reči static!!!

private const double pi = 3.14;
static public  double PI
{
    get
    {
        return pi;
    }  
}

Statičke metode  se kreiraju pomoću ključne reči static. Ukoliko je ovim metodama dodeljen modifikator pristupa public onda se njima može pristupiti bez toga da se napravi neki objekat klase već samo na osnovu naziva klase. Unutar ovakvih metoda mogu da se koriste samo statične funkcije i promenljive. Ukoliko je potrebno da se u okviru njih pristupi metodama i promenljivima koje nisu statičke potrebno je kreirati objekat klase pa onda preko tog objekta je  moguć pristup elementima klase koji nisu statički.

Statičke metode 

public static Tacka NajblizaCentru(Tacka[] niz)
{
    Tacka Min = niz[0];
    double min = Math.Sqrt(Math.Pow(Min.x, 2) + Math.Pow(Min.y, 2)), distance;
    foreach (Tacka tacka in niz)
    {
       distance = Math.Sqrt(Math.Pow(tacka.x, 2) + Math.Pow(tacka.y, 2));
       if (min > distance)
       {
             Min = tacka;
             min = distance;
       }
     }
     return Min;
 }
 
//Potrebno je još inicijalizovati niz tacaka!!!  
Tacka[] niz = new Tacka[20];
Tacka.NajblizaCentru(niz);    

Napomena statičke klase su one klase kod kojih su svi elementi tih klasa statički i moraju na taj način da se definišu. Definišu se pomoću ključne reči static.

static class Test
{
//Svi elementi klase su staticni i pristupa im se preko naziva klase
}

Privatni konstruktor sadrži u svojoj definiciji modifikator pristupa private i ima smisla definisati private konstruktor u slučaju kada se želi da se spreči kreiranje objekta neke klase van klase jer privatni konstruktor to sprečava. Privatni konstruktor može da bude podrazumevani, parametrizovani i kopije. Kada se koristi privatni konstruktor  nema smisla definisati neke druge vrste javnih konstruktora (sem statičkog konstruktora). Korišćenje ovog kostruktora ima smisla ili kod singleton klasa ili kada interfejs klase čine statičke metode. Telo konstruktora ne mora da bude prazno. To ima smisla ukoliko se unutar same klase kreira objekat te klase pa je potrebno inicijalizovati vrednosti nestatičkih atributa klase.

//Primer:
private Tacka()
{

}

Statički konstruktor

Služi da bi se inicijalizovale vrednosti statičkih atributa klase. Poziva se samo jedanputa ili kada se kreira prvi objekat neke klase koji ima statičke atribute ili kada se prvi put koristi neki od statičkih elemenata klase. Može da bude ugrađen ili podrazumevan. Ovaj konstrukotor se uvek poziva prvi pre konstruktora koji kreira nestatičke elemente klase!!!

Za razliku od ostalih konstruktora ovaj konstruktor ne može da se pozove direktno već samo posredno. Iz ovog razloga on ne sadrži argumente niti modifikator pristupa.

//primer
public static double PI;

static Krug(){
   Console.WriteLine("zauzimanje prostora za statičku promenljive 
                      i njena inicijalizacija!!!");
   PI = 3.14;
}

Veze između klasa i objektima klasa

1) Asocijacija je jedna od osnovnih veza između klasa opisuje odnos između dve ili više klasa.

 

Svaka asocijacija se definiše preko tri elementa:

    • Kardinalnost – koliko objekata jedne klase su atributi druge klase i obrnuto
    • Navigacija (smer) – da li su samo objekti jedne klase atributi druge klase (unidirekciona veza) ili su istovremeno i objekti druge klase atributi prve klase (bidirekciona veza)
    • Naziv (uloga) – naziv relacije među objektima recimo relacija vlasništva 

Kompozicija klase

 

Kompozicija je određeni tip asocijacije između klasa i koncept u objektno-orijentisanom programiranju. U kompoziciji, jedan objekat (poznat kao "deo") je čvrsto povezan sa drugim objektom (poznat kao "celina") na način da deo postoji samo unutar celine

 

Primeri kompozicije:

- Automobil i Motor
- Kuća i Sobe
- Mobilni Telefon i Baterija
- Računar i Matična Ploča
- Avion i Motori

class Krug
{
    private const double PI = 3.14;
    public double r { get; set; }
    public Krug(double r)
    {
        this.r = r;
    }

    public double Obim()
    {
        return 2 * r * PI;
    }
    
    public double Povrsina()
    {
        return Math.Pow(r, 2) * PI;
    }
}

class Pravougaonik
{
   public double a { get; set; }
   public double b { get; set; }
   public Pravougaonik(double a , double b)
   {
      this.a = a;
      this.b = b;
   }

   public double Obim()
   {
       return 2*a+2*b;
   }

   public double Povrsina()
   {
        return a*b;
   }
}

Primer: kreirati klasu valjak na osnovu klasa pravougaonik i krug.

class Valjak
    {
        const double PI = 3.14;
        private Krug baza;
        private Pravougaonik omotac;

        public Valjak(double r, double h)
        {
            baza = new Krug(r);
            omotac = new Pravougaonik(baza.Obim(), h);
        }
        public double ROsnove()
        {
            return baza.r;
        }

       
  public double Visina()
  {
      return omotac.b;
  }

   public double Povrsina()
   {
      return 2 * baza.Povrsina() + omotac.Povrsina();
   }

   public double Zapremina()
   {
      return baza.Povrsina() * Visina();
   }

}

Zadatak 1:Napraviti klasu pravilna četvorostrana piramida na osnovu klasa kvadrat i jendakostranični trougao pomoću kompozicije klasa. Testirati rad klase.

Zadatak 2:Napraviti klasu trostrana prizma na osnovu klasa pravougaonik i trougao pomoću kompozicije klasa Testirati rad klase.

 

Domaći

Napraviti klasu školski predmet koja će da sadrži atribute naziv, zaključna ocena i lista ocena koja predstavlja klasu. Klasa ocena se sastoji od dva atributa opis i brojcana ocena. Modelujte klase tako da može da se daju ocene, prikažu ocene, izmene ocene i zaključi ocena

Agregacija predstavlja poseban tip asocijacije gde se jedan objekat ("celina") sastoji od više drugih objekata ("delova"). Agregacija ima karakteristike koje omogućavaju da delovi postoje nezavisno od celine. 

Primeri agregacije:

- Automobil i Točkovi
- Škola i Učenici
- Računar i Periferne Jedinice
- Biblioteka i Knjige.
- Zoološki Vrt i Životinje

Veza zavisnosti (ili veza korišćenja) u objektno-orijentisanom programiranju označava odnos između klasa kada jedna klasa koristi funkcionalnost ili usluge druge klase, ali te klase nisu čvrsto povezane. Na primer kada metoda neke klase može da koristi objekat neke druge klase kao svoj argument ili povratnu vrednost ili lokalnu promenljivu. (veza zavisnosti ili veza korišćenja)

Primer 1:
Klasa štampač korsiti klasu dokument preko relacije korišćenja.
Primer 2:
Klasa za Slanje Emailova i Klasa za Autentifikaciju
Primer 3:
Klasa krug koristi usluge klase Math za korišćenje konstante PI i funkcije za stepenovanje

class Singleton
{
    private static Singleton instance = null;

    private Singleton()
    {
    }

    static Singleton()
    {
          instance = new Singleton();
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

Singleton klase su klase koje dozvoljavaju da se formira samo jedan objekat klase.  Singleton klasa mora da ima privatni konstruktor i mora da ima statički atribut  koji predstavlja objekat te klase .

Polimorfizam

Reč polimorfizam je grčkog porekla i znači da se nešto (pojam posmatranja) pojavljuje u više različitih oblika. (POLI – više, FORMA - oblik)

 

Polimorfizam je konteksno (isti objekat posmatranja se ponaša različito u zavisnosti od okolnosti) zavisno ponašanje.

U zavisnosti od uslova, objekat posmatranja će različito da se ponaša.

Primeri polimorfizma
1)	Polimorfizam promenljive
	a)	
        char c;
        c=’a’;
        c+=5;
Promenljiva c može da se ponaša
i kao karakter i kao ceo broj.
	b)	
        int x;
        scanf(“%d“,&x);
        if(x)...
U programskom jeziku C promenljiva 
može da se ponaša i kao ceo broj i kao logička promenljiva.

2.

Polimorfizam funkcija (preklapanje (overloading) funkcija) –u istom programu, u istoj klasi u različitim klasama mogu da se jave funkcije sa istim nazivom. Dve različite funkcije sa istim nazivom nazivaju se preklopljene funkcije. Ograničenje u radu sa preklopljenim funkcijama je u tome da se one moraju razlikovati po ulaznim argumentima ili po broju ili po tipu ukoliko su definisane u okviru iste klase. Nepisano pravilo kod preklopljenih funkcija je to da funkcije treba da obavljaju sličan posao tj. da imaju sličnu semantiku.

Primer 1: funkcija zbira celih i realnih brojeva

static int Zbir(int a, int b)
{
    return a + b;
}

       
static float Zbir(float a, float b)
{
    return a + b;
}

static void Main(string[] args)
{
    int a = 5;
    int b = 7;
    float c = 8.8f;
    float d = 6.7f;
    Zbir(a, b); //poziva se funkcija za sabiranje celih brojeva
    Zbir(c, d); //poziva se funkcija za sabiranje realnih brojeva
}
Primer 2: Površina pravougaonika i kruga

static double Povrsina(double a, double b)
{
    return a*b;
}

static double Povrsina(double r)
{
   return Math.Pow(r,2)*Math.PI;
}

static void Main(string[] args)
{
    double a = 3.7;
    double b = 8.2;
    double r = 5.3;
            
    Povrsina(a, b); //poziva se funkcija za racunanje povrsine pravougaonika
    Povrsina(r); //poziva se funkcija za racunanje povrsine kruga
}

3.

Polimorfizam klasa. Da bismo mogli da koristimo neku već definisanu klasu prilikom pisanja programa moramo da navedemo imenski prostor u kojem je ona definisana. Mogu da postoje klase sa istim nazivom ali je važno da se nalaze u okviru različitog imenskog prostora. U okviru istog imenskog prostora ne mogu da postoje klase sa istim nazivom!! Ove klase ćemo razlikovati tako što će se prilikom njihovog poziva navesti i imenski prostor u kojem se nalaze.

Polimorfizam


Preklapanje operatora (overloading) na primeru klase Complex (klasa kompleksnih brojeva)

Objasniti šta je i kada se koristi i opšti oblik definicije metode

Preklopiti sledeće operatore:

+ - sabiranje dva kompleksna broja

- - oduzimanje dva kompleksna broja

* - množenje dva kompleksna broja

/- deljenje dva kompleksna broja

== - ispitivanje jednakosti dva kompleksna broja

!= - ispitivanje nejednakosti dva kompleksna broja

^ - konjugovano kompleksni broj

3itsProgramiranje - OOP3

By lanik

3itsProgramiranje - OOP3

  • 867