Utisci korisnika

Veoma sam zahvalna na Vašem brzom odgovoru i želela bih da Vam se zahvalim na pažnji koju ste pokazali. Radica Nedelčev - Beograd

Pre nepunih mesec dana kupila sam paket kurseva: PRIPREME ZA POLAGANJE CAMBRIDGE INTERNATIONAL DIPLOMA IN BUSINESS. Obično neki opšti utisak formiramo na kraju, ali ja u ovom trenutku želim sa…


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: Core Windows Forms Technologies

Modul: Kreiranje objekata u C#

Autor: Marko Stojićević

Naziv jedinice: Klase i objekti


Materijali vezani uz ovu lekciju:

- Test klase i objekti
- Klase i objekti (PDF dokument)



Definisanje klase

Klasa predstavlja apstraktnu predstavu skupa objekata koji imaju iste osobine. Sastoji se od atributa i metoda. Atributi i metode se nazivaju članice klase.Objekat predstavlja konkretan primerak- instancu klase. Klasu treba shvatiti kao skicu na osnovu koje će kasnije biti kreirani objekti. U nastavku je prikazana klasa AutomatNovca koja ima dva javna atributa imePrezime i stanje.

public class AutomatNovca
{
      public string imePrezime;
      public double stanje;
}

Da bi se klasa definisala koristi se ključna reč class ispred imena klase. Preporuka je da ime klase počinje velikim slovom. Ako se ime klase sastoji iz više reči tada svaka sledeća reč počinje velikim slovom. Klasa je korisnički definisani tip.

Instanciranje klase , tj. kreiranje objekata klase vrši se upotrebom službene reči new. Funkcija koja se nalazi iza ključne reči new naziva se podrazumevani konstruktor i kao što joj samo ime kaže služi za konstruisanje objekata. Atributima objekta pristupa se preko operatora .("tačka"). Ovde je kreiran objekat označen sa an.

AutomatNovca an = new AutomatNovca();
an.imePrezime = "Pera Peric";
an.stanje = 12345.67;

 

Metode klase

Metoda klase je funkcija - članica klase. Svaka metoda treba da definiše tip podataka koji vraća ili ukoliko metoda ne vraća ništa onda se povratni tip metode označava sa void. Ukolika metoda vrća neku vrednost onda se unutar tela metode koristi službena reč return. Svaka metoda ima svoje ime. Uobičajeno da ime metode počinje malim slovom. Metoda može imati listu parametara ili može biti bez parametara. Metoda prikazana u primeru ima ime podizanjeNovca, ima jedan ulzni parametar tipa double i vraća rezultat tipa double.

public double podizanjeNovca(double iznos)
{
      stanje -= iznos ; // stanje = stanje - iznos
      return stanje ;
}

Metoda se koristi za postavljanje vrednosti atributa stanje (koji se nalazi unutar iste klase kojoj pripada i metoda podizanjeNovca). Prevedeno na poslovnu terminologiju stanje na računu se samnjuje za podignuti iznos.

 

Primer klase

Data je definicija klase AutomatNovca koja služi za rad sa nekim tekućim računom. Klasa ima dva atributa imePrezime i stanje, gde atribut stanje predstavlja stanje na računu korisnika čije je ime i prezime sadržano u atributu imePrezime. Klasa ima dve metode uplata i podizanjeNovca. Svakom uplatom povećava se stanje na računu korisnika za određeni iznos a svakim podizanjem novca vrednost na računu se smanjuje.

public class AutomatNovca
{
      public string imePrezime;
      public double stanje;           

      // metoda uplata
      public void uplata(double iznos)
      {
            stanje += iznos;
      }

      // metoda podizanjeNovca
      public double podizanjeNovca(double iznos)
      {
            stanje -= iznos ; // stanje = stanje - iznos
            return stanje ;
      }
}

 

Pozivanje metode

Da bi se metoda klase pozvala potrebno je napraviti objekte te klase a zatim se metodi klase pristupa korišćenjem operatora .("tačka"). Ovo važi za tzv. javne metode klase, odnosno metode uz koje stoji službena reč public. Ovde je kreiran tekući račun tj. objekat klase AutomatNovca za korisnika pod imenom "Mika Mikic" . Zatim su izvršene dve uplate na račun korisnika pozivanjem metode uplata. Obratiti pažnju da metoda uplata ima ulazni parametar tipa double i da ne vraća nikakvu vrednost. Na kraju je izvršeno jedno podizanje novca korišćenjem metode podizanjeNovca. Ova metoda ima ulazni parametar tipa double i vraća rezultat tipa double. Rezultat izvršavanja metode je prihvaćen u promenljivoj tipa double pod nazivom trenutniIznos.

AutomatNovca an1 = new AutomatNovca();
an1.imePrezime = "Mika Mikic";

// uplate na racun
an1.uplata(12345.23);
an1.uplata(1000);

// podizanje novca i racunanje preostalog iznosa
double trenutniIznos = an1.podizanjeNovca(456);

 

Definisanje konstruktora

Konstruktor je specijalna metoda klase koja se koristi za kreiranje objekata tj. instanciranje te klase. Konstruktor ima isto ime kao i klasa. Konstruktor ne vraća nijedan tip, čak ni void. Ukoliko se unutar klase ne definiše konstruktor onda okruženje obezbeđuje podrazumevani (default) konstruktor. Podrazumevani konstruktor nema parametre. Može se iskoristiti za inicijalizaciju atributa klase prilikom kreiranja objekata. Pored podrazumevanog konstruktora moguće je definisati i tzv. parametarske konstruktore. U jednoj klasi se može definisati veliki broj konstruktora.

U nastavku je dat primer definisanja podrazumevanog i parametarskog konstruktora:

// podrazumevani konstruktor

public AutomatNovca()
{
     imePrezime = null;
     stanjeNaRacunu = 100;
}

// parametarski konstruktor

public AutomatNovca(string ime, double stanje)
{
     imePrezime = ime;
     stanjeNaRacunu = stanje;
}

Kada se u klasi definišu metode koje imaju isto ime a različit potpis tj. listu ulaznih parametara onda se kaže da je izvršen overloading metode. Kada se u klasi definiše više konstruktora radi se o overloading-u konstruktora.

 

Poziv konstruktora

U primeru je prikazan način poziva parametarskog i podrazumevanog konstruktora. Prilikom pozivanja parametarskog konstruktora, atributi odgovarajućeg objekta koji je konstruisan bivaju inicijalizovani.

AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);
an.uplata(100);

Kod podrazumevanog konstruktura to nije slučaj već se atributi objekta inicijalizuju pristupanjem preko operatora .("tačka").

AutomatNovca an1 = new AutomatNovca();
an1.imePrezime = "Jovan Jovanovic";
an1.stanjeNaRacunu = 20000;

 

Predavanje parametara po vrednosti

Ponovo je kreiran deo klase AutomatNovca koja ima atribut stanjeNaRacunu. Da bi se ilustrovalo predavanje parametara po vrednosti nekoj funkciji, napravljena je metoda vratiStanjePrekoParametaraVred koja ima jedan ulazni parametar tipa double. Unutar tela metode se vrednost tog ulaznog parametra inicijalizuje na vrednost atributa stanjeNaRacunu. Pokušava se da se metodi prosledi neka promenljiva po vrednosti tako da ona posle izvršavanja te metode sadrži vrednost atributa stanjeNaRacunu. Objekat klase AutomatNovca  označen sa an je kreiran primenom paremetarskog konstruktora tako da su atributi tog objekta inicijalizovani. Metodi vratiStanjePrekoParametaraVred je prosleđena promenljiva trenutoStanje koja je prethodno inicijalizovana na vrednost nula.

public class AutomatNovca
{
      public double stanjeNaRacunu ;
      .......
      .......
      // predavanje parametar preko vrednossti
      // metoda clanica klase AutomatNovca

      public void vratiStanjePrekoParametaraVred(double stanje1)
      {
            stanje1 = stanjeNaRacunu ;
      }
      ............
      .............
}

AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);

double trenutoStanje = 0;
an.vratiStanjePrekoParametaraVred( trenutoStanje);

Ako se sada odštampa vrednost promenljive trenutno stanje da li će njena vrednost biti jednaka vrednosti atributa stanjeNaRacunu?

 

Rezultat predavanja paremetara po vrednosti

Promenljiva trenutnoStanje će i posle pozivanja metode imati vrednost 0. Razlog toga je što se unutar f-je vratiStanjePrekoParametaraVred kreira lokalna kopija promenljive trenutnoStanje , dok sama promenljiva ostaje ne promenjena. Dakle ako se želi promena vrednosti spoljašnje promenljive (koja nije članica klase) tada je ne treba prosleđivati metodi klase po vrednosti.

 

Predavanje parametara po referenci

Spoljašnji objekat ili promenljiva koja je argument funkcije se može promeniti samo ako se predaje po referenci. Predavanje vrednosti po referenci vrši se korišćenjem službene reči ref. Tada se prilikom pozivanja metode ne pravi lokalna kopija promenljive već se radi sa referencom na objekat. Referencu treba shvatitia kao nadimak (engl. alias) za stvarni objekat i sve što se dešava sa referencom dešava se i sa stvarnim objektom.

 

Primer predavanja parametara po referenci

Pri pozivu metode kojoj se promenljiva prosleđuje po referenci se takođe koristi službena reč ref. Promenljiva trenutoStanje prethodno inicijalizovana na nulu se prosleđuje po referenci. Posle izvršavanja ove metode vrednost promenljive trenutoStanje se menja.

double trenutnoStanje = 0;
an.vratiStanjePrekoParametaraRef(ref trenutoStanje);

Promenljiva koja se prosleđuje po refrenci mora biti inicijalizovana. Ukoliko se ne želi prethodna inicijalizacija promenljive koja će biti predata po referenci onda se koristi službena reč out.

 

Objekat kao argument funkcije

Objekti klase se uvek predaju nekoj funkciji po referenci, što znači da objekat može promeniti vrednost svojih atributa ako se preda nekoj funkciji. U nastavku je prikazana klasa Omotac koja ima samo jedan atribut tipa double, objekti ovakve klase se često nazivaju "umotani double".

public class Omotac
{
     public double omotacStanja ;
     public Omotac()
     {
           omotacStanja = 5 ;
     }
}

Unutar klase AutomatNovca je sada napravljena metoda koja kao ulazni parametar ima objekat klase Omotac. U telu metode se njegovom atributu omotacStanja dodeljuje vrednost atributa stanjeNaRacunu klase AutomatNovca.

public void vratiStanjePrekoObjekta(Omotac om)
{
     om.omotacStanja = stanjeNaRacunu ;
}

 

Primer prosleđivanja objekta kao argumenta funkcije

AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);
Omotac umotaniDouble = new Omotac();
........
an.vratiStanjePrekoObjekta(umotaniDouble);
Console.WriteLine("Sada umotana promenljiva ima vrednost " +
umotaniDouble.omotacStanja);

U primeru su najpre instancirane klase AutomatNovca i klasa Omotac. Objekat klase Omotac označen sa umotaniDouble  se prosleđuje metodi vratiStanjePrekoObjekta. Zbog činjenice da se objekti prosleđuju po referenci atributi objekta umotaniDouble  se menjaju što se može proveriti štampanjem vrednosti atributa na standardnom izlazu.

 

Funkcija koja vraća objekat

Unutar klase se može napraviti metodakoja kao povratnu vrednost ima objekat neke druge klase. To je slučaj i ovde sa metodom vratiObjekat unutar klase AutomatNovca. Ova metoda vraća objekat klase Omotac. Unutar tela metode se vrednost jedinog atributa ove klase setuje na vrednost stanjeNaRacunu klase AutomatNovca. Iščitavanjem vrednosti atributa vraćenog objekta se može pročitati vrednost atributa stanjeNaRacunu klase AutomatNovca.

public Omotac vratiObjekat()
{
     Omotac tOm = new Omotac();
     tOm.omotacStanja = stanjeNaRacunu ;
     return tOm ;
}

 

Statički članovi klase

Statički članovi klase pripadaju klasi a ne objektima klase. Inicijalizuju se pre nego što se kreira instanca klase. Pristupa im se preko imena klase. Statički mogu biti i atributi i metode klase. Svi objekti klase dele statičke članove klase. Deklarišu se korišćenjem službene reči static. Dat je primer upotrebe statičkog člana klase.

public class AutomatNovca
{
      public string imePrezime;
      public double stanjeNaRacunu;
      public static int brojRacuna = 0;
      public AutomatNovca()
      {
            brojRacuna ++ ;
      }
      ........
}

Atribut brojRacuna je statički što znači da ga dele svi objekti klase AutomatNovca. U konstruktoru klase AutomatNovca inkrementira se ovaj statički član. Kad god se kreira objekat klase AutomatNovca inkrementira se statički član brojRacuna tako da je vrednost ovog člana u svakom trenutku jednaka broju kreiranih objekata klase AutomatNovca tj. broju kreiranih tekućih računa.

 

Upotreba statičkog člana

Statički član se inicijalizuje na vrednost 20 pre kreiranja objekata klase. Zatim se kreiraju dva objekta klase AutomatNovca. Sada je vrednost statičkog člana 22.

// inicijalizacija statickog clana pre kreiranja objekata
AutomatNovca.brojRacuna = 20 ;

// kreiranje objekata
// pri kreiranju svakog objekta inkrementira se staticki clan     

AutomatNovca an1 = new AutomatNovca();
AutomatNovca an2 = new AutomatNovca();                     
Console.WriteLine(AutomatNovca.brojRacuna);

// rezultat : brojRacuna = 22

 

Definisanje prava pristupa članovima klase

Korišćenjem modifikatora može se definisati pravo pristupa članovima klase unutar aplikacije.

Tabela 1: Prava pristupa

Kod public prava pristupa, pristup nije ograničen. Svaka druga klasa može pristupati javnim članovima date klase.

Privatnim članovima klase mogu pristupati samo drugi članovi te iste klase. Internal pravo pristupa je ograničeno na prostor imena. Kod protected prava pristupa pristup je ograničen na članove pripadajuće klase kao i na članove klase koja je izvedena iz te klase.

 

Svojstva (Properties)

Svojstva su članovi klase koji omogućavaju pristup člnovima objekta neke klase. Svojstva se prave da bi se korisniku olakšao pristup privatnim članovima klase. Privatnom članu klase se ne može pristupiti spolja preko operatora tačka. Da bi se pročitala vrednost privatnog člana potrebno je napraviti javnu metodu članicu klase koja to može da uradi , pa mu se pristupa indirektno preko pristupne odnosno aksesorske metode. Slično je i sa setovanjem vrednosti privatnog člana. Property ili svojstvo u sebi objedinjuje ove dve funkcionalnosti. On ima get deo pomoću kga se čita vrednost privatnog člana i set deo pomoću koga se setuje vrednost privatnog člana. Oznaka stanjeNaRacunu = value  označava da će promenljiva stanjeNaRacunu biti setovana na vrednost sa desne strane jednakosti. Properti ima povratni tip kao i promenljiva za koju se pravi. Obično se označava velikim početnim slovom. Uočiti da property nema male zagrade kao metoda.

public class AutomatNovca
{
      public string imePrezime;
      private double stanjeNaRacunu;     

      // property za privatnu promenljivu stanjeNaRacunu

      public double Stanje
      {
            get
            {
                  return stanjeNaRacunu;
            }
            set
            {
                  stanjeNaRacunu = value ;
            }
      }          
}

 

Korišćenje Property-ja

U nastavku je ilustrovana upotreba propertija Stanje definisanog u prethodnom primeru. Kada se napiše izraz an.Stanje = 23000 koristi se set deo propertija stim što je value = 23000. Ukoliko posle pozivanja propertija nema znaka jednakosti i izraza na desnoj strani koristi se get deo propertija.

AutomatNovca an = new AutomatNovca();
an.imePrezime = "Pera Peric";

// an.stanjeNaRacunu = 23000;
// ne radi jer je atribut stanjeNaRacunu privatan

// koristim set property(value = 23000)
an.Stanje = 23000 ;                 

// sada koristim get property da procitam stanje

Console.WriteLine("Korisnik  " + an.imePrezime + " " + "ima na racunu : " + an.Stanje + "  dinara");


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:3


Molimo Vas unesite svoje podatke i dobićete pristup besplatnim lekcijama.

Ime: 
Prezime: 
Email: