8
Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 .... 1 | UOP/mm/df/14 NASLEDJIVANJE i POLIMORFIZAM Izvedena klasa nasleđuje osobine svoje osnovne klase. Pomoću ključnih reči new, override i virtual izvedena klasa može da kontroliše skrivanje i nadjačavanje metoda. Dostupnost unutar hijerarhije nasleđivanja definiše se pomoću ključne reči protected. Ekstenzione metode su alternativni mehanizmi za korišćenje nasleđivanja. Nasleđivanje je jedan od osnovnih pojmova OOP. Koristi se u slučajevima kada klase imaju zajedničke odrednice i jasnu međusobnu hijerarhiju. Primer: Svi Zaposleni ... Menadžeri ... Fizički radnici... Svi oni imaju identifikacioni broj, ime i prezime ali poseduju neke iste ali i različite metode odnosno ponašanja. Nasleđivanje je u programiranju vezano za klasifikaciju, odnosno odnos između klasa. Primer: Sisari (udišu vazduh, maladunčad sisaju, toplokrvni...) Konji (..., kasaju, imaju kopita ...) Kitovi(... plivaju, imaju peraja, ...) Čovek (... Mravojed (... Postavlja se pitanje: Kako razviti metodu disanje() kod čoveka, kita, konja ili mravojeda? ... Da li to treba da budu posebne metode? Kako da ih zovemo. ... Očito da bi to dovelo do velikih poteškoća pri razvoju robustnih klasa. U programskom jeziku C#, da bi se rešili ovi problemi, koristi se nasleđivanje klasa. Konj, Kit, Čovek ili Mravojed su tipovi sisara, pa se kreira klasa Sisar koja sadrži sve uobičajene metode za sisare odnosno metode za uobičajene radnje koje su karakteristične za sve tipove sisara. Zatim se deklarišu klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati funkcije klase Sisar ali se mogu dodati funkcije (metode) koje su specifične za određeni tip sisara (metodu kasanje() za Konja, metodu plivanje() za Kita). Ako treba da se promeni način na koji uobičajena metoda disanje() radi onda se to radi samo na jednom mestu, u nadređenoj klasi Sisar. Sintaksa: class IzvedenaKlasa: OsnovnaKlasa { .. } class PodIzvedenaKlasa: IzvedenaKlasa { .. } U jeziku C#, klasi je dozvoljeno izvođenje iz samo jedne klase. Nije dozvoljeno izvođenje iz dve ili više klasa. Hijerarhija izvođenja klasa može se nastaviti na sledećim nivioma … osim ako klasa nije zapečaćena. Primer: class Sisar { .. public void Disanje() { } public void DojenjeMladih() { } }

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Embed Size (px)

Citation preview

Page 1: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

1 | U O P / m m / d f / 1 4

NASLEDJIVANJE i POLIMORFIZAM

Izvedena klasa nasleđuje osobine svoje osnovne klase.

Pomoću ključnih reči new, override i virtual izvedena klasa može da kontroliše skrivanje i nadjačavanje metoda.

Dostupnost unutar hijerarhije nasleđivanja definiše se pomoću ključne reči protected.

Ekstenzione metode su alternativni mehanizmi za korišćenje nasleđivanja.

Nasleđivanje je jedan od osnovnih pojmova OOP. Koristi se u slučajevima kada klase imaju zajedničke odrednice i jasnu međusobnu hijerarhiju.

Primer: Svi Zaposleni ... Menadžeri ... Fizički radnici... Svi oni imaju identifikacioni broj, ime i prezime ali poseduju neke iste ali i različite metode odnosno ponašanja.

Nasleđivanje je u programiranju vezano za klasifikaciju, odnosno odnos između klasa. Primer:

Sisari (udišu vazduh, maladunčad sisaju, toplokrvni...)

Konji (..., kasaju, imaju kopita ...)

Kitovi(... plivaju, imaju peraja, ...)

Čovek (... Mravojed (...

Postavlja se pitanje: Kako razviti metodu disanje() kod čoveka, kita, konja ili mravojeda? ... Da li to treba da budu posebne metode? Kako da ih zovemo. ... Očito da bi to dovelo do velikih poteškoća pri razvoju robustnih klasa.

U programskom jeziku C#, da bi se rešili ovi problemi, koristi se nasleđivanje klasa. Konj, Kit, Čovek ili Mravojed su tipovi sisara, pa se kreira klasa Sisar koja sadrži sve uobičajene metode za sisare odnosno metode za uobičajene radnje koje su karakteristične za sve tipove sisara. Zatim se deklarišu klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati funkcije klase Sisar ali se mogu dodati funkcije (metode) koje su specifične za određeni tip sisara (metodu kasanje() za Konja, metodu plivanje() za Kita). Ako treba da se promeni način na koji uobičajena metoda disanje() radi onda se to radi samo na jednom mestu, u nadređenoj klasi Sisar.

Sintaksa:

class IzvedenaKlasa: OsnovnaKlasa { .. }

class PodIzvedenaKlasa: IzvedenaKlasa { .. }

U jeziku C#, klasi je dozvoljeno izvođenje iz samo jedne klase. Nije dozvoljeno izvođenje iz dve ili više klasa.

Hijerarhija izvođenja klasa može se nastaviti na sledećim nivioma … osim ako klasa nije zapečaćena.

Primer:

class Sisar { ..

public void Disanje() { … }

… public void DojenjeMladih() { … }

… }

Page 2: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

2 | U O P / m m / d f / 1 4

class Konj: Sisar { … public void Kasanje() { … } .. }

class Kit: Sisar { .. public void Plivanje() { … } }

… u aplikacijama se može koristiti kood …

...

Konj Dorat=new Konj();

Dorat.Kasanje();

Dorat.Disanje();

Dorat.DojenjeMladih();

...

Kit MobiDik=new Kit();

MobiDik.Plivanje();

MobiDik.Disanje();

MobiDik.DojenjeMladih();

...

Kit PlaviKit=Dorat; // Ovo bi bila greška jer su u pitanju drugačiji tipovi

...

Sisar NekiSisar=Dorat; // Ovo je DOZVOLJENO

/*jer je logicno da se koristi promenjiva razlicitog tipa sve dok je klasa koja je kreirala tu promenjivu na VIŠEM NIVOU nasleđivanja ... Svi konji su SISARI , tako da se može slobodno dodeliti objekat tipa Konj promenjivoj tipa Sisar. Medjutim postoji jedno bitno OGRANIČENJE. Kada se upućuje na objekat Konj ili Kit koristeći promenjivu Sisar, može se pristupiti samo poljima i metodama koji su definisani u klasi Sisar. Bilo koja dodatna metoda ili polje koje je definisano preko klase Konj ili Kit neće logično biti vidljiva. */

...

Konj Vranac=new Konj();

Sisar NekiSisar=Vranac; // Ovo je OK ... Disanje je metod klase Sisar

NekiSisar.Kasanje(); // Ovo NIJE OK ... Kasanje nije metod klase Sisar

JOŠ NEKOLIKO PRAVILA i primera ...

Sisar NekiSisar=new Sisar(); // Ovo je OK ... kreiranje objekta klase Sisar

Konj Putko=NekiSisar; // Ovo NIJE OK ... nisu svi objekti tipa Sisar konji neki su i kitovi ili mravojedi!!!

NAPOMENA: Klasa System. Object je korenska klasa svih drugih klasa. Sve klase se implicitno izvode iz klase: System. Object .

Bilo koja metoda u klasi System. Object se automatski prosleđuje u lancu nasleđivanja klasama koje se izvode iz ove klase. Ovo uključuje metode kao što je metoda ToString().

POZIVANJE KONSTRUKTORA OSNOVNIH KLASA

Pored metoda koje se nasleđuju iz OSNOVNE KLASE, IZVEDENA KLASA nasleđuje i sva polja OSNOVNE KLASE. Ova polja obično zahtevaju inicijalizaciju. Inicijalizacija se vrši preko KONSTRUKTORA.

Page 3: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

3 | U O P / m m / d f / 1 4

Dobra praksa je da konstruktor izvedene klase pozove konstruktor osnovne klase kao deo inicijalizacije, što omogućava konstruktoru osnovne klase da izvrši dodatnu inicijalizaciju koja se zahteva.

Za ovo se koristi ključna reč base.

class Sisar // osnovna klasa { .. public Sisar(string Ime) // konstruktor osnovne klasa { … } … public void Disanje() { … } … public void DojenjeMladih() { … } … }

class Konj: Sisar // izvedena klasa { … …

public Konj(string Ime):base(Ime) // poziva se Sisar(Ime) { … } …

public void Kasanje() { … } .. }

DEKLARISANJE NOVIH METODA

Problem sa odabirom imena za metode!!!

Ako definišete metod za klasu, a ta klasa je deo hijerarhije nasleđivanja, pre ili kasnije pokušaćete opet da koristite IME koje je već u upotrebi od strane neke druge klase koja se nalazu na višem nivou u hijerarhiji.

Potpis metode je ime metode i broj i tip njenih argumenata, ali ne uključuje njen povratni tip. Dve metode koje imaju isto ime i uzimaju istu listu parametara imaju isti potpis, čak i kada vrate različite tipove.

Ako osnovna i izvedena klasa slučajno deklarišu dve metode koje imaju isti potpis … kompajler će javiti grešku odnosno UPOZORENJE!!!

VAŽNO: Metod u izvedenoj klasi maskira (sakriva) metod u osnovnoj klasi koji ima isti potpis. Primer:

class Sisar // osnovna klasa { ..

public Sisar(string Ime) // konstruktor osnovne klasa { … } …

public void Disanje() { … } … public void DojenjeMladih() { … } … public void Onomatopeja()//svi sisari se na -//neki način oglašavaju { … } …

}

class Konj: Sisar // izvedena klasa { … …

public Konj(string Ime):base(Ime) // poziva se Sisar(Ime) { … } …

public void Kasanje() { … } public void Onomatopeja()() // i konji su sisari ali se oglasavaju razlicito od kitova... konji njište { … } .. } // Ovo će se kompajlirati i izvršiti ali uz upozorenje. // Ovo može dovesti i do zabune ako se iz klase Konj dalje izvode klase (na primer KASAČI). Onda ako u objektu klase Kasači pozovemo metodu

ONOMATOPEJA, pozvaće se ONOMATOPEJA od klase Konj a ne od klase Sisari

Page 4: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

4 | U O P / m m / d f / 1 4

Ako smo ipak sigurni da želimo da koristimo metode sa istim POTPISOM a da izbegnemo UPOZORENJE koristi se reč new.

class Sisar // osnovna klasa { .. public Sisar(string Ime) // konstruktor osnovne klasa { … } … public void Disanje() { … } … public void DojenjeMladih() { … } … public void Onomatopeja()//svi sisari se na -//neki način oglašavaju { … } … }

class Konj: Sisar // izvedena klasa { … …

public Konj(string Ime):base(Ime) // poziva se Sisar(Ime) { … } …

public void Kasanje() { … } new public void Onomatopeja() { … } .. } // Efekat reči new: skrivanje se dalje dešava samo se ne javlja upozorenje. Odnosno ključna reč new kaže: Znam šta radim, prestani da mi pokazuješ ova upozorenja.

DEKLARISANJE VIRTUELNIH i OVERRIDE METODA

Ponekad je potrebno sakriti način na koji je neka metoda implementirna u osnovnoj klasi. Primer: metoda ToString u klasi System.Object. Namena metode ToString je da konvertuje objekat u njegovu strring reprezentaciju. Ova metoda je veoma korisan član klase System.Object pa je zbog toga metoda ToString prisutna u svim klasama.

Kako ona funkcioniše?

Realno metoda ToString u klasi System. Object je veoma jednostavna i ne radi skoro ništa. Ona jednostavno samo čuva mesto za istoimene metode koje će biti napisane u izvedenim klasama i koje će je nadjačati. Ona jednostavno samo čuva mesto. Dakle, ona je u klasi System.Object samo iz sigurnosnih razloga (kada izvedene klasa nema istoimenu metodu).

Metoda kojoj je namena da bude nadjačana zove se virtuelna metoda.

Koja je razlika između virtuelne i skrivene metode?

Nadjačavanje metoda je mehanizam za navođenje različitih implementacija iste metode. Metode su sve povezane zbog toga što su namenjene za isti zadatak, ali na drugi način, specifičan za klasu.

Skrivanje metode je način zamene jedne metode drugom metodom. Metode uglavnom nisu povezane i mogu da izvrše potpuno različite zadatke.

Nadjačavanje je korisna programerska ideja, skrivanje je uglavnom greška.

Virtuelna metoda se definiše pomoću ključne reči virtual.

Ako osnovna klasa definiše metodu kao virtual, izvedena klasa koristi ključnu reč override da bi deklarisala drugu implementaciju te metode.

Page 5: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

5 | U O P / m m / d f / 1 4

Ukoliko je potrebno, u izvedenoj klasi se virtualna metoda iz osnovne klase može pozvati sa ključnom rečju base.

namespace System class Object // osnovna klasa { .. public virtual string ToString() { … } … … }

class Konj: Sisar // izvedena klasa { … …

public override string ToString() { … } … base.ToString(); …

public void Kasanje() { … } .. }

Pojmovi VIRTUELNA METODA i OVERRIDE METODA dovode do pojma POLIMORFIZMA odosno POLIMORFNIH metoda.

Postoje važna pravila koja treba poštovati kada su u pitanju polimorfne metode:

Virtuelna metoda ne može biti privatna, ona treba da bude dostupna drugim klasama kroz nasleđivanje.

Override metoda takođe ne može biti privatna jer klasa NE MOŽE da menja zaštitini nivo metode koju nasleđuje. Međutim override metode mogu imati poseban obrazac privatnosti koji se naziva zaštićen pristup.

Potpisi virtuelnih i override metoda moraju biti identični (ime, broj i vrsta parametara). Čak mora biti isti i tip koji vraćaju.

Može se nadjačati samo virtuela metoda.

Ako izvedena klasa ne deklariše metodu koristeći ključnu reč override, ona ne nadjačava metodu osnovne klase – već je skriva. Drugim rečima metoda postaje implementacija sasvim druge metode koja ima isto ime.

Svaka virtuelna metoda je implicitno virtuelna i može opet biti nadjačana u nekoj drugoj izvedenoj klasi.

Page 6: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

6 | U O P / m m / d f / 1 4

VIRTUELNE METODE i POLIMORFIZAM

Virtuelne metode omogućavaju da pozovete različite verzije iste metode u zavisnosti od tipa objekta koji se dinamički određuje u toku izvršenja.

class Sisar { ..

public virtual string PreuzmiImeTipa() { return “Ovo je sisar”; }

… }

class Konj: Sisar { …

public override string PreuzmiImeTipa() {

return “Ovo je konj”; }

.. }

class Kit: Sisar { ..

public override string PreuzmiImeTipa() {

return “Ovo je kit”; }

}

class Mravojed: Sisar { .. // ne poseduje //metodu //PreuzmiImeTipa() … }

Šta daje kod?

...

Sisar BiloKojiSisar=new Sisar();

Konj Dorat=new Konj(...);

Kit MobiDik=new Kit(...);

Mravojed MaliMrav=new Mravojed(...);

BiloKojiSisar=Dorat;

Console.WriteLine(BiloKojiSisar.PreuzmiImeTipa()); // Štampa se “Ovo je konj”

BiloKojiSisar=MobiDik;

Console.WriteLine(BiloKojiSisar.PreuzmiImeTipa()); // Štampa se “Ovo je kit”

BiloKojiSisar=MaliMrav;

Console.WriteLine(BiloKojiSisar.PreuzmiImeTipa()); // Štampa se “Ovo je sisar”

Prva naredba Console. Writ… koristi varijablu BiloKojiSisar kojoj je dodeljen objekat Dorat (tipa konj). Pošto je metoda PreuzmiImeTipa() deklarisana u osnovnoj klasi Sisar kao virtuelna ona je nadjačana metodom PreuzmiImeTipa() iz klase Konj pa se štampa: “Ovo je konj”. Slični je za kita. Klasa Mravojed nema metodu PreuzmiImeTipa(,) pa će treći poziv iskaza Console. Writ… dati “Ovo je sisar”.

Ovaj fenomen kada isti iskaz poziva drugačije metode, zavisno od njenog konteksta, zove se POLIMORFIZAM.

PRISTUP PROTECTED

Reči public i private stvaraju dve krajnosti kada je reč o pristupima članovima neke klase. Public čini da su polja i metode klase dostupni svima. Private čini da su polja i metode klase dostupni samo toj klasi.

Ovo je dovoljno kada su klase izolovane. Ali realni život zahteva mnogo složenije odnose. Izolovane klase ne mogu da reše složene probleme.

Nasleđivanje je moćan način za povezivanje klasa jer postoji blizak odnos (relacija) između klase i njene izvedene klase.

Često je potrebno da klasa dozvoli izvedenoj klasi da koristi neke njene članove dok skriva iste te članove od klasa koje nisu deo hijerarhije. U ovoj situaciji, može se koristiti ključna reč protected da bi se obeležili ti članovi.

Page 7: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

7 | U O P / m m / d f / 1 4

PRIMER:

Ako je klasa A JESTE izvedena iz klase B, ona može da pristupi zaštićenim članovima klase B. Drugim rečima za klasu A, zaštićene metode u klasi B su javne

Ako je klasa A NIJE izvedena iz klase B, ona ne može da pristupi zaštićenim članovima klase B. Drugim rečima za klasu A, zaštićene metode u klasi B su privatne.

Program ima potpunu slobodu da definiše koja polja ili klase će biti zaštićene.

Ipak, preoruka je da polja u klasi budu strogo privatna, i da se ovakav pristup ne bude strog jedino kada je to bas apsolutno neophodno. Zašto? Pa zato što javna polja narušavaju enkapsulaciju klase, jer im može pristupiti bilo ko ko koristi tu klasu.

Međutim, zaštićenim poljima se može pristupiti preko klase koja je izvedena.

Član zaštićene klase zadržava svoj zaštićeni status i u izvedenoj klasi itd kroz hijerarhiju…

Uvek se traga za optimumom sa aspekta enkapsulacije i sa aspekta svojstva protected.

PRIMER: virtual i override metoda …. Prevozna sredstva… --- KONZOLNA APLIKACIJA

Klasa SaobracajnoSredstvo

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Vehicles

{

class SaobracajnoSredstvo

{

public void StartMotora(string zvukPriPokretanju)

{

Console.WriteLine("Startovanje motora: {0}", zvukPriPokretanju);

}

public void StopMotora(string zvukPriZaustavljanju)

{

Console.WriteLine("Zaustavljanje motora: {0}", zvukPriZaustavljanju);

}

public virtual void Voznja()

{

Console.WriteLine("Podrazumevana implementacija metode Voznja");

}

}

}

Izvedena klasa Auto using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Vehicles

{

class Auto:SaobracajnoSredstvo

{

public void Ubrzanje()

{

Console.WriteLine("Ubrazanje...");

}

public void Usporenje()

{

Console.WriteLine("Kocenje...");

}

}

}

Page 8: Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan ... u... · klase Konj, Kit, Čovek i Mravojed nasleđene od klase Sisar. Ove klase će onda automatski pružati ... pa

Uvod u Objektno Programiranje /// VPTŠ Užice /// Milovan Milivojević / Đorđe Forst /// 2014 Izvodi: Microsoft Visual C#2012, John Sharp, CET:Portabilis, Beograd,2013 ....

8 | U O P / m m / d f / 1 4

Izvedena klasa Avion using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Vehicles

{

class avion:SaobracajnoSredstvo

{

public void Polet()

{

Console.WriteLine("Poletanje");

}

public void Sletanje()

{

Console.WriteLine("Prizemljenje");

}

// kreitanje metode Voznja koja ce nadjacati metodu Voznja u klasi S. Sredstvo

public override void Voznja()

{

Console.WriteLine("Letenje... Lebdenje ... nepodnosljiva lakoca postojanja");

//base.Voznja();

}

}

}

Glavni program /// Konzolna aplikacija using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Vehicles

{

class Program

{

static void Entrance()

{

// to do

Console.WriteLine("Putovanje avionom: ");

avion jatSrbija = new avion();

jatSrbija.StartMotora("Contact");

jatSrbija.Polet();

jatSrbija.Voznja();

jatSrbija.Sletanje();

jatSrbija.StopMotora("Whirr");

Console.WriteLine('\n' + "Putovanje autom: ");

Auto punto = new Auto(); punto.StartMotora("Brm ...Brm");

punto.Ubrzanje();

punto.Voznja();

punto.Usporenje();

punto.StopMotora("Puf...Phuf");

//

//testiranje POLIMORFIZMA

Console.WriteLine("\nTestiranje POLIMORFIZMA");

SaobracajnoSredstvo voziloXYZ = punto;

voziloXYZ.Voznja();

voziloXYZ = jatSrbija;

voziloXYZ.Voznja();

}

static void Main()

{

try

{

Entrance();

}

catch (Exception ex)

{

Console.WriteLine("Exception: {0}", ex.Message);

}

}

}

}