250 likes | 386 Views
Classes & objects – klase I objekti. Klasa je vezana za problematiku klasifikacije i apstrakcije jer defini še zajednička svojstva i funkcionalnosti velikog broja različitih objekata Ljudsko mišljenje se bazira na pojmovima koji se u softveru predstavljaju klasama
E N D
Classes & objects – klase I objekti • Klasa je vezanazaproblematikuklasifikacije i apstrakcijejerdefiniše zajednička svojstva i funkcionalnosti velikog broja različitih objekata • Ljudsko mišljenje se bazira na pojmovima koji se u softveru predstavljaju klasama • Smisao svake klase je u tome da obuhvata različite objekte koji se sreću u realnosti • Ideja primene klasa u softveru je višestruka i svodi se na razne vrste pojednostavljenja • Pri modelovanju stvarnosti, tj. stvarnih problema za koje se piše softver, koriste se klase objekata koji zaiste postoje i koji su bitni za razmatranu problematiku • Klase omogućavaju kreiranje nezavisnih celina u softveru koje se po potrebi mogu menjati nezavisno od drugih delova softvera čime se olakšava održavanje i izmene što je neophodno u svakom softveru
Enkapsulacija kao koncept kod klasa • Dve prethodno pomenute osnovne uloge klasa u razvoju savremenog softvera – modelovanje grupe srodnih objekata i modularnost u razvoju softvera se ogledaju u konceptu enkapsulacije • Klase se posmatraju kao celine koje se koriste na određeni način, pre svega korišćenjem funkcionalnosti klase koje su na raspolaganju • Pri tome nije bitna implementacija funkcija u klasi već korišćenje tih funkcija • Ukoliko je to potrebno, implementacija funkcija se može promeniti, a da način korišćenja klase ostane sasvim isti • Takođe, podaci koje klasa koristi mogu biti skriveni ili dostupni korisnicima samo preko funkcija koje se koriste za ažuriranje • Sakrivanje ovih informacija u samoj klasi predstavlja enkapsulaciju • Princip enkapsulacije je da se korisnicima klase otkrije samo neophodni minimum informacija o klasi koje su neophodne za uspešno korišćenje klase, tj. za ono za šta je klasa namenjena
Jednostavna definicija klase • class Circle • { • double Area() • { • return Math.PI * radius * radius;//Math je statička klasa • } • int radius; • } • Ključna reč class se koristi kod definicije klase iza čega sledi naziv klase – Circle • Sve komponente klase – podaci (radius) i metode (Area) se nalaze unutar bloka koda kojim se definiše klasa
Korišćenje klase – kreiranje objekata i rad sa objektima • Circle c; // Create a Circle variable • c = new Circle(); // Initialize it • c je objekat korisnički definisane klase Circle • Sa new se objekat klase –c inicijalizuje • Ključna reč new je neophodna zbog razlike u inicijalizaciji objekta i dodele vrednosti kod prostih tipova – objekat c nema prostu vrednost • Za c se može reći i da predstavlja objektnu promenljivu • Objekat predstavlja instancu – primerak date klase • Klasa je opšta definicija objekta, neka vrsta šablona na osnovu koga se može kreirati neograničen broj različitih objekata
Private and public članovi klase • class Circle • { • public double Area() • { • return Math.PI * radius * radius; • } • private int radius; • } • Sa private i public se reguliše pravo korišćenja članova klase (podaci i metode) od strane korisnika klase (spoljašnji svet) • Članovi klase označeni sa private su nedostupni korisnicima klase, dok su članovi označeni sa public dostupni korisnicima klase • Unutar klase, svakom metodu klase su dostupni svi članovi klase bilo da su private ili public • Da bi se private podatak član radius mogao koristiti neophodno je modifikovati definiciju klase – promeniti private u public ili uraditi nešto drugo
Preporučeno imenovanje klase i elemenata klase • Po pravilu se koriste mala slova za imenovanje identifikatora, dok se korišćenje velikih slova posebno naglašava • Ime klase treba da počinje sa velikim slovom – klasa Circle • Imena javnih – public članova klase treba da počinju sa velikim slovom – metod Area() • Imena privatnih članova klase treba da imaju sva mala slova – podatak radius tipa int • Privatni konstruktori klase koji predstavljaju metode moraju da imaju identično ime kao i klasa – dakle da počinju velikim slovom ipak, što je izuzetakodpravilazaimenovanjeprivatnihčlanovaklase, alisamo u tom slučaju– za privatne konstruktore klase
Konstruktori klase • Objekti se kreiraju sa ključnom reči new • U memoriji se rezerviše prostor za objekat koji uključuje prostor za sve podatke članove – u zavisnosti od tipova podataka, posle čega se vrši inicijalizacija podataka članova • Inicijalizaciju podataka članova vrši konstruktor – specijalan metod klase koji ima potpuno isto ime kao i klasa, nema povratnu vrednost – čak ni void i može da bude preklopljen • Svaka klasa mora da ima konstruktor. Ako se ne definiše, automatski se kreira podrazumevani konstruktor
Konstruktori klase • Umesto podrazumevanog konstruktora koji se automatski kreira, može da se definiše novi podrazumevani konstruktor kao javni metod koji ima isto ime kao i klasa, ne vraća vrednost i nema argumente • class Circle • { • public Circle() // default constructor • { • radius = 0; • } • public double Area() • { • return Math.PI * radius * radius; • } • private int radius; • }
Preklapanje konstruktora • Circle c; // deklaracija objekta c • c = new Circle(); //kreiranje objekta c • double areaOfCircle = c.Area(); //poziv metoda Area • Promenljivoj areaOfCircle tipa double dodeljuje se vrednost koju vraća metod Area objekta c • Članovima klase – podacima i metodima se pristupa preko objekta korišćenjem operatora . (tačka) c.Area(); • Treba definisati još jedan konstruktor koji će podatak član radius inicijalizovati na neku željenu vrednost različitu od nule
class Circle • { • public Circle() // default constructor • { • radius = 0; • } • public Circle(int initialRadius) // overloaded constructor • { • radius = initialRadius; • } • public double Area() • { • return Math.PI * radius * radius; • } • private int radius; • }
Korišćenje preklopljenog konstruktora • Circle c; //deklaracija objekta • c = new Circle(45);//inicijalizacija objekta • Na osnovu poziva konstruktora – argumenata koji se navode, zna se koja se verzija preklopljenog konstruktora poziva • Ako korisnik eksplicitno definiše bilo koji konstruktor, onda se automatski ne kreira podrazumevani konstruktor, pa u tom slučaju mora da se eksplicitno definiše podrazumevani konstruktor (bez argumenata)
Partial classes • Postoji mogućnost da se definicija klase podeli u više različitih file-ova • Definicija dela klase se označava sa ključnom reči partial • partial class Circle • { • public Circle() // default constructor • { • radius = 0; • } • public Circle(int initialRadius) // overloaded constructor • { • radius = initialRadius; • } • } • partial class Circle • { • public double Area() • { • return Math.PI * radius * radius; • } • private int radius; }
Statički metodi i podaci • C# zahteva da se kod piše isključivo u klasi, tj. svi metodi moraju pripadati nekoj klasi • U nekim slučajevima nema mnogo smisla da se kreiraju objekti neke klase da bi se pozvali odgovarajući metodi preko objekata • Primer je klasa Math koja sadrži metode za razne matematičke funkcije • Očekivani poziv bi bio ovakav: • Math m = new Math(); • double d = m.Sqrt(42.24); • Poziv kvadratnog korena je preko objekta m - Math
Statički metodi i podaci • Međutim, malo je neobično kreirati objekat tipa Math, iz prostog razloga što takav objekat nije potreban • Zato su sve metode za implementaciju matematičkih funkcija u klasi Math statičke, što znači da se mogu zvati direktno preko imena klase, bez potrebe da se kreiraju objekti klase • class Math • { • public static double Sqrt(double d) { ... } • ... • } • Znači, treba ovako: • double d = Math.Sqrt(42.24);
Statički metodi i podaci • Statički metodi imaju pristup samo podacima članovima klase koji su takođe deklarisani kao statički • To je logično, jer podaci članovi koji nisu statički sadrže vrednosti koje pripadaju kreiranim objektima • Pošto se statički metodi mogu pozvati bez objekata, onda ne mogu ni da pristupe podacima koji nisu statički, jer nema objekta • Smisao statičkih podataka je da sadrže podatke na nivou klase, tj. podatke koji su deljeni između svih objekata – zajednički za sve objekte date klase
class Circle • { • public Circle() // default constructor • { • radius = 0; • NumCircles++; • } • public Circle(int initialRadius) // overloaded constructor • { • radius = initialRadius; • NumCircles++; • } • ... • private int radius; • public static int NumCircles = 0; • } • Korišćenje – pristup statičkom podatku članu: • Console.WriteLine(“Number of Circle objects: {0}”, Circle.NumCircles);
Statički metodi i podaci • Statički podaci mogu biti i konstantni, što znači da im se vrednost ne menja u toku izvršavanja programa • class Math • { • ... • public const double PI = 3.14159265358979323846; • } • Čitava klasa takođe može da bude statička što znači da može da ima samo statičke članove – podatke i metode • public static class Math • { • public static double Sin(double x) {...} • public static double Cos(double x) {...} • public static double Sqrt(double x) {...} • ... • }
Anonimne klase • Anonimne klase – bez imena se implicitno deklarišu • var myAnonymousObject = new { Name = “John”, Age = 42 }; • Novoj klasi se ne zna ime, ima dva polja Name i Age • Var rešava problem nepoznavanja imena klase • Korišćenje objekta anonimne klase: • Console.WriteLine(“Name: {0} Age: {1}”, myAnonymousObject.Name, myAnonymousObject. • Age); • var anotherAnonymousObject = new { Name = “Diana”, Age = 43 ); • anotherAnonymousObject = myAnonymousObject;
Ograničenja anonimnih klasa • Mogu da sadrže samo public podatke – promenljive • Podaci moraju biti inicijalizovani • Podaci ne mogu biti statički • Ne mogu da imaju metode