c# tipovi klasa i

Upload: dalton

Post on 12-Jul-2015

90 views

Category:

Documents


2 download

TRANSCRIPT

kola C#: Tipovi klasa (1) | Asc Blog

http://alzan.info/skola-c-tipovi-klasa-1/

ASCBLOG

Develop the idea, not the framework

Search Website

RECENT POSTS

Apstraktno vs ugnijeeno vs zapeaenoU prijanjim dijelovima smo zakljuili da je nasljeivanje toliko moan alat da se esto zloupotrebljava, odnosno koristi tamo gdje to uope nije potrebno. Ovu problematiku emo obraditi kao posebnu cjelinu u narednim dijelovima kole, ali prije toga emo vidjeti kakvi tipovi klasa su podrani u programskom jeziku C#. Kada dizajniramo odreenu klasu, ponekad je kreiramo s ciljem da druge klase naslijede njene osobine, dok su mnogo ee situacije kada nismo sigurni hoe li itko ikada poeljeti naslijediti osobine te klase i tada se pitamo kako na najbolji nain dizajnirati kvalitetnu klasu. Ukoliko ve u dizajnu smatramo ili elimo onemoguiti nasljeivanje, C# nam nudi kljunu rije sealed. Klasa koja ima ovaj predznak predstavlja list klasu (eng. leaf class) to znai da na stablu projekta nee biti mogue da ita nikne iz nje, pjesniki reeno. U programerskoj zajednici postoji izvjesni strah oko koritenja ove kljune rijei koja klasu doslovno zapeati pa je u velikoj veini sluajeva programeri i ne koriste. Ali zlatno pravilo glasi da svaku klasu oznaimo kao sealed na samom poetku dizajniranja jer emo se jedino ovako osigurati da nasljeivanje bude dozvoljeno samo onda kada je to doista i potrebno. Kvalitetnu baznu klasu samo iskusni programeri mogu dizajnirati tako da u potpunosti slui svojoj svrsi, ali koristei ovu metodu bit emo mnogo blie tom cilju. Sigurni smo da su vam se sada poremetili sve dizajnerske koncepcije, meutim nije sve tako strano. Prilikom dizajniranja neke klase uvijek se vodite sljedeim pravilom: Ako neka klasa treba biti bazna, onda to treba biti od samog poetka. Ovo znai da ako se naete u situaciji da neku klasu ponete kreirati kao sealed, a onda u sred posla zakljuite da bi ona mogla biti i bazna klasa, to je sigurno znak da ste napravili greku u konceptu (dizajnu) aplikacije. Jedino rjeenje je redizajn aplikacije, jer ako klasu puko pretvorite u obinu i dozvolite nasljeivanje, u budunosti ete se sigurno dovesti u slijepu ulicu. Pogledajmo kako izgleda obina sealed klasa.using System; sealed class MojaKlasa { public int x; public int y; } class Skola { public static void Main() { MojaKlasa mK = new MojaKlasa(); mK.x = 110; mK.y = 150; Console.WriteLine("x = {0}, y = {1}", mK.x, mK.y); } }

Linux svakodnevnica 04/11: to smo pronali u oujku 2011. (0) Ispriajte priu o sebi Foto-prie su jo prole godine postale hit u svijetu. Naime, radi se o tome da []7 MONTHS AGO

kola Silverlighta: Koraci u kreiranju out-of-browser aplikacije (0) Jedna od najuzbudljivijih mogunosti je predstavljena u Silverlight 3 verziji, a poboljana je u Silverlight 4. Naravno, radi se o []7 MONTHS AGO

kola C#: Tipovi klasa (2) (0) Razlomi se u fajlove Oblast o klasama emo zavriti objanjavajui indeksere, parcijalne klase i metode, statike klase, a spomenut []7 MONTHS AGO

Linux svakodnevnica 03/11 (0) KDE 4.6, novi light browser, fenomenalna P2P aplikacija, Dokirajte docky Za one koji ne znaju, Docky je napredni []7 MONTHS AGO

kola Silverlighta: Mrena komunikacija (4) (0) Pravimo chat aplikaciju Iako veina aplikacija koristi proxy servis ili jednu od klasa za skidanje podataka putem HTTP(S) protokola, []7 MONTHS AGO SHOW MORE

Klasa koje su po svojoj logici potpuno suprotne sealed klasama su apstraktne klase (eng. abstract class). One su od samog poetka dizajnirane da budu samo bazne klase i oznaavamo ih kljunom rijei abstract. Kada kompajler naie na ovu rije, on zna da je ta klasa dizajnirana da bude bazna i zbog toga nee dozvoliti da se u njoj kreira niti jedna linija koda. Pogledajmo primjer.

LOG INHello Guest. Login below if you have an account User Password Remember me Lost your password?

May December 2011Mon Tue Wed Thu Fri Sat Sun

1

2

3

4

1 od 4

2.12.2011. 23:38

kola C#: Tipovi klasa (1) | Asc Blog

http://alzan.info/skola-c-tipovi-klasa-1/

namespace Skola_C_Sharp_Mar11 { public abstract class GeometrijskiOblik { public abstract void Crtaj(); } public class Krug : GeometrijskiOblik { public override void Crtaj() { // Nesto se crta } } public class Klasa { static void Main() { Krug krug = new Krug(); krug.Crtaj(); //Ovo nece raditi!! //Error: Cannot create an instance of the abstract class or interface GeometrijskiOblik oblik = new GeometrijskiOblik();

Mon

Tue

Wed

Thu

Fri

Sat

Sun

5 12 19 26

6 13 20 27

7 14 21 28

8 15 22 29

9 16 23 30

10 17 24 31

11 18 25

RECENT COMMENTSben 10 igre Hvala! Moja klikna oboava ove igre.8 MONTHS AGO

}

}

}

Alan Must have: - Odlina ekstenzija za Nautilus (4) - Ekstenzija za rad sa slikama (5+)8 MONTHS AGO

Gledajui logiki, nema smisla kreirati objekt GeometrijskiOblik jer u prirodi on nije nita. Smisao tek dobiva kada kreiramo konkretan geometrijski oblik, kao na primjer krug. Zbog toga je klasa GeometrijskiOblik apstraktna, odnosno ne dozvoljava instanciranje. U klasi Krug ste mogli primijetiti da smo iskoristili metodu Crtaj(), ali da ispred nje stoji kljuna rije override. Ona govori da je u klasi Krug napisana implementacija te metode. tovie, mi smo je morali implementirati jer smo naslijedili apstraktnu klasu. Zakljuak je da kada elimo natjerati klijenta da implementira sve metode neke klase, takvu klasu emo uiniti apstraktnom. Jo jedna prednost apstraktne klase je da njene metode ne moraju imati implementaciju, nego je dovoljna definicija metode.public abstract void Crtaj();

Nedim Sabic Pohvale za blog. =) Pozdrav8 MONTHS AGO

Wannabe Ovaj blog stvarno puno vrijedi. Samo nastavite s dobrim poslom. Svaka ast!9 MONTHS AGO

Oni koji dolaze iz svijeta programskog jezika C++ su navikli da im taj jezik dozvoljava implementiranje apstraktnih metoda. Takvi trebaju znati da su dizajneri jezika C# odluili izbaciti tu mogunost jer se apstraktna implementacija ionako veoma rijetko koristila u originalnom obliku. Trei tipovi klasa su ugnijeene klase (eng. nested class). To su one klase koje su definirane unutar granica druge klase (otuda im i ime). Ovdje emo samo spomenuti da se po definicije klase koje definiramo na normalan nain nazivaju neugnijeene klase (eng. non-nested class). Ugnijeene klase imaju neke posebne mogunosti i najee ih koristimo u situacijama kada trebamo pomone klase (tzv. helper klase) koje e obaviti neki posao u ime klase u kojoj se nalaze. Na primjer, imamo li klasu koja uva kolekciju objekata i nama je potrebno iterirati kroz te objekte i vanjskim korisnicima dozvoliti kreiranje markera ili kursora koji e im biljeiti dokle su doli u iteraciji. Koritenjem ugnijeenih klasa mi emo sprijeiti korisnike da imaju direktnu referencu na objekte iz kolekcije, a omoguit emo veu fleksibilnost u promjeni unutarnjeg stanja klase bez razbijanja koda kojeg koristi matina klasa. Ugnijeene klase imaju pristup svim vidljivim lanovima matine klase, ak i privatnim lanovima. Pogledajmo malo opirniji primjer.

TAGS (Show All)

public abstract class GeometrijskiOblik { public abstract void Crtaj(); } public class Kvadrat : GeometrijskiOblik { public override void Crtaj() { Console.WriteLine("Kvadrat.Crtaj()"); } } public class Krug : GeometrijskiOblik { public override void Crtaj() { Console.WriteLine("Krug.Crtaj()"); } } public class Crtanje : IEnumerable

2 od 4

2.12.2011. 23:38

kola C#: Tipovi klasa (1) | Asc Blog{

http://alzan.info/skola-c-tipovi-klasa-1/

} public class Klasa { static void Main() { Kvadrat kvadrat = new Kvadrat(); Krug krug = new Krug(); Crtanje crtanje = new Crtanje(); crtanje.Dodaj(kvadrat); crtanje.Dodaj(krug); foreach (GeometrijskiOblik go in crtanje) { go.Crtaj(); } } }

private ArrayList oblici; private class Iterator : IEnumerator { public Iterator(Crtanje crtanje) //nadklasa kao parametar { this.crtanje = crtanje; _trenutni = -1; } public void Reset() { _trenutni = -1; } public bool MoveNext() { ++_trenutni; if (_trenutni < crtanje.oblici.Count) return true; return false; } public object Current { get { return crtanje.oblici[_trenutni]; } } private Crtanje crtanje; //referenca na objekt nadklase private int _trenutni; } public Crtanje() { oblici = new ArrayList(); } public IEnumerator GetEnumerator() { return new Iterator(this); } public void Dodaj(GeometrijskiOblik gOblik) { oblici.Add(gOblik); }

Radi ovoga primjera morali smo iskoristiti interfejse IEnumerable i IEnumerator koje ovdje nemamo prostora detaljno opisivati, ali emo zato interfejsima posvetiti seriju detaljnih lanaka u jednoj od narednih dijelova ove kole. Nas ovdje najvie zanima ugnijeena klasa Iterator. Ona je oznaena kao private, a to mogu samo ugnijeene klase, jer sve neugnijeene klase mogu biti samo public ili internal. Kao to vidimo, ugnijeena klasa kreira referencu na objekt svoje matine klase (nadklase) Crtanje. U njega zatim sprema objekt svoje nadklase koji joj je proslijeen kao parametar vlastitog konstruktora. Takoer je vano primijetiti da ugnijeena klasa bez ikakvih problema pristupa privatnom elementu oblici kao i njegova vlastita klasa. Kako je ugnijeena klasa privatna, kako emo onda kreirati njenu instancu? Pa, i neemo, nego je to doputeno uraditi samo njenoj nadklasi, klasi Crtanje, koja to ini preko metode GetEnumerator(). U sluajevima kada su ugnijeene klase oznaene kao public, instanciraju se preko svoje nadklase, kao da se nalaze unutar nekog namespacea. Na primjer,public class Nadklasa { public class NestedKlasa { } } public class NasaKlasa { static void Main() { Nadklasa.NestedKlasa nestedKlasa = new Nadklasa.NestedKlasa(); } }

Postoje veoma rijetke situacije kada nasljeujemo klasu koja ima ugnijeenu klasu, te u novoj klasi moramo kreirati ugnijeenu klasu istog imena kao u baznoj klasi. I ovdje moemo koristiti kljunu rije new.public class Nadklasa { public class NestedKlasa{ } public class Izvedena : Nadklasa { private new class NestedKlasa { }

}

}

Moramo napomenuti da su ovo samo teoretske situacije i da one mogu izbjei u 99% sluajeva, a da ne

3 od 4

2.12.2011. 23:38

kola C#: Tipovi klasa (1) | Asc Blog

http://alzan.info/skola-c-tipovi-klasa-1/

govorimo da u 99% ovakvih sluajeva ovakva situacija mirie na lo dizajn. Jo jednom napominjemo zlatno pravilo programiranja: Ako ti programski jezik neto dozvoljava, to nikako ne znai da to treba i uraditi. Iduu put emo nastaviti upoznavati se s tipovima klasa u programskom jeziku C# te emo vidjeti to su indekseri, parcijalne klase, parcijalne metode, statike klase i singleton pattern. Share on Facebook.NET 2011 C#

This entry was posted by Alan on May 2, 2011 at 18:15, and is filed under kola C#. Follow any responses to this post through RSS 2.0.You can leave a response or trackback from your own site.

Related Posts

Comments (0)

4 od 4

2.12.2011. 23:38