петак, 11. децембар 2015.

Klase u C# programskom jeziku


Klasa je šablon za objekat koji opisuje vrstu i količinu podataka koje će objekat sadržavati, ali ne predstavlja ni jedan određen primerak objekta. Tačnije, klase u osnovi predstavljaju šablone iz kojih se mogu stvarati objekti. Objekti sadrže podatke i metode za manipulisanje i pristup podacima, ali klasa određuje koje podatke mora da sadrži svaki konkretan objekat iako klasa sama ne sadrži nikakve podatke. Taj konkretan objekat uglavnom u literaturi se naziva primerak ili instanca. Inače klasa kao reč je nastala prema pojmu klasifikacija. Kada pravite klasu, vi uređujte članove klase u smisleni entitet. Za razliku od stuktura, klase vam daju mnogo veću fleksibilnost i više mogućnosti s obzirom da klase podržavaju nasleđivanje. Strukture su vrednosni tip podataka dok su klase referentni tip. Klase imaju ključnu ulogu u C# programskom jeziku i kodiraju se drugačije od klasa u C++ programskom jeziku. O klasama u C++ programskom jeziku možete pogledati ovde. Rad sa klasama u C# programskom jeziku je mnogo jednostavniji.



( Diagram članova klase u C# programskom jeziku ) 


Primer iz stvarnog sveta za klasu možete zamisliti i kao svojstva koja opisuju na primer tramvaj. Tramvaj ima motor, sedišta, kočnice, ponekad i klima uređaj; može da se vozi napred i nazad. Klasa opisuje sva svojstva i radnje koje jedan tramvaj poseduje ali klasa ne predstavlja ni jedan određen tramvaj. U stvarnom svetu tramvaj bi predstavljao objekat. S obzirom da postoje različiti tramvaji, znači da postoje i različiti objekti; ali svi bi objekti tramvaj bili prepoznati kao primerci klase tramvaj. Klase opisuju svojstva i ponašanje objekta preko članova. Članovi klase mogu biti polja, svojstva, metode i događaji. Klasu pravite tako što koristite ključnu reč class. Sintaksa za pravljenje klase je sledeća:

class ime_klase
{
         članovi_klase

}


Šta je enkapsulacija?



Enkapsulacija, enkapsuliranje što u prevodu znači zamotavanje je način da vi sakrijete, zaštitite i kontrolišete pristup podacima koji se nalaze u objektu. To radite tako što članovima klase odredite rang vidljivosti, tj. odredite koji članovi klase su na primer javni, privatni, zaštićeni ili interni. Na primer dok vi gledate realiti šou na TV, vas ne interesuje kako televizor prikazuje realiti šou. Vas interesuje da gledate program. Tako isto kad koristite objekte, bilo da su objekti vaši ili da je objekte neko drugi pravio; vi želite da objekti rade ono za šta su namenjeni, bez obzira koliki vi uvid imate u ono kako tačno objekat radi. Znači, enkapsulaciju koristite u vašim klasama kad hoćete da kontrolišete skrivenost članova klase koju će objekat da koristi.

Šta je polimorfizam?

Za razliku od struktura, klase možete nasleđivati. Nasleđivanje klasa nazivamo polimorfizam. Ako imate klasu osoba, onda nema potrebe da pišete ista svojstva za klasu student ili klasu zaposleni. Jednostavno ćete kreirati da klasa student nasledi klasu osoba i klasa student će naslediti sve članove klase osoba. Na taj način nema potrebe da dvaput pišete isti kod. Samo jednu stvar uvek morate da imate u vidu. Jedna klasa može da nasledi samo jednu klasu.

Primer kreiranja i korišćenja klasa u programu?

Analiziraćemo sledeći program Classes, kako bi ste razumeli kako se klase prave i koriste. Klase su same po sebi veoma kompleksna tema za učenje, sadrži mnoštvo novih i stranih pojmova isto kao što sadrži i mnoštvo mogućnosti. Tako da je ovaj primer samo mali i jednostavni deo onoga što zovemo klase. Osnovno što treba da znate kada kreirate klase u Visual Studio-u, to se radi preko Solution Explorer-a, desnim klikom miša na naziv projekta, zatim na Add i na Class. Vama se na taj način  omogućava da uvezete klasu u posebnom fajlu u vaš projekat sa istim nazivom kakav ste naziv dali klasi. Pogledajte sliku, kako da kreirate klasu. Posle vi izmenom koda određujete da li je klasa statična, javna ili nasleđuje neku klasu ili interfejse.


( Kreiranje klasa u Visual Studio 2015 )

Program Classes sadrži 3 klase. Prve dve klase, Person1 i Person2 su iste dve klase, to se nikad ne radi; ovde postoje u programu da bi ste videli kako su iskodirane na drugačiji način i znali razliku. Treća klasa je Student i ona je specifična po tome što nasleđuje klasu Person1. Pogledajte prvo kod celog programa kao celu celinu, da bi ga lakše analizirali.


class Person1
    {
       public string firstName;
       public string lastName;

       public string FullName()
       {
            return firstName + " " + lastName;

           
       }

   }

class Person2
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public string FullName()
        {
            return FirstName + " " + LastName;

        }

        public Person2 (string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;

        }

class Student : Person1
    {
        public string Department { get; set; } = "Mathematics";

    }

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Classes
{
    class Program
    {
        static void Main(string[] args)
        {
            bool correct = false;
            string firstName, lastName;
           
            do
            {
                Write("Your first name: ");
                firstName = ReadLine();

            } while (correct = String.IsNullOrWhiteSpace(firstName));

            do
            {
                Write("Your last name: ");
                lastName = ReadLine();

            } while (correct = String.IsNullOrWhiteSpace(lastName));

            Person1 person1 = new Person1();

            person1.firstName = firstName;
            person1.lastName = lastName;
                                   
            WriteLine( Environment.NewLine + "Person class with fields (variables):" + Environment.NewLine + person1.FullName());

            Person2 person2 = new Person2(firstName, lastName);
            WriteLine(Environment.NewLine + "Person class with the constructor and properties (auto-properties):" + Environment.NewLine + person2.FullName());

            Student student = new Student();

            student.firstName = firstName;
            student.lastName = lastName;

WriteLine(Environment.NewLine + "Student class inheritance Person1 class" + Environment.NewLine +
                                  "without input the department information:" + Environment.NewLine +
                                  student.FullName() + Environment.NewLine + student.Department);

            student.Department = "Informatics";

            WriteLine(Environment.NewLine + "Student class inheritance Person1 class" + Environment.NewLine +
                                 "where the department is inicialize with \"Informatics\"." + Environment.NewLine +
                                 student.FullName() + Environment.NewLine + student.Department);           
            ReadKey();

        }
    }
}

U prvoj klasi Person1 se koriste javne promenjive i samo sa njima vi već imate izgrađena fields-polja klase. Pored polja, klasa sadrži i samo jednu metodu koja vraća vrednost. I pored toga što bi ste pomislili da ova klasa nema konstruktor, ona ga u stvari ima kao podrazumevanog ali nije vidljiv u kodu tokom programiranja, već se dodaje vašem kodu prilikom kompiliranja. Kad god vi ne napišete konstruktor, kompajler će dodati vašoj klasi jedan prazan, bez ikakvih parametara umesto vas. Klasa ne sadrži podrazumevani konstruktor jedino ako vi imate napisan barem jedan konstruktor u klasi bez obzira da li traži atribute ili ne. Pogledajte kako se klasa inicijalizuje u kodu i kako joj se prosleđuju vrednosti.

Person1 person1 = new Person1();

person1.firstName = firstName;
person1.lastName = lastName;

Inicijalizacija klase Person1, omogućava da je inicijalizujete u jednoj liniji koda. Inače, se može inicijalizovati i ovako:

Person1 person1;
person1 = new Person1();

person1.firstName = firstName;
person1.lastName = lastName;

Za razliku od prve klase, klasa Person2 umesto polja, koristi auto-property - auto propertije. Auto propertiji su vam u suštini skraćeno pisanje propertija.

public string FirstName { get; set; }
public string LastName { get; set; }

Bez auto propertija, kod samo properija bi izgledao ovako:

private string _firstName;

        public string FirstName
        {
            get
            {
                return _firstName;

            }
            set
            {
                _firstName = value;

            }
        }

        private string _lastName;

        public string LastName
        {
            get
            {
                return _lastName;

            }
            set
            {
                _lastName = value;

            }
        }

Propertiji su posebna funkcionalnost koja pre svega osigurava pisanje bezbednijeg koda. To vam je enkapsulacija na delu. U navedenom program, propertiji se mogu i pisati i čitati. Vi možete pisati propertije koji su samo za čitanje, ili samo za pisanje što je retkost. Čak što više, od vrezije C# 6.0; vi možete pisati npr. auto-property samo za čitanje. Npr.

public int FirstNameLenght { get; }

Korisnik može pozvati član klase FirstNameLenght samo za čitanje, kao ReadOnly, ali ne može dodeliti propertiju nikakvu vrednost. Tako i property samo za pisanje može tražiti unos podataka ali ga ne bi niko mogao pročitati. Pomislićete da takvo svojstvo nema nikakve logike ali postoje i takve situacije gde se koristi samo svojstvo za pisanje. Na primer kad se nešto kriptuje poželjno je koristiti propertije samo za pisanje. Klasa Person2 sadrži i konstruktor koji zahteva 2 atributa. Za sada shvatite da vam je konstruktor u suštini specijalna metoda koja ima isto ime kao i klasa. Zahvaljujući konstruktoru, vi sad i inicijalizujete i dodajete vrednosti vašoj klasi u jednoj liniji koda.

Person2 person2 = new Person2(firstName, lastName);

S obzirom da postoji konstruktor u Person2 klasi, klasa nema prazan konstruktor i drugi joj neće biti dodeljen. Šta to znači? Pa to znači da prilikom inicijalizacije klase vi morate imati unesene atribute inače klasu ne možete inicijalizovati. U pravim projektima se uvek pravi još jedan konstruktor koji ne traži nikakve atribute, tako da se klasa može pozvati i bez atributa. Da, naravno vi možete imati više konstruktora u jednoj klasi, možete čak i da koristite konstruktor iz nasleđene klase. Učenje klasa i njenih mogućnosti je ogromna oblast i zato učenje o klasama je samo započet u ovom postu. Kad bi napisao sve o klasama u najkraćem obliku, vi to ništa ne bi ste razumeli. Samo konstantnim radom sa klasama koji se često podrazumeva u C# programiranju vi će te sticati pravilno i potrebno iskustvo. Treća i zadnja klasa je klasa Student. Ona je dodeljena navedenom programu da bi vam demonstrirala kako se vrši nasleđivanje klase. To vam je već polimorfizam na delu. Kao što vidite nasleđivanje klase se vrši dodavanjem dvotačke : u produžetku naziva vaše klase i dodavanje naziva klase koju nasleđujete.

class Student : Person1

Kad ste nasledili klasu Person1, vi automatski imate svojstva i metodu klase Person1. Ne morate ih ponovo pisati. Svaki student mora imati ime i prezime, zato i nasleđujemo klasu koja ima već ta svojstva. U C# programskom jeziku vi ne programirate sve, već koristite već hiljade klasa .Net Framework-a koje su već isprogramirane za vas. Učenje C# definitivno podrazumeva da će te o većini klasa morati znati sve do najmanjeg detalja kako bi ste ih što bolje mogli koristiti. Dobra vest je da se to uči stalno i ne može se sve znati napamet. To vas naravno neće poštedeti nezgodni pitanja na testovima, čak i prilikom intervjua prilikom zapošljavanja. Još jedna novina pre svega od C# verzije 6.0 po pitanju auto propertija je da vi možete auto propertijima dodeliti vrednost.

public string Department { get; set; } = "Mathematics";

To u predhodnim verzijama niste mogli. Ako se pitate zašto bi ste to radili, odgovor je jednostavan. Možda vam treba neka defaultna vrednost kad korisnik ne unese ni jedan podatak. Navedeni program prikazuje da student priprada odeljenju matematike, ukoliko nije navedena drugačija vrednost. Kad pokrenete navedeni program rezultat je sličan u zavisnosti od imena i prezimena koje je student uneo kao vrednost.

Your first name: Manuel
Your last name: Radovanovic

Person class with fields (variables):
Manuel Radovanovic

Person class with the constructor and properties (auto-properties):
Manuel Radovanovic

Student class inheritance Person1 class
without input the department information:
Manuel Radovanovic
Mathematics

Student class inheritance Person1 class
where the department is inicialize with "Informatics".
Manuel Radovanovic
Informatics


Kako to sve izgleda možete pogledati i na video-u:


( C# 6.0 Tutorial - Fundamentals - 23. Classes )