7_Klase i Objekti u C#-u

Embed Size (px)

DESCRIPTION

C# Klase i objekti

Citation preview

  • Visoka tehniVisoka tehnika ka kola Nikola Ni

    .NET tehnologije.NET tehnologije

    (7)(7)

    Klase i objekti u C#Klase i objekti u C#--uu

    dr Zoran Velidr Zoran Velikovikovi, dipl. in, dipl. in. el.. el.

    Decembar, 2012.Decembar, 2012.

    Studijski program:Studijski program:Savremene raSavremene raunarske tehnologijeunarske tehnologije

  • Deklaracija klasaDeklaracija klasa Pored ugraenihugraenih tipova, u C#C#-u se mogu graditi slosloenieni korisnikorisniki ki

    tipovitipovi podataka koji odgovarajuodgovaraju problemu koji se reava.

    Ve znamo da se novinovi tipovitipovi formiraju pomou klasaklasa. InstanceInstance (primerci) klasa se nazivaju objektiobjekti. ObjektiObjekti se formiraju u memorijimemoriji prilikom izvravanja programa. PonaPonaanje, svojstvaanje, svojstva i stanjestanje klasa se odreuju elementimaelementima klasa

    (engl. class member).

    MetodeMetode (engl. methods) odreuju ponaponaanje klaseanje klase, dok se stanje stanje klasaklasa ispoljava preko poljapolja (engl. fields).

    SvojstvaSvojstva (engl. properties) klasa su takoe obeleobelejeje klasa. Klase se prvo deklarideklariuu, pa se tek onda definiu metodemetode i poljapolja. U C#C#-u (isto kao i u Javi) se klase deklarie kljunom reju classclass. U nastavku bie formirana klasa koja pratiprati i prikazujeprikazuje vreme u toku u toku

    danadana.

    Bie korien objektobjekt koji obezbeuje bibliotekabiblioteka iz imenskog prostora SystemSystem.

  • Primer deklaracije klase (1)Primer deklaracije klase (1)##regionregion Using directivesUsing directives

    usingusing System; using System.Collections.Generic; using System.Text;System; using System.Collections.Generic; using System.Text;##endregionendregionnamespacenamespace TimeClassTimeClass{{

    publicpublic classclass TimeTime{{int Year; int Month; int Date; int Hour; int Minute; int int Year; int Month; int Date; int Hour; int Minute; int Second;Second;

    publicpublic voidvoid DisplayCurrentTime( )DisplayCurrentTime( ){{

    Console.Console.WriteLineWriteLine("stub for DisplayCurrentTime");("stub for DisplayCurrentTime");} }

    }} (nastavak na sledeoj stranici)

    Jedina metoda deklarisana u Jedina metoda deklarisana u klasi klasi DisplayCurrentTime( )DisplayCurrentTime( )

    vravraa tip a tip voidvoid

    Privatne promenljive Privatne promenljive klase Timeklase Time

    Modifikator pristupa Modifikator pristupa klase Time klase Time -- publicpublic

  • Primer deklaracije klase (2)Primer deklaracije klase (2)(nastavak sa prethodne stranice)

    // Program za testiranje formirane klase// Program za testiranje formirane klase

    public public classclass TesterTester{{

    static static voidvoid Main( )Main( ){{

    TimeTime t = new t = new Time( )Time( );;tt.DisplayCurrentTime.DisplayCurrentTime( );( );

    }}}}

    }}

    Klasa Tester Klasa Tester testiranje klase Timetestiranje klase Time

    Instanca klase Time, Instanca klase Time, formira se operatorom formira se operatorom newnew

    Objekt Objekt tt klase Timeklase Time

    Metoda Metoda DisplayCurrentTime()DisplayCurrentTime() dostupna objektu dostupna objektu tt

    Poziv konstruktora Poziv konstruktora klase Timeklase Time

  • Formiranje objekata (1)Formiranje objekata (1) Objekti su referentnireferentni tipovitipovi, dakle imaju reprezentaciju na

    hiphip-u i prave se pomou rezervisane rei newnew.

    TimeTime t t = newnew Time()Time();

    Instanca tt ne sadrne sadrii vrednost objekta tipa TimeTime, ve adresu adresu objektaobjekta koji se pravi u dinamidinamikoj koj (hip) memoriji.

    Promenljiva tt je referencareferenca na objekt tipa TimeTime. Obzirom da programskim kodom nije formirannije formiran konstruktor ove

    klase, CLRCLR (ili kompajler) pravi konstruktorpravi konstruktor za nas.

    Tek posle izvrizvrenjaenja konstruktorakonstruktora u memoriji se formira valjanvaljan objekt.

    Modifikator pristupaModifikator pristupa klase dreuje koje metodemetode i promenljivepromenljive lanice drugih klasa mogu da im pristupemogu da im pristupe.

    Prilikom formiranja objekata poziva se Prilikom formiranja objekata poziva se metoda metoda Time()Time() koja se naziva koja se naziva KONSTRUKTORKONSTRUKTOR

  • Modifikatori pristupaModifikatori pristupaModifikator Modifikator

    pristupapristupa Restrikcije Restrikcije

    public Apublic A Bez ograniBez ogranienja, vidljive bilo kojoj metodi i klasienja, vidljive bilo kojoj metodi i klasi

    private Aprivate A lanovi klase A dostupni su samo metodama klase Alanovi klase A dostupni su samo metodama klase A

    protected Aprotected A lanovi klase A dostupni su samo metodama klase A i lanovi klase A dostupni su samo metodama klase A i metodama metodama izvedenimizvedenim iz klase Aiz klase A

    internal Ainternal A lanovi klase A dostupni su svim klasama iz lanovi klase A dostupni su svim klasama iz programskog programskog sklopasklopa AA

    pprotected internal Arotected internal A Objedinjuje protected i internalObjedinjuje protected i internal

  • Formiranje objekta (2)Formiranje objekta (2)#region#region Using directivesUsing directives

    using System;using System;using System.Collections.Generic;using System.Collections.Generic;using System.Text;using System.Text;

    #endregion#endregionnamespacenamespace DeclaringConstructorDeclaringConstructor{{

    publicpublic classclass TimeTime{{

    int Year; int Month; int Date; int Hour;int Year; int Month; int Date; int Hour;int Minute; int Second;int Minute; int Second;publicpublic voidvoid DisplayCurrentTime( )DisplayCurrentTime( ){{

    System.Console.WriteLine( "{0}/{1}/{2} {3}:{4}:{5}",System.Console.WriteLine( "{0}/{1}/{2} {3}:{4}:{5}",Month, Date, Year, Hour, Minute, Second );Month, Date, Year, Hour, Minute, Second );

    } }

    Privatne promenljive Privatne promenljive lanicelanice

    Javne metode za Javne metode za pristup vrednostimapristup vrednostima

    Formiranje specijalnog Formiranje specijalnog KonstruktoraKonstruktora

  • Formiranje objekta (3)Formiranje objekta (3)publicpublic Time Time ((System.DateTimeSystem.DateTime dt)dt)

    {{Year = dt.Year; Month = dt.Month; Date = dt.Day;Year = dt.Year; Month = dt.Month; Date = dt.Day;Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second;Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second;

    }}}}

    publicpublic classclass TesterTester{{

    staticstatic voidvoid Main( )Main( ){{

    SystemSystem.DateTime.DateTime currentTimecurrentTime = = System.DateTime.NowSystem.DateTime.Now;;Time Time t = new t = new Time (currentTime)Time (currentTime);;t.t.DisplayCurrentTime( )DisplayCurrentTime( );;

    } } } }} }

    Izlaz:Izlaz:11/10/2009 22:33:1011/10/2009 22:33:10

    Konstruktoru se prosleuje Konstruktoru se prosleuje objekt objekt dtdt tipa DateTimetipa DateTime

    Poziv statiPoziv statikog svojstva kog svojstva Now Now strukture DateTime, tekustrukture DateTime, tekue vremee vreme

    Ovaj objektOvaj objekt dtdt tipa DateTime obezbeuje tipa DateTime obezbeuje biblioteka iz imenskog prostora Systembiblioteka iz imenskog prostora System

    Dodeljivanje vrednosti Dodeljivanje vrednosti privatnim promenljivamaprivatnim promenljivama

  • System.DateTime struSystem.DateTime strukkturturaa// Summary:

    // Initializes a new instance of the System.DateTimeSystem.DateTime structure to the specified// year, month, day, hour, minute, and second.// Parameters:Parameters:// year:year:// The year (1 through 9999).// month:month:// The month (1 through 12).// day:day:// The day (1 through the number of days in month).// hour:hour:// The hours (0 through 23).// minute:minute:// The minutes (0 through 59).// second:second:// The seconds (0 through 59).// Exceptions:Exceptions:// System.ArgumentOutOfRangeException:// year is less than 1 or greater than 9999. -or- month is less than 1 or greater// than 12. -or- day is less than 1 or greater than the number of days in month.-or-// hour is less than 0 or greater than 23. -or- minute is less than 0 or greater// than 59. -or- second is less than 0 or greater than 59.//// System.ArgumentException:// Specified parameters evaluate to less than System.DateTime.MinValue or more// than System.DateTime.MaxValue.

    public DateTime(int year, int month, int day, int hour, int minupublic DateTime(int year, int month, int day, int hour, int minute, int second);te, int second);

  • DateTime NowDateTime Now, UtcNow, UtcNow// Summary:// Gets a System.DateTime object that is set to the current date and time on// this computer, expressed as the local timelocal time.//// Returns:// A System.DateTime whose value is the current local date and time.

    public public staticstatic DateTime Now { get; }DateTime Now { get; }

    //// Summary:// Gets a System.DateTime object that is set to the current date and time on// this computer, expressed as the Coordinated Universal TimeCoordinated Universal Time (UTC).//// Returns:// A System.DateTime whose value is the current UTC date and time.

    public public staticstatic DateTime UtcNow { get; }DateTime UtcNow { get; }

    StatiStatiko svojstvo ko svojstvo NowNow objekta objekta DateTimeDateTime koje se samo mokoje se samo moe e itatiitati

    StatiStatiko svojstvo ko svojstvo UtcUtcNowNow objekta objekta DateTimeDateTime koje se samo mokoje se samo moe e itatiitati

  • Object Browser: Struktura Object Browser: Struktura DateTimeDateTime

    ViVie preklopljenih konstruktora e preklopljenih konstruktora strukture strukture DateTimeDateTime, detalji do , detalji do

    kraja lekcijekraja lekcije

  • Struktura Struktura DateTimeDateTime, svojstvo Now, svojstvo Now

    Svojstvo strukture Svojstvo strukture DateTimeDateTime, , NewNew

  • Help: Struktura Help: Struktura DateTimeDateTime, metode, metodeKonstruktori i metode strukture Konstruktori i metode strukture

    DateTimeDateTime

  • Help: Struktura Help: Struktura DateTimeDateTime, svojstva , svojstva

    Properties strukture Properties strukture DateTimeDateTime

  • Rezervisana reRezervisana re thisthis KonstruktoruKonstruktoru se mogu proslediti inicijalne vrednostiinicijalne vrednosti kako bi

    se definisalo popoetnoetno stanje objekta.

    Da bi se definisao konstruktordefinisao konstruktor, deklarie se metoda sa istimistimimenomimenom i argumentimaargumentima u pozivu.

    Rezervisana re thisthis oznaava tekutekuuu instancu objektainstancu objekta i moe se koristiti na vie naina.

    public public classclass CarCar{{public public intint yearBuilt;yearBuilt;publicpublic void void SetYearBuiltSetYearBuilt((int int yearBuilt)yearBuilt){{// // parametar parametar yearBuilt yearBuilt skrivaskriva yearBuilt yearBuilt poljepoljethisthis.yearBuilt = .yearBuilt = yearBuiltyearBuilt;;

    }}}}

  • StatiStatike metode i ke metode i lanovilanovi lanovi klaselanovi klase mogu biti lanovi instancelanovi instance ili statistatiki ki lanovilanovi. StatiStatiki ki lanovilanovi se referenciraju za klaseklase, dok se lanovi lanovi

    instanceinstance vezuju za instanceinstance.

    StatiStatike metodeke metode se ponaaju kao globalne metodeglobalne metode jer se pozivaju mimo instancemimo instance objekta.

    Metoda Main()Main() je statika i radi na nivou klasenivou klase a ne ne nivou objekta.

    StatiStatiki konstruktorki konstruktor u klasi e se izvriti prepre pravljenja bilo koje instance.

    Primer statistatikogkog konstruktoraStatic Time()Static Time()

    {{

    Name=Name=TimeTime;;

    }}

    Nema Nema modifikatora pristupa!modifikatora pristupa!

  • UniUnitavanje objekata tavanje objekata -- DestruktoriDestruktori C# C# koristi automatsko prikupljanje ubretakoristi automatsko prikupljanje ubreta, meutim ako objekt

    koristi resurse kojima ne upravlja .NETne upravlja .NET, oni se eksplicitnoeksplicitno moraju moraju osloboditiosloboditi!

    Ovo omoguava destruktordestruktor koji se poziva od strane sakupljaa smea. Destruktor objekta se ne mone moee direktnodirektno pozvati! Deklaracija destruktoradestruktora je sledea:

    ~~MyClass()MyClass(){{

    // na// naredbe za oslobaanje resursaredbe za oslobaanje resursa}}

    Ova sintaksasintaksa se zapravo realizuje metodom finalize()finalize() koja se odnosi na dotidotinunu klasu (vie o ovoj metodi kasnije na kursu).

    Tilda, oznaTilda, oznaava destruktorava destruktor

  • Prosleivanje parametaraProsleivanje parametara U C# C# se vrednosni tipovi podrazumevanopodrazumevano prosleuju

    metodama po vrednostipo vrednosti.

    Dakle, u prosleenoj metodi se formira privremena kopijaprivremena kopija prosleenog objekta.

    Ponekad je poeljno objekte proslediti po referencipo referenci.

    Modifikator parametra refref omoguava prosleivanje vrednosnih tipova po referencivrednosnih tipova po referenci.

    Modifikator parametra outout omoguava prosleivanje vrednosnih tipova po referenci bez incijalizacije pre prosleivanjabez incijalizacije pre prosleivanja.

    Modifikator parametra paramsparams omoguava prosleivanje razlirazliitogitog broja parametara.

    public void GetTime(public void GetTime(refref int h, int h, refref int m, int m, ref ref int s)int s)

  • Preklapanje metoda i konstruktoraPreklapanje metoda i konstruktora esto se javlja potreba da se ima viviee razliitih metoda sa istim istim

    imenomimenom!

    Ovo bi omoguilo vevei broji broj razlirazliitihitih konstruktorakonstruktora za jednu te istuistu klasu!

    Na taj nain bi se inicijalizacijanicijalizacija mogla prilagoditi razlirazliitim itim potrebama.

    MehanizamMehanizam za realizaciju ove ideje naziva se preklapanje preklapanje (engl. overloading).

    Potpis metodePotpis metode se osvaruje preko njenog imenaimena i listomlistomparametaraparametara!

    Liste parametaraListe parametara mogu da se razlikuju po tiputipu i/ili brojubrojuparametara.

  • Preklapanje metoda i konstruktoraPreklapanje metoda i konstruktoravoidvoid MyMethod(int p1)MyMethod(int p1)voidvoid MyMethod(int p1, int p2)MyMethod(int p1, int p2)voidvoid MyMethod(int p1, string s1)MyMethod(int p1, string s1)

    Klasa moe imati proizvoljanproizvoljan broj metoda ali sa razlirazliitim itim potpisompotpisom.

    Promena tipatipa rezultatarezultata ne povlane povlaii izmenu konstruktora.

    RazliRazliiti broj i tip parametaraiti broj i tip parametaraIsto imeIsto ime

  • Preklapanje konstruktora (1)Preklapanje konstruktora (1)public public classclass TimeTime{{

    // privatne promenljive // privatne promenljive lanicelaniceint Year; int Month; int Date; int Hour; int Year; int Month; int Date; int Hour; int Minute; int Second;int Minute; int Second;

    // javno dostupna metoda// javno dostupna metodapublic public voidvoid DisplayCurrentTime( )DisplayCurrentTime( )

    {{System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",Month, Date, Year, Hour, Minute, Second);Month, Date, Year, Hour, Minute, Second);

    }}

    // Na slede// Na sledeoj strani su prikazani konstruktorioj strani su prikazani konstruktori// sa razli// sa razliitim parametrimaitim parametrima

  • Preklapanje konstruktora (2)Preklapanje konstruktora (2)// konstruktori// konstruktoripublic Time(public Time(System.DateTimeSystem.DateTime dt)dt)

    {{Year = dt.Year;Year = dt.Year;Month = dt.Month;Month = dt.Month;Date = dt.Day;Date = dt.Day;Hour = dt.Hour;Hour = dt.Hour;Minute = dt.Minute;Minute = dt.Minute;Second = dt.Second;Second = dt.Second;

    }}public Time(int Year, int Month, int Date, int Hour, int Minute,public Time(int Year, int Month, int Date, int Hour, int Minute, int Second)int Second)

    {{this.Year = Year;this.Year = Year;this.Month = Month;this.Month = Month;this.Date = Date;this.Date = Date;this.Hour = Hour;this.Hour = Hour;this.Minute = Minute;this.Minute = Minute;this.Second = Second;this.Second = Second;

    }}}}

    Konstruktor Konstruktor 22

    Konstruktor Konstruktor 11

  • Preklapanje konstruktora (3)Preklapanje konstruktora (3)publicpublic classclass TesterTester

    {static static voidvoid Main( )Main( ){

    System.DateTime System.DateTime currentTimecurrentTime = System.DateTime.Now= System.DateTime.Now;Time Time t1t1= new = new Time(currentTime)Time(currentTime);;t1.t1.DisplayCurrentTime( )DisplayCurrentTime( );;

    Time Time t2t2 = new = new Time(2011,11,18,11,03,30)Time(2011,11,18,11,03,30);;t2t2.DisplayCurrentTime( )DisplayCurrentTime( );

    }}

    Poziv Konstruktora Poziv Konstruktora 11 na osnovu na osnovu pozivnih parametarapozivnih parametara

    Poziv Konstruktora Poziv Konstruktora 22Isto ime konstruktora, Time()Isto ime konstruktora, Time()

  • Kapsuliranje podataka svojstvimaKapsuliranje podataka svojstvima SvojstvaSvojstva (engl. properties) omoguavaju pristuppristup stanjima stanjima

    klaseklase direktno preko metodapreko metoda koje obezbeuje tata klasa.

    Na ovaj nain se skrivaskriva interno stanje klaseinterno stanje klase i omoguava se zapravo indirektan pristupindirektan pristup putem pomenutih metodametoda.

    Klase nezavisnonezavisno menjaju odravanje svog internog stanjainternog stanjabez obavezebez obaveze da o tome obavetavaju klijenta.

    Dakle, svojstava klijentu izgledaju kaoizgledaju kao promenljivepromenljive lanicelanice, iako su implementirane kao metodemetode.

    Svojstva se deklariu imenomimenom a zatim i pristupnim pristupnim metodamametodama koje se uvek nazivaju getget, odnosno, setset.

    Na sledeem slajdu je dat primer svojstva HourHour.

  • Primer: svojstvo HourPrimer: svojstvo Hourpublicpublic intint HourHour

    {{getget{{

    returnreturn hourhour;}}setset{{

    hour = hour = valuevalue;}}

    }}

    Svojstvo, HourSvojstvo, Hour

    Pristupne metodePristupne metode

  • Test: svojstvo HourTest: svojstvo Hourpublic public classclass TesterTester{{static static voidvoid Main( )Main( ){{System.DateTime System.DateTime currentTimecurrentTime = System.DateTime.Now;= System.DateTime.Now;Time Time tt = = newnew Time(currentTime);Time(currentTime);tt.DisplayCurrentTime();.DisplayCurrentTime();intint theHour = theHour = tt.Hour;.Hour;

    System.Console.WriteLine("System.Console.WriteLine("\\nRetrieved the hour: {0}nRetrieved the hour: {0}\\n", theHour);n", theHour);theHour++;theHour++;t.t.HourHour = theHour;= theHour;System.Console.WriteLine("Updated the hour: {0}System.Console.WriteLine("Updated the hour: {0}\\n", theHour);n", theHour);}}

    }}

    itanje svojstva Houritanje svojstva Hour

    Zadavanje svojstva HourZadavanje svojstva Hour

    Poziv statiPoziv statikog svojstva kog svojstva Now Now strukture DateTime, tekustrukture DateTime, tekue vremee vreme

    Visoka tehnika kola NiDeklaracija klasaPrimer deklaracije klase (1)Primer deklaracije klase (2)Formiranje objekata (1)Modifikatori pristupaFormiranje objekta (2)Formiranje objekta (3)System.DateTime strukturaDateTime Now, UtcNowObject Browser: Struktura DateTimeStruktura DateTime, svojstvo NowHelp: Struktura DateTime, metodeHelp: Struktura DateTime, svojstva Rezervisana re thisStatike metode i lanoviUnitavanje objekata - DestruktoriProsleivanje parametaraPreklapanje metoda i konstruktoraPreklapanje metoda i konstruktoraPreklapanje konstruktora (1)Preklapanje konstruktora (2)Preklapanje konstruktora (3)Kapsuliranje podataka svojstvimaPrimer: svojstvo HourTest: svojstvo Hour