You are on page 1of 98

TRNG AI HOC A LAT

KHOA TOAN - TIN HOC

PHAM QUANG HUY

LAP TRNH HNG OI TNG


(Bai Giang Tom Tat)

-- Lu hanh noi bo -a Lat 2008

Lp trnh hng i tng

Phm Quang Huy

2008

BI GING LP TRNH HNG I TNG


LI M U
Lp trnh theo phng php hng i tng l mt phng php lp trnh tng i mi (xut hin t nhng nm 1990) v c hu ht cc ngn ng lp trnh hin nay h tr. Gio trnh ny s gii thiu cc c trng ca phng php lp trnh hng i tng nh tnh ng gi, tnh k tha v tnh a hnh. Chng ti chn ngn ng C# minh ha, v y l ngn ng lp trnh hng i tng d hc v ph dng nht hin nay. Sau khi hon tt gio trnh ny, sinh vin s bit c cch m hnh ha cc lp i tng trong th gii thc thnh cc lp i tng trong C# v cch phi hp cc i tng ny gii quyt vn ang quan tm. Trc khi tm hiu chi tit v phng php lp trnh hng i tng, sinh vin nn c trc phn ph lc A-C bn v ngn .ng C# lm quen vi cc kiu d liu, cc cu trc iu khin trong ngn ng C#. Sau khi nm bt c phng php lp trnh hng i tng, sinh vin nn c thm phn ph lc BBit l c th vit chng trnh c tnh dung th li cao hn.

Lp trnh hng i tng

Phm Quang Huy

2008

MC LC
I. Gii thiu lp trnh hng i tng....................................................................4 I.1. Lp trnh hng th tc (Pascal, C, ) ........................................................4 I.2. Lp trnh hng i tng (Object-oriented programming )........................4 I.2.1. Tnh ng gi ........................................................................................5 I.2.2. Tnh k tha..........................................................................................5 I.2.3. Tnh a hnh..........................................................................................5 I.2.4. u im ca phng php lp trnh hng i tng ....................5 II. Lp v i tng .................................................................................................5 II.1. nh ngha lp..............................................................................................5 II.2. To i tng ...............................................................................................7 II.3. Phng thc to lp (constructor) ca mt i tng .................................9 II.4. Phng thc to lp sao chp (copy constructor) ......................................11 II.5. Qu ti hm ................................................................................................12 II.6. S dng cc thnh vin tnh .......................................................................15 II.7. Tham s ca phng thc ..........................................................................18 II.7.1. Truyn tham tr bng tham s kiu gi tr .....................................18 II.7.2. Truyn tham chiu bng tham s kiu gi tr vi t kha ref......19 II.7.3. Truyn tham chiu vi tham s kiu gi tr bng t kha out.....20 II.7.4. Truyn tham tr vi tham s thuc kiu tham chiu.....................21 II.7.5. Truyn tham chiu vi tham s thuc kiu d liu tham chiu ...24 II.8. Tham chiu this ..........................................................................................25 II.9. ng gi d liu vi thuc tnh (property) ................................................27 II.10. Ton t (operator) ....................................................................................30 II.11. Indexer (Ch mc) ....................................................................................34 II.12. Lp lng nhau ..........................................................................................38 II.13. Cu hi n tp ..........................................................................................38 II.14. Bi tp tng hp .......................................................................................39 III. K tha (inheritance) v a hnh (polymorphism)...........................................40 III.1. Quan h chuyn bit ha v tng qut ha ...............................................40 III.2. K tha......................................................................................................40 III.3. Gi phng thc to lp ca lp c s .....................................................42 III.4. nh ngha phin bn mi trong lp dn xut ..........................................44 III.5. Tham chiu thuc lp c s......................................................................46 III.6. Phng thc o (virtual method) v tnh a hnh (polymorphism) ..........48 III.7. Lp Object ................................................................................................55 III.8. Lp tru tng(abstract)...........................................................................55 III.9. Giao din (interface) .................................................................................58 III.9.1. Thc thi giao din............................................................................58 III.9.2. Hy i tng ..................................................................................60 III.9.3. Thc thi nhiu giao din .................................................................64 III.9.4. M rng giao din ...........................................................................66 III.9.5. Kt hp giao din ............................................................................67

Lp trnh hng i tng

Phm Quang Huy

2008

III.9.6. Kim tra i tng c h tr giao din hay khng bng ton t is ........................................................................................................................67 III.9.7. Cc giao din Icomparer, IComparable (giao din so snh) v ArrayList ......................................................................................................67 III.9.8. Cu hi n tp..................................................................................74 III.9.9. Bi tp tng hp ..............................................................................74 PH LC A - C BN V NGN NG C# I. To ng dng trong C#.......................................................................................75 I.1. Son tho chng trnh Hello World.......................................................76 I.2. Bin dch v chy chng trnh Hello World ..........................................77 II. C s ca ngn ng C# .....................................................................................77 II.1. Kiu d liu................................................................................................77 II.1.1. Cc kiu xy dng sn trong C#: ....................................................77 II.1.2. Hng ...................................................................................................78 II.1.3. Kiu lit k.........................................................................................79 II.1.4. Kiu chui..........................................................................................80 II.2. Lnh r nhnh.............................................................................................80 II.2.1. Lnh if ................................................................................................80 II.2.2. Lnh switch........................................................................................81 II.2.3. Lnh goto ...........................................................................................82 II.2.4. Lnh lp while ...................................................................................83 II.2.5. Lnh dowhile .................................................................................83 II.2.6. Lnh for .............................................................................................84 II.2.7. Lnh foreach......................................................................................85 II.2.8. Lnh continue v break....................................................................85 II.3. Mng...........................................................................................................86 II.3.1. Mng mt chiu.................................................................................86 II.3.2. Mng nhiu chiu..............................................................................88 II.3.3. Mt s v d v mng nhiu chiu ...................................................89 II.4. Khng gian tn (namespace)......................................................................90 PH LC B - BIT L I. Nm ra bit l .....................................................................................................92 II. Bt ngoi l........................................................................................................92 III. Khi finally ......................................................................................................95 IV. Mt s ngoi l khc:.......................................................................................95 V. Mt s v d khc..............................................................................................96

Lp trnh hng i tng

Phm Quang Huy

2008

I. Gii thiu lp trnh hng i tng


I.1. Lp trnh hng th tc (Pascal, C, )
Trong phng php lp trnh th tc, chng trnh l mt h thng cc th tc, hm. Tc l, khi vit chng trnh, ta phi xc nh chng trnh lm nhng cng vic (thao tc) no? Mi thao tc gm nhng thao tc con no? T mi thao tc s tng ng vi mt hm. Nh vy, lp trnh theo phng php th tc l xc nh cc hm, nh ngha cc hm v gi cc hm ny gii quyt vn c t ra. Mt trong nhng nhc im ca phng php ny l mi hm u c th truy cp bin ton cc hoc d liu c th phi truyn qua rt nhiu hm trc khi n c hm thc s s dng hoc thao tc trn n. iu ny dn n s kh kim sot khi chng trnh qu ln v khi pht trin, sa i chng trnh. Mt kh khn na l vic nh cc hm xy dng sn khi s lng hm qu nhiu.

I.2. Lp trnh hng i tng (Object-oriented programming )


Phng php ny ly i tng lm nn tng xy dng chng trnh. i tng l s gn kt gia d liu ca i tng v cc hm (cn gi l phng thc) thao tc trn cc d liu ny. i tng = D liu + Phng thc Khi vit chng trnh theo phng php hng i tng ta phi tr li cc cu hi: - Chng trnh lin quan ti nhng lp i tng no? - Mi i tng cn c nhng d liu v thao tc no? - Cc i tng quan h vi nhau nh th no trong chng trnh? T ta thit k cc lp i tng v t chc trao i thng tin gia cc i tng, ra lnh i tng thc hin cc nhim v thch hp. V d : - i tng chui : D liu: mng cc k t. Thao tc: tnh chiu di, ni hai chui... - i tng stack : D liu: s nguyn hay k t , hay mt kiu d liu nh ngha. Thao tc: to lp stack, a mt phn t vo nh, loi b phn t nh Cc ngn ng lp trnh hng i tng u c ba c im chung l tnh ng gi (encapsulation), tnh k tha (inheritance ) v tnh a hnh (polymorphism).

Lp trnh hng i tng

Phm Quang Huy

2008

I.2.1. Tnh ng gi
Tnh ng gi l k thut rng buc d liu v phng thc thao tc trn d liu vo trong lp d kim sot, lm tng tnh tru tng ca d liu. Lp i tng ch cung cp mt s phng thc giao tip vi mi trng bn ngoi, che du i ci t thc s bn trong ca lp.

I.2.2. Tnh k tha


Tnh k tha l qu trnh nh ngha mt lp i tng (gi l lp dn xut) da trn lp khc nh ngha gi l lp c s nhm tn dng cc on m chng trnh c. Lp mi ch vic b sung cc thnh phn ring ca chnh n hoc nh ngha li cc hm ca lp c s khng cn ph hp vi n.

I.2.3. Tnh a hnh


Tnh a hnh l tng s dng mt giao din chung cho nhiu phng thc khc nhau, da trn c ch lin kt mun. Tc l phng thc c th s c xc nh vo lc chy chng trnh, ty thuc vo i tng ang thc thi giao din . iu ny lm gim ng k phc tp ca chng trnh.

I.2.4. u im ca phng php lp trnh hng i tng


Tnh ng gi lm gii hn phm vi s dng ca cc bin, nh vic qun l gi tr ca bin d dng hn, vic s dng m an ton hn. Phng php ny lm cho tc pht trin cc chng trnh mi nhanh hn v m c ti s dng v ci tin d dng, uyn chuyn. Phng php ny tin hnh tin trnh phn tch, thit k chng trnh thng qua vic xy dng cc i tng c s tng hp vi cc i tung thc t. iu ny lm cho vic sa i d dng hn khi cn thay i chng trnh.

II. Lp v i tng
Chng trnh l mt h thng cc i tng. Xy dng mt chng trnh l nh ngha cc lp i tng, sau khai bo cc i tng v t chc cc i tng thc thi nhim v ca mnh.

II.1. nh ngha lp
Mt lp l mt kiu cu trc m rng, l mt kiu mu chung cho cc i tng thuc cng mt loi. Nh vy, thnh phn ca lp gm cu trc d liu m t cc i tng trong lp v cc phng thc (cn gi l hm, hnh vi, thao tc) m mi bin i tng ca lp u c. Cc phng thc ny thao tc trn cc thnh phn d liu c khai bo trong lp.

Lp trnh hng i tng

Phm Quang Huy

2008

Vic nh ngha lp th hin tnh ng gi ca phng php lp trnh hng i tng. C php nh ngha lp:
[ McTruyCp] class TnLp [:LpCS] { - Khai bo cc thnh phn d liu (khai bo bin) - nh ngha cc phng thc, thuc tnh ca lp }

Ch :
D liu v phng thc ca lp c gi chung l thnh phn ca lp.

Cc thnh phn d liu c xem nh bin ton cc i vi cc phng


thc ca lp, tc l cc phng thc ca lp c quyn truy cp n cc thnh phn d liu ny m khng cn phi khai bo li trong tng phng thc.

Mc truy cp
Thng thng, mc truy cp (access-modifiers) ca mt lp l public. Ngoi ra cc thnh phn ca lp cng c mc truy cp ring. Mc truy cp ca mt thnh phn cho bit loi phng thc no c php truy cp n n, hay ni cch khc n m t phm vi m thnh phn c nhn thy. Bng sau lit k cc kiu mc truy cp ca cc thnh phn trong mt lp: Mc truy cp public private protected ngha Thnh vin c nh du public c nhn thy bi bt k phng thc no ca lp khc. Ch c cc phng thc ca lp A mi c php truy cp n thnh phn c nh du private trong cc lp A. Ch c cc phng thc ca lp A hoc ca lp dn xut t A mi c php truy cp n thnh phn c nh du protected trong lp A. Cc thnh vin internal trong lp A c truy xut trong cc phng thc ca bt k lp trong khi kt hp (assembly) ca A Tng ng vi protected or internal

internal

protected internal

Ch :
Mc nh, khi khng ch c th mc truy cp th thnh vin ca lp c xem l c mc truy cp private.

Lp trnh hng i tng

Phm Quang Huy

2008

Mc truy cp internal cho php cc phng thc ca cc lp trong cng mt khi kt hp (assembly) vi lp ang nh ngha c th truy cp. Cc lp thuc cng mt project c th xem l cng mt khi kt hp.

II.2. To i tng
Lp m t cu trc chung ca mt nhm i tng no , ngc li, mt i tng l mt trng hp c th ca mt lp (cn gi l mt th hin ca mt lp). V i tng l mt kiu tham chiu nn d liu thc s c to trn vng nh Heap v ta phi dng ton t new cp pht cho i tng. K t lc i tng c cp pht b nh, ta c th gn cc gi tr cho cc bin thnh vin, gi thi hnh cc phng thc ca i tng ny. Thng th ta ch vic khai bo v cp pht i tng, vic hy vng nh m i tng chim gi khi i tng mt hiu lc s do b dn rc ca trnh bin dch m nhim. C php khai bo i tng v cp pht vng nh cho i tng: TnLp TnBiniTng; TnBiniTng = new TnLp(DanhSchiS); hoc TnLp TnBiniTng = new TnLp(DanhSchiS); Ch : Sau khi khai bo bin i tng th bin ch l mt con tr. Sau khi cp pht bng t kha new th bin tr ti mt i tng thc s.

V d:
Chng trnh nhp chiu di, chiu rng ca hnh ch nht v xut ra din tch, chu vi ca hnh ch nht.
using System; namespace LopDoiTuongHCN { class HCN { protected float Dai, Rong; public float ChuVi() { return (Dai + Rong )*2; } public float DienTich() { return Dai* Rong; }

Lp trnh hng i tng

Phm Quang Huy

2008

public void Nhap() { Console.WriteLine("Nhap chieu dai: "); Dai = float.Parse(Console.ReadLine()); Console.WriteLine("Nhap chieu rong: "); Rong = float.Parse(Console.ReadLine()); } public void Xuat() { Console.WriteLine("Hinh chu nhat: Dai = {0}, Rong = {1}", Dai, Rong); }

class Application { static void Main(string[] args) { HCN h; h = new HCN(); h.Nhap(); h.Xuat(); Console.WriteLine("Chu vi hinh chu nhat: {0}", h.ChuVi()); Console.WriteLine("Dien tich hinh chu nhat: {0}", h.DienTich()); Console.ReadLine(); } }

Trong v d trn, ta nh ngha mt lp cc hnh ch nht (HCN), mi i tng thuc lp ny c thnh phn d liu l chiu di v chiu rng v c cc phng thc nh: nhap(), xuat(), DienTich(), ChuVi(). Sau , trong hm Main() ta khai bo mt i tng hnh ch nht tn l h, cp pht vng nh cho i tng ny v gi thc hin cc phng thc ca n. Ch : Nu ta b i t kha public ng trc mi phng thc ca lp HCN th hm Main() s khng th truy cp n cc phng thc ca i tng h v trnh bin ch s bo li v khi cc phng thc ny c mc truy cp l private. Bi tp 1: xy dng lp hnh ch nht vi thnh phn d liu l ta gc trn bn tri (x1, y1), ta gc di bn phi (x2, y2) v cc phng thc tnh chiu di, chiu rng, din tch, chu vi ca hnh ch nht v phng thc v hnh ch nht bng cc k t * ra mn hnh.

Lp trnh hng i tng

Phm Quang Huy

2008

Bi tp 2: vit chng trnh xy dng lp phn s v cc thao tc trn phn s nh +, -, *, /, tm c s chung ln nht ca t v mu, rt gn, cng phn s vi mt s nguyn. Gi :
class PhanSo { int Tu, Mau; // private members public void NhapPhanSo() { // an m nhp t s v mu s. } public void GanGiaTri(int TuSo, int MauSo) { // an m gn gi tr cho t s v mu s. } public void XuatPhanSo() { // an m xut t s v mu s dng (a/b) } public PhanSo Cong(PhanSo PS2) //cng phn s hin hnh vi phn s PS2 v tr v mt phn s { PhanSo KetQua = new PhanSo(); KetQua.TS = Tu * PS2.Mau + Mau* PS2.Tu; KetQua.MS = Mau * PS2.Mau; return KetQua; } public PhanSo Tru(PhanSo PS2) { // an m tru phn s hin hnh vi phn s PS2 v tr v mt phn s }

cc phng thc khc

II.3. Phng thc to lp (constructor) ca mt i tng


Phng thc to lp ca mt i tng c cc tnh cht sau: c gi n mt cch t ng khi mt i tng ca lp c to ra. Dng khi ng cc gi tr u cho cc thnh phn d liu ca i tng thuc lp. Tn phng thc ging vi tn lp v c mc truy cp l public. Khng c gi tr tr v.

Lp trnh hng i tng

Phm Quang Huy

2008

Trc khi phng thc to lp chy, i tng cha thc s tn ti trong b nh, sau khi to lp hon thnh, b nh lu tr mt th hin hp l ca lp. Khi ta khng nh ngha mt phng thc to lp no cho lp, trnh bin dch s t ng to mt phng thc to lp mc nh cho lp v khi to cc bin bng cc gi tr mc nh. Thng thng ta nn nh ngha mt phng thc to lp cho lp v cung cp tham s cho phng thc to lp khi to cc bin cho i tng ca lp. Ch rng, nu lp c phng thc to lp c tham s th khi khi to i tng (bng ton t new) ta phi truyn tham s cho phng thc to lp theo c php: TnBiniTng = new TnLp(DanhSchiS);

V d:
V d sau xy dng mt lp Time trong c mt phng thc to lp nhn tham s c kiu DateTime (kiu xy dng sn ca trnh bin dch) lm tham s khi gn cho cc thnh phn d liu ca i tng thuc lp Time.
using System; public class Time { // private member variables int Year; int Month; int Date; int Hour; int Minute; int Second = 30; public void DisplayCurrentTime( ) { Console.WriteLine("Current time is: {0}/{1}/{2} {3}:{4}:{5}",Month, Date, Year, Hour, Minute, Second); } public Time(System.DateTime dt)// constructor { Console.WriteLine("Ham constructor tu dong duoc goi!"); Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; } }

10

Lp trnh hng i tng

Phm Quang Huy

2008

class DateTimeConstrcutorApp { static void Main( ) { System.DateTime currentTime System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime( ); Console.ReadLine(); } }

Kt qu ca chng trnh:

Hy nhn F11 chy debug hiu r hn qu trnh khi to i tng t, gi thc hin hm constructor ca t. Ch rng, ta c tnh gn gi tr mc nh l 30 cho bin Second bin Second ca mi i tng thuc lp Time khi mi c to ra u c gi tr l 30.

II.4. Phng thc to lp sao chp (copy constructor)


Phng thc to lp sao chp khi gn gi tr cho i tng mi bng cch sao chp d liu ca i tng tn ti (cng kiu). V d, ta mun truyn mt i tng Time t1 khi gn cho i tng Time t2 mi vi mc ch lm cho t2 c gi tr ging t1, ta s xy dng phng thc to lp sao chp ca lp Time nh sau:
public Time(Time existingTimeObject) { Year Month Date Hour Minute Second } = existingTimeObject.Year; = existingTimeObject.Month; = existingTimeObject.Date; = existingTimeObject.Hour; = existingTimeObject.Minute; = existingTimeObject.Second;

Khi c php khai bo t2 l:


Time t2 = new Time(t1).

11

Lp trnh hng i tng

Phm Quang Huy

2008

Khi hm copy constructor c gi v gn gi tr ca t1 cho t2. Bi tp 1: Xy dng lp HocSinh (h tn, im ton, im vn) vi cc phng thc: khi to, xut, tnh im trung bnh. Bi tp 2: Xy dng li lp PhanSo phn trc vi phng thc khi to gm 2 tham s. Bi tp 3: Xy dng lp ngn xp Stack lu tr d liu s nguyn bng mng vi cc thao tc c bn nh: Push, Pop, kim tra trn stack, kim tra stack rngD liu ca mt i tng thuc lp Stack gm: Data (mng s nguyn), Size (kch thc ca mng Data), Top (ch s ca phn t nm trn nh Stack). Bi tp 4: Xy dng lp hng i Queue lu tr d liu s nguyn bng mng vi cc thao tc trn hng i.

II.5. Qu ti hm
Qu ti hm l nh ngha cc hm cng tn nhng khc tham s hoc kiu tr v. Khi chy chng trnh, ty tnh hung m hm thch hp nht c gi. V d 1: Minh ha vic qu ti phng thc to lp linh ng trong cch to i tng. Lp Date c 3 phng thc to lp c tc dng ln lt nh sau: public Date(): khi to i tng thuc lp Date vi gi tr mc nh l 1/1/1900. public Date(int D, int M, int Y): khi to cc gi tr Day, Month, Year ca i tng thuc lp Date bng ba tham s D, M, Y. public Date(Date ExistingDate): y l hm copy constructor, khi to i tng mi thuc lp Date bng mt i tng cng kiu tn ti. public Date(System.DateTime dt): khi to i tng thuc lp Date bng d liu ca i tng thuc lp System.DateTime (c sn).
using System; public class Date { private int Year; private int Month; private int Day; public void Display( ) { Console.Write("{0}/{1}/{2}", Day, Month, Year); } // constructors 1/1/1900 public Date() without argument --> set date to

12

Lp trnh hng i tng

Phm Quang Huy

2008

{ Console.WriteLine("Constructor khong tham so!"); Year = 1900; Month = 1; Day = 1;

} class DateOverLoadConstructorApp { static void Main(string[] args) { System.DateTime currentTime System.DateTime.Now; Date t1 = new Date();// t1 = 1/1/1900 Console.Write("t1: "); t1.Display(); Console.WriteLine(); Date t2 = new Date(30, 4, 2000); Console.Write("t2: "); t2.Display( ); Console.WriteLine(); Date t3 = new Date(currentTime);

// constructors with DateTime argument public Date(System.DateTime dt) { Console.WriteLine("Constructor voi tham so la mot doi tuong DateTime!"); Year = dt.Year; Month = dt.Month; Day = dt.Day; } // constructors with 3 int arguments public Date(int D, int M, int Y) { Console.WriteLine("Constructor co 3 tham so!"); Year = Y; Month = M; Day = D; } // copy constructors public Date(Date ExistingDate) { Console.WriteLine("Copy constructor!"); Year = ExistingDate.Year; Month = ExistingDate.Month; Day = ExistingDate.Day; }

13

Lp trnh hng i tng

Phm Quang Huy

2008

Console.Write("t3: "); t3.Display( ); Console.WriteLine(); Date t4 = new Date(t3); Console.Write("t4: "); t4.Display( ); Console.ReadLine(); } }

Kt qu ca chng trnh:

V d 2: Qu ti hm khi to ca lp phn s linh ng khi to ra cc i tng phn s. (Xem cch tr v ca hm public PhanSo Cong(PhanSo PS2)).

class PhanSo { int Tu, Mau; // Hm khi to gn gi tr c nh public PhanSo() { Tu = 0; Mau = 1; } public PhanSo(int x) { Tu = x; Mau = 1; } public PhanSo(int t, int m) { Tu = t; Mau = m; }

public void XuatPhanSo() { Console.Write("({0}/{1})", Tu, Mau); } public PhanSo Cong(PhanSo PS2) {

14

Lp trnh hng i tng

Phm Quang Huy

2008

} }

int TS = Tu * PS2.Mau + Mau * PS2.Tu; int MS = Mau * PS2.Mau; //Gi hm khi to 2 tham s PhanSo KetQua = new PhanSo(TS, MS); return KetQua;

class Program { static void Main(string[] args) { p1.XuatPhanSo(); Console.WriteLine(); PhanSo p2 = new PhanSo(3); // p2 = 3/1 p2.XuatPhanSo(); Console.WriteLine(); Console.WriteLine("Nhap tu so: "); int Ts = int.Parse(Console.ReadLine()); Console.WriteLine("Nhap mau so: "); int Ms = int.Parse(Console.ReadLine()); PhanSo p3 = new PhanSo(Ts, Ms); p3.XuatPhanSo(); Console.WriteLine(); p1 = p2.Cong(p3); p1.XuatPhanSo(); Console.ReadLine();

Ta c th nh ngha phng thc qu ti ch khc nhau t kha ref hoc out nhng khng th c hai phng thc ch khc nhau hai t kha ref v out. Chng hn, vic qu ti nh sau l hp l:
class MyClass { public void MyMethod(int i) {i = 10;} public void MyMethod(ref int i) {i = 10;} }

nhng vic qu ti nh sau l khng hp l:


class MyClass { public void MyMethod(out int i) {i = 10;} public void MyMethod(ref int i) {i = 10;} }

II.6. S dng cc thnh vin tnh


D liu v phng thc ca mt lp c th l thnh vin thuc th hin ca lp (i tng) hoc thnh vin tnh (c t kha static ng trc). Thnh vin th hin c kt hp ring vi tng i tng ca lp. Nh vy, trong cng mt lp, 15

Lp trnh hng i tng

Phm Quang Huy

2008

cc i tng khc nhau c nhng bin d liu cng tn, cng kiu nhng c cp pht cc vng nh khc nhau v gi tr ca chng cng c th khc nhau. Trong khi , thnh vin tnh (bin, phng thc) c coi l phn chung ca cc i tng trong cng mt lp. Mi i tng thuc lp u c th truy cp thnh vin tnh. Ni cch khc, cc thnh vin th hin c xem l ton cc trong phm vi tng i tng cn thnh vin tnh c xem l ton cc trong phm vi mt lp. Vic truy cp n thnh vin tnh phi thc hin thng qua tn lp (khng c truy cp thnh vin tnh thng qua i tng) theo c php: TnLp.TnThnhVinTnh Ch : Phng thc tnh thao tc trn cc d liu tnh v khng th truy cp trc tip cc thnh vin khng tnh. Ngoi ra, ta c th nh ngha mt phng thc to lp tnh, phng thc ny dng khi gn gi tr cho bin tnh ca lp v s chy trc khi th hin ca u tin lp c to. Phng thc to lp tnh hu dng khi chng ta cn ci t mt s cng vic m khng th thc hin c thng qua chc nng khi dng v cng vic ci t ny ch c thc hin duy nht mt ln. V d: Bin thnh vin tnh c dng vi mc ch theo di s th hin hin ti ca lp.
using System; public class Cat { private static int SoMeo = - 6; // bien tinh private string TenMeo ; // Phuong thuc tao lap cua doi tuong public Cat( string T) { TenMeo = T ; Console.WriteLine("WOAW!!!! {0} day!", TenMeo); SoMeo++; } // Phuong thuc tao lap tinh static Cat( ) { Console.WriteLine("Bat dau lam thit meo !!!!"); SoMeo = 0; } public static void HowManyCats( ) { Console.WriteLine("Dang lam meo!",SoMeo); }

thit

{0}

con

16

Lp trnh hng i tng

Phm Quang Huy

2008

} public class Tester { static void Main( ) { Cat.HowManyCats( ); Cat tom = new Cat(Meo Tom ); Cat.HowManyCats( ); Cat muop = new Cat(Meo Muop); Cat.HowManyCats( ); //Tom.HowManyCats( ); ---> Error Console.ReadLine(); } }

Trong v d ny, ta xy dng lp Cat vi mt bin tnh SoMeo m s th hin (s mo) hin c v mt bin th hin TenMeo lu tn ca tng i tng mo. Nh vy, mi i tng tom, muop u c ring bin TenMeo v chng dng chung bin SoMeo. Ban u bin SoMeo c khi gn gi tr -6, nhng khi i tng tom (i tng u tin ca lp Cat) c to ra, phng thc to lp tnh static Cat() t ng thc hin v gn li gi tr 0 cho bin tnh ny. Mi khi mt i tng thuc lp Cat c to ra th phng thc to lp ca i tng ny truy cp n bin m SoMeo v tng gi tr ca bin ny ln mt n v. Nh vy, khi i tng tom c to ra, gi tr ca bin ny tng ln thnh 1, khi i tng muop c to ra, gi tr ca bin ny tng ln thnh 2. Phng thc tnh HowManyCats() thc hin nhim v xut bin tnh SoMeo thng qua tn lp bng cu lnh:
Cat.HowManyCats( );

Nu ta gi lnh sau th trnh bin dch s bo li:


tom.HowManyCats( );

Kt qu chy chng trnh:

Bi tp: Xy dng lp MyDate lu tr cc gi tr ngy, thng, nm vi cc phng thc: contructor vi 3 tham s, xut, kim tra nm nhun, tnh s ngy ca thng theo thng v nm, xc nh ngy k tip ca i tng ngy/ thng/ nm hin hnh. Gi : tnh s ngy ca thng ta c th dng mt mng tnh {31, 28, 31, 30, 31, 30, 31, 31, 30,31, 30,31} lu s ngy tng ng 17

Lp trnh hng i tng

Phm Quang Huy

2008

vi tng thng. Tuy nhin vi thng 2 th ty nm c nhun hay khng m ta tnh ra gi tr tng ng.

II.7. Tham s ca phng thc


Trong C#, ta c th truyn tham s cho phng thc theo kiu tham chiu hoc tham tr. Khi truyn theo kiu tham tr s xy ra vic sao chp gi tr t i s (tham s thc) sang tham s (tham s hnh thc). Cn khi truyn theo kiu tham chiu th i s v tham s u l mt. C# cung cp t kha ref truyn i s theo kiu tham chiu v t kha out truyn i s vo trong phng thc theo kiu tham chiu m khng cn khi gn gi tr u cho i s. Tuy nhin, khi dng t kha out th trong phng thc phi c lnh gn gi tr cho tham chiu ny. i vi nhng d liu kiu gi tr (int, long, float, char,), mun thay i gi tr ca chng thng qua vic truyn tham s cho hm, phng thc ta phi truyn theo kiu tham chiu mt cch tng minh bng t kha ref hoc out. i vi nhng d liu kiu tham chiu (i tng, mng), khi dng chng truyn i s m khng c t kha ref hoc out, ta ch c th lm thay i gi tr ca vng nh trong heap m chng tr ti nhng bn thn tham chiu (a ch vng nh) khng b thay i. Nu mun thay i vng nh m chng tr ti ta phi dng t kha ref hoc out mt cch tng minh.

II.7.1. Truyn tham tr bng tham s kiu gi tr


Trong v d sau y, a v b l hai tham s dng tham tr ca phng thc Swap nn mi s thay i ch din ra trong thn phng thc ny m khng nh hng n i s x, y c truyn vo.
using System; class PassingByVal { static void Swap(int a, int b) { int Temp = a; a = b; b = Temp; Console.WriteLine("Trong phuong {0}, b = {1}", a, b); }

thuc

Swap:

static void Main(string[] args) { int x = 3, y = 4; Console.WriteLine("Truoc khi goi phuong thuc Swap: x = {0}, y = {1}", x, y); Swap(x,y); Console.WriteLine("Sau khi goi phuong thuc Swap: x = {0}, y = {1}", x, y);

18

Lp trnh hng i tng

Phm Quang Huy

2008

Console.ReadLine(); } }

Kt qu chng trnh:

II.7.2. Truyn tham chiu bng tham s kiu gi tr vi t kha ref


phng thc Swap cho ra kt qu nh mong mun ta phi sa li tham s a, b theo kiu tham chiu nh sau:
static void Swap(ref int a, ref int b)

Khi ta gi phng thc Swap vi hai i s x, y theo c php:


Swap(ref x, ref y);

Mt phng thc ch c th tr v mt gi tr, do khi mun phng thc tr v nhiu gi tr, chng ta dng cch thc truyn tham chiu. V d, phng thc GetTime sau y tr v cc gi tr Hour, Minute, Second.
using System; public class { private private private Time int Hour; int Minute; int Second;

public void Display( ) { Console.WriteLine("{0}:{1}:{2}", Second); } public { h m s }

Hour,

Minute,

void GetTime(ref int h, ref int m, ref int s) = Hour; = Minute; = Second;

public Time(System.DateTime dt) { Hour = dt.Hour; Minute = dt.Minute;

19

Lp trnh hng i tng

Phm Quang Huy

2008

Second = dt.Second; } }

public class PassingParameterByRef { static void Main( ) { DateTime currentTime = DateTime.Now; Time t = new Time(currentTime); t.Display( ); int theHour = 0; int theMinute = 0; int theSecond = 0; t.GetTime(ref theHour,ref theMinute, ref theSecond); Console.WriteLine("Current time: {0}:{1}:{2}", theHour, theMinute, theSecond); Console.ReadLine(); } }

II.7.3. Truyn tham chiu vi tham s kiu gi tr bng t kha out


Mc nh, C# quy nh tt cc bin phi c gn gi tr trc khi s dng, v vy, trong v d trn, nu chng ta khng khi to cc bin theHour, theMinute bng gi tr 0 th trnh bin dch s thng bo li. T kha out cho php ta s dng tham chiu m khng cn phi khi gn gi tr u. Trong v d trn, ta c th sa phng thc GetTime thnh: public void GetTime(out int h, out int m, out int s) V hm Main() c sa li nh sau:
static void Main( ) { DateTime currentTime = DateTime.Now; Time t = new Time(currentTime); t.Display( ); /*int theHour = 0; int theMinute = 0; int theSecond = 0;*/ int theHour; int theMinute; int theSecond; t.GetTime(out theHour,out theMinute, out theSecond); Console.WriteLine("Current time: {0}:{1}:{2}", theHour, theMinute, theSecond);

20

Lp trnh hng i tng

Phm Quang Huy

2008

Console.ReadLine(); }

II.7.4. Truyn tham tr vi tham s thuc kiu tham chiu


Khi truyn tham s theo cch ny ta ch c th thc hin cc thao tc lm thay i cc d liu thnh phn ca i s. Cc thao tc lm thay i ton b i s khng c tc dng. V d 1: Xt hm NghichDao2(PhanSo p) trong v d di y. Phn s p l d liu thuc kiu tham chiu v c truyn cho hm theo kiu tham tr, v vy, thao tc gn
p = p2

khng c thc dng.


class PhanSo { int Tu, Mau; public PhanSo() { Tu = 0; Mau = 1; } public PhanSo(int x) { Tu = x; Mau = 1; } public PhanSo(int t, int m) { Tu = t; Mau = m; } public void XuatPhanSo() { Console.Write("({0}/{1})", Tu, Mau); } public PhanSo Cong(PhanSo PS2) { int TS = Tu * PS2.Mau + Mau * PS2.Tu; int MS = Mau * PS2.Mau; return } new PhanSo(TS, MS);

21

Lp trnh hng i tng

Phm Quang Huy

2008

public static void NghichDao1(PhanSo p) { int t = p.Tu; p.Tu = p.Mau; p.Mau = t; } public static void NghichDao2(PhanSo p) { PhanSo p2 = new PhanSo(); p2.Mau = p.Tu; p2.Tu = p.Mau; p = p2; } public static void NghichDao3(ref PhanSo p) { PhanSo p2 = new PhanSo(); p2.Mau = p.Tu; p2.Tu = p.Mau; p = p2;

} } class Program { static void Main(string[] args) { PhanSo p1 = new PhanSo(); // p1 = 0/1 p1.XuatPhanSo(); Console.WriteLine(); PhanSo p2 = new PhanSo(3); // p2 = 3/1 p2.XuatPhanSo(); Console.WriteLine(); Console.WriteLine("Nhap tu so: "); int Ts = int.Parse(Console.ReadLine()); Console.WriteLine("Nhap mau so: "); int Ms = int.Parse(Console.ReadLine()); p3 = new PhanSo(Ts, Ms); p3.XuatPhanSo(); Console.WriteLine(); p1 = p2.Cong(p3); p1.XuatPhanSo(); PhanSo.NghichDao1(p1); p1.XuatPhanSo(); Console.WriteLine(); PhanSo.NghichDao2(p1); p1.XuatPhanSo(); Console.WriteLine(); PhanSo.NghichDao3(ref p1);

22

Lp trnh hng i tng

Phm Quang Huy

2008

} }

p1.XuatPhanSo(); Console.ReadLine();

V d 2: V d sau y minh ha vic truyn tham s l tham chiu (myArray) cho phng thc Change theo kiu tham tr. i s myArray l mt d liu tham chiu, n tr ti mt mng s nguyn c cp pht trong Heap. Khi truyn myArray theo kiu tham tr cho phng thc Change, ta ch c th lm thay i cc gi tr ca vng nh trong Heap; tc l, ta ch c th thay i gi tr ca mt nh trong mng myArray, mi thao tc cp pht li vng nh cho myArray thc hin trong phng thc ny s khng nh hng ti mng gc c cp pht trong hm Main().
using System; class PassingRefByVal { static void Change(int[] arr) { // Lnh nay thay lam thay doi gia tri cua vung nho trong heap. arr[0]= 888; // Cap phat lai arr, lam thay doi dia chi cua arr. Lenh nay chi co tac dung cuc bo. Sau khi goi ham Change, gia tri cua Arr[0] van khong thay doi. arr = new int[5] {-3, -1, -2, -3, -4}; Console.WriteLine("Trong phuong thuc Change, phan tu dau tien la: {0}", arr[0]); } public static void Main() { int[] myArray = {1,4,5}; Console.WriteLine("Trong ham phuong thuc Change, phan tu myArray [0]); Change(myArray); Console.WriteLine("Trong ham phuong thuc Change, phan tu myArray [0]); Console.ReadLine(); } }

Main,truoc khi goi dau tien la: {0}", Main, sau khi goi dau tien la: {0}",

Kt qu chng trnh cho thy: trong hm Change(), ta ch c th thay i gi tr ca vng nh do myArray tr ti (c cp pht trong heap) bng lnh: arr[0]= 888; m khng thay i c bn thn tham chiu myArray bng lnh cp pht li:
arr = new int[5] {-3, -1, -2, -3, -4};

23

Lp trnh hng i tng

Phm Quang Huy

2008

V nu thay i c tham chin myArray th sau khi gi phng thc Change gi tr ca phn t u tin trong mng phi bng -3.

II.7.5. Truyn tham chiu vi tham s thuc kiu d liu tham chiu
Vi cch truyn tham s ny, nhng cu lnh lm thay i tham s s c hiu lc. Trong v d 2 phn II.7.4 nu ta khai bo li nguyn mu ca phng thc Change nh sau:
static void Change(ref int[] arr)

v trong hm Main() ta thay cu lnh Change(myArray); bng cu lnh:


Change(ref myArray);

th mi thao tc lm thay i gi tr ca vng nh trong heap do myArray tr ti hoc mi thao tc cp pht li vng nh cho myArray thc hin trong phng thc ny s lm thay i mng gc c cp pht trong hm Main(). Kt qu chy chng trnh:

iu ny chng t ta c th thay i i s thuc kiu tham chiu. Ta c th l gii tng t cho hm NghichDao3(ref PhanSo p)trong v d 1 phn II.7.4. Bi tp 1: Hy vit phng thc hon v hai d liu kiu chui (string). Hy gii thch ti sao khi dng phng thc ny ta cn phi truyn tham chiu cho phng thc d string l d liu thuc kiu tham chiu. Bi tp 2: Vit chng trnh nhp mt lp gm N hc sinh, mi hc sinh c cc thng tin nh: h, tn, im vn, im ton, im trung bnh. Tnh im trung bnh ca tng hc sinh theo cng thc: (im vn + im ton)/2. o Tnh trung bnh im vn ca c lp. o Tnh trung bnh im ton ca c lp. o Sp xp hc sinh trong lp theo th t h tn. o Sp xp hc sinh trong lp theo th t khng gim ca im trung bnh, nu im trung bnh bng nhau th sp xp theo tn.

24

Lp trnh hng i tng

Phm Quang Huy

2008

II.8. Tham chiu this


Khi mt i tng ang thc thi mt phng thc ca th hin (khng phi l phng thc tnh), tham chiu this t ng tr n i tng ny. Mi phng thc ca i tng u c th tham chiu n cc thnh phn ca i tng thng qua tham chiu this. C 3 trng hp s dng tham chiu this:

Trnh xung t tn khi tham s ca phng thc trng tn vi tn bin d liu ca i tng. Dng truyn i tng hin ti lm tham s cho mt phng thc khc (chng hn gi qui) Dng vi mc ch ch mc.

V d 1: Dng tham chiu this vi mc ch trnh xung t tn ca tham s vi tn bin d liu ca i tng.
public class { private private private Date int Year; int Month; int Day;

public Date(int Day, int Month, int Year) { Console.WriteLine("Constructor co 3 so!"); this.Year = Year; this.Month = Month; this.Day = Day; } cc phng thc khc }

tham

V d 2: bi ton thp H Ni, minh ha dng tham chiu this trong qui.
using System; class Cot { uint [] Disks; uint Size, Top = 0; char Ten; public Cot(uint n, char TenCot) { Size = n; Ten = TenCot; Disks = new uint[Size]; } public void ThemDia(uint DiskID) {

25

Lp trnh hng i tng

Phm Quang Huy

2008

} //

Disks[Top] = DiskID; Top++; {Console.WriteLine("Freeing {0}", Ten);}

~Cot()

// Chuyen mot dia tren dinh tu cot hien hanh sang cot C // Ham nay s dung tham chieu this de chuong trinh duoc ro rang hon public void Chuyen1Dia(Cot C) { this.Top--; Console.WriteLine("Chuyen dia {0} tu {1} sang {2}", this.Disks[Top], this.Ten, C.Ten); //C.ThemDia(this.Disks[this.Top]); C.Disks[C.Top] = this.Disks[this.Top]; C.Top++; } // Chuyen N dia (SoDia) tu cot hien hanh sang cot C, lay cot B lam trung //gian. Ham nay s dung tham chieu this voi muc dich de qui public void ChuyenNhieuDia(uint SoDia, Cot B, Cot C) { // Chuyen mot dia sang C if( SoDia == 1) Chuyen1Dia(C); else { ChuyenNhieuDia(SoDia-1,C, B); Chuyen1Dia(C); B.ChuyenNhieuDia(SoDia -1,this, C); } } } class This_ThapHaNoiApp { static void Main() { Cot A, B, C; uint SoDia = 4; A = new Cot(SoDia, 'A'); B = new Cot(SoDia, 'B'); C = new Cot(SoDia, 'C'); //Nap N dia vao cot A uint i = SoDia; while(i>0) { A. ThemDia(i); i--;

26

Lp trnh hng i tng

Phm Quang Huy

2008

} //Chuyen N dia tu cot A sang cot C, lay cot B lam trung gian A.ChuyenNhieuDia(SoDia,B, C); Console.ReadLine(); } }

II.9. ng gi d liu vi thuc tnh (property)


Thuc tnh l mt c tnh mi c gii thiu trong ngn ng C# lm tng sc mnh ca tnh ng gi. Thuc tnh n gin l cc phng thc ly gi tr (get) v gn gi tr (set). N cho php truy cp n cc thnh phn d liu ca i tng mc c hoc ghi hoc c hai v che du ci t thc s bn trong lp. Mt thuc tnh thng qun l mt bin d liu ca lp v thuc tnh c th l: Ch c (read-only): ch c phng thc get. Ta ch c c gi tr ca thuc tnh. Ch ghi (write-only): ch c phng thc set. Ta ch c gn (ghi d liu) gi tr cho thuc tnh. Va c va ghi (read/write): c c hai phng thc get v set. c php c v ghi gi tr. khai bo mt thuc tnh, chng ta vit kiu thuc tnh v tn theo sau bi cp {}. Bn trong cp {} chng ta c th khai bo cc phng thc get hay set. C php nh ngha mt thuc tnh: public KiuTrV TnThucTnh { // phng thc ly gi tr ca thuc tnh get { //cc cu lnh return BiuThcTrV; // tr v mt gi tr }
//phng thc gn gi tr cho thuc tnh

set { //cc cu lnh BinThnhVin = value; } } Phn thn ca phng thc get ca thuc tnh tng t nh phn thn phng thc ca lp. Chng tr v gi tr (hoc tham chiu) no , thng l tr v gi

27

Lp trnh hng i tng

Phm Quang Huy

2008

tr ca bin thnh vin m thuc tnh qun l. Khi ta truy cp n thuc tnh th phng thc get c gi thc hin. Phng thc set ca thuc tnh dng gn gi tr cho bin thnh vin m thuc tnh qun l. Khi nh ngha phng thc set, ta phi s dng t kha value biu din cho gi tr dng gn cho bin thnh vin. Khi gn mt gi tr cho thuc tnh th phng thc set t ng c gi v tham s n value chnh l gi tr dng gn. V d:
using System;

class Student { //Ch rng tn ca cc bin c du _ cn tn ca cc thuc tnh tng ng th khng c du _. string _Ten ; float _DiemToan, _DiemTin; float _DiemTB; // constructor public Student()// { _Ten = ""; _DiemToan = 0; _DiemTin = 0; _DiemTB = 0; } // thuoc tinh ten - (read/write) public string Ten { get {return _Ten;} set {_Ten = value;} } //Thuoc tinh diem toan - (read/write) public float DiemToan { get {return _DiemToan;} set { _DiemToan = value; _DiemTB = (_DiemToan + DiemTin)/2; } } //Thuoc tinh diem tin - (read/write) public float DiemTin {

28

Lp trnh hng i tng

Phm Quang Huy

2008

get {return _DiemTin;} set { _DiemTin = value; _DiemTB = (_DiemToan + DiemTin)/2; } } //Thuoc tinh diem tin - (read only) public float DiemTrungBinh { get {return _DiemTB;} }

class Student_PropertyApp { static void Main(string[] args) { Student s1 = new Student(); s1.Ten = "Hoa"; s1.DiemToan = 5; s1.DiemTin = 7; //s1.DiemTrungBinh = 6; ---> loi Console.WriteLine("Ten: {0}, diem Toan: {1}, diem Tin: {2}, diem trung binh: {3}", s1.Ten, s1.DiemToan, s1.DiemTin, s1.DiemTrungBinh); } } Console.ReadLine();

Trong v d trn, Ten, DiemToan, DiemTin l cc thuc tnh va c va ghi v DiemTrungBinh l thuc tnh ch c. Chng ph ln cc thnh phn d liu tng ng l _Ten, _DiemToan, _DiemTin, _DiemTB, gip ngi thit k che du ci t thc s bn trong lp. c bit l cc thuc tnh DiemToan, DiemTin, DiemTrungBinh, chng khng cho php ngi dng gn gi tr cho bin _DiemTB v che du cch tnh im trung bnh. Khi ta gi cc lnh:
s1.Ten = "Hoa"; s1.DiemToan = 5; s1.DiemTin = 7;

th phng thc set ca cc thuc tnh Ten, DiemToan, DiemTin tng ng c gi v tham s n value ln lt l Hoa, 5, 7. Khi ta gi cc lnh:
Console.Write("Ten: {0}, diem Toan: {1}, ", s1.Ten, s1.DiemToan);

29

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine(" diem Tin: s1.DiemTin, s1.DiemTrungBinh);

{0},

diem

TB:

{1}",

th phng thc get ca cc thuc tnh Ten, DiemToan, DiemTin, DiemTrungBinh tng ng c gi. Nu ta gi lnh:
s1.DiemTrungBinh = 6;

th trnh bin dch s bo li v thuc tnh DiemTrungBinh khng ci t phng thc set. Bi tp 1: Vit chng trnh xy dng lp TamGiac vi d liu l 3 cnh ca tam gic. Xy dng cc thuc tnh (property) ChuVi, DienTich v cc phng thc kim tra kiu ca tam gic (thng, vung, cn, vung cn, u). Bi tp 2: Vit chng trnh xy dng lp HinhTruTron (hnh tr trn) vi d liu chiu cao v bn knh. Xy dng cc thuc tnh (property) DienTichDay (din tch mt y), DienTichXungQuanh (din tch mt xung quanh), TheTich (th tch).

II.10. Ton t (operator)


Trong C#, ton t l mt phng thc tnh dng qu ti mt php ton no trn cc i tng. Mc ch ca ton t l vit m chng trnh gn gng, d hiu hn, thay v phi gi phng thc. Ta c th qu ti cc ton t sau: Ton hc: +, -, *, /, %. Cng tr mt ngi: ++, --, -. Quan h so snh: ==, !=, >, <, >=, <=. p kiu: (). C php khai bo nguyn mu ca mt ton t T: public static KiuTrV operator T (CcThamS) { ///cc cu lnh trong thn ton t } Ch : Tham s ca ton t phi l tham tr (khng dng cc t kha ref, out). Khng c qu ti ton t = (gn), && , || (and, or logic), ?: (iu kin), checked, unchecked, new, typeof, as, is.

30

Lp trnh hng i tng

Phm Quang Huy

2008

[] khng c xem l mt ton t. Khi qu ti cc ton t dng: +, -, *, / , % th cc ton t +=, -=, *=, /= , %= cng t ng c qu ti. Khi qu ti ton t th nn qu ti theo cp i ngu. Chng hn, khi qu ti ton t == th qu ti thm ton t != Khi qu ti ton t ==, != th nn pht trin thm cc phng thc Equals(), GetHashCode() m bo lut hai i tng bng nhau theo ton t == hoc phng thc Equals s c cng m bm. Khi nh ngha ton t p kiu ta phi ch ra y l ton t p kiu ngm nh (implicit) hay tng minh (explicit).

C php nh ngha ton t p kiu:


public static [ implicit | explicit ] operator KiuTrVT (Type V) trong Type V l bin cn p sang kiu KiuTrVT. V d: xy dng lp phn s v qu ti cc php ton trn phn s.
using System; class PhanSo { int Tu, Mau;

// private members

//constructor public PhanSo(int TuSo, int MauSo) { Tu = TuSo; Mau = MauSo; } //constructor public PhanSo(int HoleNumber) { Tu = HoleNumber; Mau = 1; } //constructor public PhanSo() { Tu = 0; Mau = 1; } //Chuyen doi ngam dinh tu so nguyen sang phan so public static implicit operator PhanSo(int theInt) {

31

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("Chuyen doi nguyen sang phan so"); return new PhanSo(theInt); }

ngam

dinh

tu

so

//Chuyen doi tuong minh phan so sang so nguyen; public static explicit operator int(PhanSo PS) { return PS.Tu/PS.Mau; } //toan tu so sanh == public static bool operator==(PhanSo PS1, PhanSo PS2) { return (PS1.Tu * PS2.Mau == PS2.Tu * PS1.Mau); } // Toan tu so sanh !=; public static bool operator!=(PhanSo PS1, PhanSo PS2) { return !(PS1 == PS2); } // phong thuc so sanh 2 phan so co bang nhau hay khong public override bool Equals(object o) { Console.WriteLine("Phuong thuc Equals"); if (! (o is PhanSo) ) return false; return this == (PhanSo) o; } //Toan tu cong hai phan so public static PhanSo operator+(PhanSo PS2) { int MauMoi = PS1.Mau * PS2.Mau ; int TuMoi = PS2.Mau * PS1.Tu + PS1.Mau * PS2.Tu; return new PhanSo(TuMoi, MauMoi); PS1, PhanSo

// Tang phan so them mot don vi! public static PhanSo operator++(PhanSo PS) { PS.Tu = PS.Mau + PS.Tu; return PS; } //ep phan so ve gia tri True, false de tra loi cau doi: day co phai la mot phan so hop le hay khong public static implicit operator bool(PhanSo PS) {

32

Lp trnh hng i tng

Phm Quang Huy

2008

return PS.Mau !=0; } //Phuong thuc doi phan so thanh chuoi public override string ToString() { String s = Tu.ToString( ) + "/" + Mau.ToString( return s;

);

} } class PhanSoApp { static void Main( ) { PhanSo f1 = new PhanSo(3,4); Console.WriteLine("f1: {0}", f1.ToString( )); PhanSo f2 = new PhanSo(2,4); Console.WriteLine("f2: {0}", f2.ToString( )); PhanSo f3 = f1 + f2; Console.WriteLine("f1 f3.ToString()); PhanSo f4 = f3 + 5; Console.WriteLine("f3 f4.ToString( )); + f2 = f3: {0}",

f4:

{0}",

PhanSo f5 = new PhanSo(4,8); if (f5 == f2) { Console.WriteLine("F5: {0} == F2: f5.ToString( ), f2.ToString( )); } Console.ReadLine();

{1}",

Kt qu ca chng trnh:

33

Lp trnh hng i tng

Phm Quang Huy

2008

Bi tp 1: Xy dng lp SoPhuc (s phc) vi cc phng thc v cc ton t +, -, *, / , p sang kiu s thc Bi tp 2: Xy dng lp MaTranVuong (ma trn vung) vi cc phng thc v cc ton t +, -, *, / , p sang kiu s thc (tr v nh thc ca ma trn)

II.11. Indexer (Ch mc)


Vic nh ngha ch mc cho php to cc i tng ca lp hot ng ging nh mt mng o. Tc l cc i tng c th s dng ton t [] truy cp n mt thnh phn d liu no . Vic nh ngha ch mc tng t nh vic nh ngha mt thuc tnh. C php to ch mc:
public KiuTraV this[DanhSchThamS] { //Hm c get { //thn hm c } // Hm ghi set { //thn hm ghi } }

V d 1: nh ngha lp mng v dng indexer truy cp trc tip n cc phn t ca mng:


using System; class ArrayIndexer { int [] myArray; int Size; public ArrayIndexer (int n) { Size = n; myArray = new int[Size]; } // chi muc cho php truy cp n phn t th index trong mng. public int this [int index] { get { // Kim tra ngoi mng

34

Lp trnh hng i tng

Phm Quang Huy

2008

if (index < 0 || index >= Size)return 0;

//throw IndexOutOfRangeException();
} set { }

new

else return myArray[index];

if (!(index < 0 || index >= Size)) myArray[index] = value;

public class MainClass { public static void Main() { ArrayIndexer b = new ArrayIndexer(10); b[3] = 256; b[4] = 1024; for (int i=0; i<5; i++) { Console.WriteLine("b[{0}] = {1}", i, b[i]); } Console.ReadLine(); } }

Trong lp ArrayIndexer trn ta nh ngha mt ch mc tr v kiu int v c mt tham s index l ch s ca phn t cn truy cp trong mng.
public int this [int index]

Phng thc get ly gi tr ca phn t th index , phng thc set gn gi tr cho phn t th index trong mng. V d 2: Gi s ta cn nh ngha mt lp c nhim v thao tc trn file nh thao tc trn mt mng cc byte. Lp ny hu dng khi cn thao tc trn mt file rt ln m khng th a ton b file vo b nh chnh ti mt thi im, nht l khi ta ch mun thay i mt vi byte trong file. Ta nh ngha lp FileByteArray c chc nng nh trn. Ch mc
public byte this[long index] { //khi knh truy cp n phn t th index }

c chc nng truy cp ti byte th index. Lp ReverseApp dng lp FileByteArray o ngc mt file. 35

Lp trnh hng i tng

Phm Quang Huy

2008

using System; using System.IO; // Lop cho phep truy cap den file nhu la mot mang cac bye public class FileByteArray { Stream st; //stream dung de truy cap den file //Phuong thuc khoi tao: mo fileName va lien ket luong stream toi file public FileByteArray(string fileName) { //Mo file st = new FileStream(fileName, FileMode .Open); } file public void Close() { st.Close(); st = null; } // Indexer de truy cap (doc/ghi) den byte thu index cua file public byte this[long index] { // Doc mot byte tai vi tri index get { //Tao vung dem de doc ghi byte[] buffer = new byte[1]; file st.Seek(index, SeekOrigin .Begin); tro doc //Doc 1 byte, tai vi tri hien hanh cua con (offset = 0, count = 1) st.Read(buffer, 0, 1); return buffer[0]; } // Ghi mot byte v file tai vi tri index . set { //Gan gia tri can ghi vao buffer byte[] buffer = new byte[1] {value}; //Dich chuyen con tro den vi tri index trong // Dong luong (stream) sau khi da thao tac xong tren

36

Lp trnh hng i tng

Phm Quang Huy

2008

//Dich chuyen den vi tri can ghi trong luong st.Seek(index, SeekOrigin.Begin); //Ghi du lieu vao file st.Write(buffer, 0, 1);

} }

// Lay chieu dai cua file (so byte) public long Length { get { return st.Seek(0, SeekOrigin.End); // Ham seek tra ve v tr hin ti ca con tr. } } } public class DaoNguocFileApp { public static void Main() { FileByteArray file FileByteArray("F:\\data.txt"); long len = file.Length; long i; // dao nguoc file for (i = 0; i < len / 2; ++i) { byte t; t = file[i]; file[i] = file[len - i - 1]; file[len - i - 1] = t; } //Xuat file for (i = 0; i < len; ++i) { Console.Write((char)file[i]); } file.Close(); Console.ReadLine(); } }

new

Trong v d trn ch mc tr v kiu byte v c mt tham s index l v tr cn truy cp trong file (kiu long).
public byte this[long index]

37

Lp trnh hng i tng

Phm Quang Huy

2008

Phng thc get nh ngha cc dng lnh c mt byte t file, phng thc set nh ngha cc dng lnh ghi mt byte vo file. Ch :

Mt ch mc phi c t nht mt tham s, v tham s c th c kiu bt k. ch mc c th ch c phng thc get. Mc d ch mc l mt c im th v ca C# nhng cn phi s dng ng mc ch (s dng i tng c th hat ng nh mng, mng nhiu chiu). Mt lp c th c nhiu ch mc nhng chng phi c cc du hiu phn bit vi nhau (tng t nh qu ti phng thc).

II.12. Lp lng nhau


Lp nh ngha bn trong mt lp khc gi l inner class, lp nm ngoi gi l outer class. Cc phng thc ca lp nm trong c th truy cp n cc thnh phn private ca lp nm ngoi (nhng phi thng qua mt i tng no ).

II.13. Cu hi n tp
1. T kho no c s dng trong khai bo d liu ca lp? 2. S khc nhau gia thnh vin c khai bo l public v cc thnh vin khng c khai bo l public? 3. Lp m chng ta xy dng thuc kiu d liu no? 4. C phi tt c nhng d liu thnh vin lun lun c khai bo l public bn ngoi c th truy cp chng? 5. C th to phng thc bn ngoi ca lp hay khng? 6. S khc nhau gia mt lp v mt i tng ca lp? 7. Thnh vin no trong mt lp c th c truy cp m khng phi to th hin ca lp? 8. Khi no th phng thc khi to c gi? 9. Khi no th phng thc khi to tnh c gi? 10. Phng thc tnh c th truy cp c thnh vin no v khng truy cp c thnh vin no trong mt lp? 11. C th truyn bin cha khi to vo mt hm c khng? 12. S khc nhau gia truyn bin tham chiu v truyn bin tham tr vo mt phng thc?
13. Lm sao truyn tham chiu vi bin kiu gi tr vo trong mt phng

thc? 14. T kha this c dng lm g trong mt lp? 38

Lp trnh hng i tng

Phm Quang Huy

2008

15. C php nh ngha mt thuc tnh? 16. C php nh ngha mt ton t?

II.14. Bi tp tng hp
1. Xy dng mt lp ng trn lu gi bn knh v tm ca ng trn. To cc phng thc tnh chu vi, din tch ca ng trn. 2. Thm thuc tnh BanKinh vo lp c to ra t bi tp 1. 3. Vit lp gii phng trnh bc hai. Lp ny c cc thuc tnh a, b, c v nghim x1, x2. Lp cho php bn ngoi xem c cc nghim ca phng trnh v cho php thit lp hay xem cc gi tr a, b, c. 4. Xy dng lp a thc vi cc ton t +, -, *, / v ch mc truy cp n h s th i ca a thc. 5. Xy dng lp ma trn vi cc php ton +, -, *, / v ch mc truy cp n phn t bt k ca ma trn. 6. Xy dng lp NguoiThueBao (s in thai, h tn), t xy dng lp DanhBa (danh b in thai) vi cc phng thc nh nhp danh b in thai, xut danh b in thai, tm s in thai theo tn (ch mc ), tm tn theo s in thoi (ch mc ).

39

Lp trnh hng i tng

Phm Quang Huy

2008

III. K tha (inheritance) v a hnh (polymorphism)


Phn I, II trnh by cch to mt kiu d liu mi bng cc nh ngha lp. Vic nh ngha mt lp th hin tnh ng gi ca phng php lp trnh hng i tng. Trong phn ny ta tm hiu mi quan h gia cc i tng trong th gii thc v cch thc m hnh ha nhng quan h ny trong m chng trnh da trn khi nim k tha. Cc mi quan h ny c biu din thng qua tnh k tha v tnh a hnh.

III.1. Quan h chuyn bit ha v tng qut ha


Cc lp v th hin ca lp khng tn ti trong mt khng gian c lp, chng tn ti trong mt mng cc quan h v ph thuc qua li ln nhau. Quan h tng qut ha v chuyn bit ha l quan h phn cp v tng h ln nhau (tng h v chuyn bit ha l mt i lp vi tng qut ha). V nhng quan h ny l phn cp v chng to ra cy quan h. Chng hn, quan h is-a (l mt) l mt s chuyn bit ha. V d, khi ta ni Sn dng l mt loi ng vt, i bng cng l mt loi ng vt , th c ngha l: Sn dng v i bng l nhng loi ng vt chuyn bit, chng c nhng c im chung ca ng vt v ngoi ra chng c nhng c im phn bit nhau. V nh vy, ng vt l tng qut ha ca sn dng v i bng; sn dng v i bng l chuyn bit ha ca ng vt. Trong C#, quan h chuyn bit ha, tng qut ho thng c th hin thng qua s k tha. Bi v, thng thng, khi hai lp chia s chc nng, d liu vi nhau, ta trch ra cc phn chung v a vo lp c s chung c th nng cao kh nng s dng li cc m ngun chung, cng nh d dng qun l m ngun.

III.2. K tha
K tha l c ch cho php nh ngha mt lp mi (cn gi l lp dn xut, drived class) da trn mt lp c sn (cn gi l lp c s, base class). Lp dn xut c hu ht cc thnh phn ging nh lp c s (bao gm tt c cc phng thc v bin thnh vin ca lp c s, tr cc phng thc private, phng thc khi to, phng thc hy v phng thc tnh). Ni cch khc, lp dn xut s k tha hu ht cc thnh vin ca lp c s. Mt iu cn ch rng, lp dn xut vn c k tha cc thnh phn d liu private ca lp c s nhng khng c php truy cp trc tip (truy cp gin tip thng qua cc phng thc ca lp c s). C php nh ngha lp dn xut: class TnLpCon : TnLpCS { // Thn lp dn xut } 40

Lp trnh hng i tng

Phm Quang Huy

2008

V d: Xy dng lp Point2D (ta trong khng gian 2 chiu), t m rng cho lp Point3D.
using System; //Lop co so Point2D class Point2D { public int x,y; public void Xuat2D() { Console.WriteLine("({0}, {1})", x, y); } } //Lop dan xuat Point3D ke thua tu lop Point2D class Point3D:Point2D { public int z; public void Xuat3D() { Console.WriteLine("({0}, {1}, {2})", x, y, z); } } class PointApp { public static void Main() { Point2D p2 = new Point2D(); p2.x = 1; p2.y = 2; p2.Xuat2D(); Point3D p3 = new Point3D(); p3.x = 4; p3.y = 5; p3.z = 6; p3.Xuat3D(); p3.Xuat2D(); Console.ReadLine(); } }

Mt thc th (i tng) ca lp dn xut c tt c cc trng (bin) c khai bo trong lp dn xut v cc trng c khai bo trong cc lp c s m n k tha. v d trn, r rng trong lp Point3D ta khng khai bo cc bin x, y nhng trong phng thc Xuat3D() ta vn c th truy cp x, y. Thm ch trong hm Main(), ta c th s dng i tng p3 gi phng thc Xuat2D() ca lp c s. iu ny chng t Point3D c k tha cc bin x, y t Point2D. Ch : 41

Lp trnh hng i tng

Phm Quang Huy

2008

Lp dn xut khng th b i cc thnh phn c khai bo trong lp c s. Cc hm trong lp dn xut khng c truy cp trc tip n cc thnh vin c mc truy cp l private trong lp c s. V d: Nu ta nh ngha lp ClassA v ClassB k tha t ClassA nh sau th cu lnh x = x -1 s b bo li: ClassA.x is inaccessible due to its protection level.
class ClassA { int x = 5; public void XuatX() { Console.WriteLine("{0}", x); } } class ClassB: ClassA { public void GiamX() { x = x - 1; // Loi. } }

Nu sa li khai bo int x = 5; thnh protected int x = 5; hoc public int x = 5; th s khng cn li trn v thnh phn protected hoc public ca lp c s c th c truy cp trc tip trong lp dn xut (nhng khng c truy cp trong mt phng thc khng thuc lp c s v lp dn xut).

III.3. Gi phng thc to lp ca lp c s


V lp dn xut khng th k tha phng thc to lp ca lp c s nn mt lp dn xut phi thc thi phng thc to lp ring ca mnh. Nu lp c s c mt phng thc to lp mc nh (tc l khng c phng thc to lp hoc phng thc to lp khng c tham s) th phng thc to lp ca lp dn xut c nh ngha nh cch thng thng. Nu lp c s c phng thc to lp c tham s th lp dn xut cng phi nh ngha phng thc to lp c tham s theo c php sau:
TnLpCon(ThamSLpCon): TnLpCS(ThamSLpCha)

{ // Khi to gi tr cho cc thnh phn ca lp dn xut }

42

Lp trnh hng i tng

Phm Quang Huy

2008

Ch : ThamSLpCon phi bao ThamSLpCha. V d:


using System; //Lop co so class Point2D { public int x,y; //phuong thuc tao lap cua lop co so co tham so public Point2D(int a, int b) { x = a; y = b; } public void Xuat2D() { Console.Write("({0}, {1})", x, y); } } //Lop dan xuat class Point3D:Point2D { public int z; //Vi phuong thuc tao lap cua lop co so co tham so nen phuong thuc tao lap cua lop dan xuat cung phai co tham so public Point3D(int a, int b, int c):base (a,b) { z = c; } public void Xuat3D() { Console.Write("({0}, {1}, {2})", x, y, z); } } class PointApp { public static void Main() { Point2D p2 = new Point2D(1, 2); Console.Write("Toa do cua diem 2 D :"); p2.Xuat2D(); Console.WriteLine(); Point3D p3 = new Point3D(4,5,6); Console.Write("Toa do cua diem 3 D :"); p3.Xuat3D(); Console.ReadLine(); } }

43

Lp trnh hng i tng

Phm Quang Huy

2008

Trong v d trn, v phng thc to lp ca lp Point2D c tham s:


public Point2D(int a, int b)

nn khi lp Point3D dn xut t lp Point2D, phng thc to lp ca n cn c ba tham s. Hai tham s u tin dng khi gn cho cc bin x, y k tha t lp Point2D, tham s cn li dng khi gn cho bin thnh vin z ca lp Point3D. Phng thc to lp c nguyn mu nh sau:
public Point3D(int a, int b, int c):base (a, b)

Phng thc to lp ny gi phng thc to lp ca lp c s Point2D bng cch t du : sau danh sch tham s v t kho base vi cc i s tng ng vi phng thc to lp ca lp c s.

III.4. nh ngha phin bn mi trong lp dn xut


Qua nhng phn trn chng ta c nhn xt rng, khi cn nh ngha hai lp m chng c chung mt vi c trng, chc nng th nhng thnh phn nn c t vo mt lp c s. Sau hai lp ny s k tha t lp c s v b sung thm cc thnh phn ca ring chng. Ngoi ra, lp dn xut cn c quyn nh ngha li cc phng thc k tha t lp c s nhng khng cn ph hp vi n na. Lp dn xut k tha hu ht cc thnh vin ca lp c s v vy trong bt k phng thc no ca lp dn xut ta c th truy cp trc tip n cc thnh vin ny (m khng cn thng qua mt i tng thuc lp c s). Tuy nhin, nu lp dn xut cng c mt thnh phn X (bin hoc phng thc) no trng tn vi thnh vin thuc lp c s th trnh bin dch s c cnh bo dng nh sau:
keyword new is required on LpDnXut.X because it hides inherited member on LpCS.X

bi v, trong lp dn xut, khi khai bo mt thnh phn trng tn lp thnh phn trong lp c s th trnh bin dch hiu rng ngi dng mun che du cc thnh vin ca lp c s v yu cu ngi dng t t kha new ngay cu lnh khai bo thnh phn . iu ny c tc dng che du thnh phn k tha i vi cc phng thc bn ngoi lp dn xut. Nu phng thc ca lp dn xut mun truy cp n thnh phn X ca lp c s th phi s dng t kha base theo c php: base.X. V d:
using System; class XeHoi { //Cac thanh phan nay la protected de phuong thuc Xuat cua lop XeXat va XeHoi co the truy cap duoc

44

Lp trnh hng i tng

Phm Quang Huy

2008

protected int TocDo; protected string BienSo; protected string HangSX; public XeHoi(int td, string BS, string HSX) { TocDo = td; BienSo = BS; HangSX = HSX; } public void Xuat() { Console.Write("Xe: {0}, Bien so: {1}, Toc do: {2} kmh",HangSX, BienSo, TocDo); } } class { XeCar: XeHoi int SoHanhKhach; public XeCar(int td, string BS, string HSX, int SHK): base(td, BS, HSX) { SoHanhKhach = SHK; } //Tu khoa new che dau phuong thuc Xuat cua lop XeHoi vi phuong thuc Xuat cua lop XeHoi khong con phu hop voi lop XeCar. public new void Xuat() { // Goi phuong thuc xuat cua lop co so thong qua tu khoa base base.Xuat(); Console.WriteLine(", {0} cho ngoi", SoHanhKhach); } } class { XeTai: XeHoi int TrongTai; public XeTai(int td, string BS, string HSX, int TT): base(td, BS, HSX) { TrongTai = TT; } //Tu khoa new che dau phuong thuc Xuat cua lop XeHoi vi phuong thuc Xuat cua lop XeHoi khong con phu hop voi lop XeCar nua.

45

Lp trnh hng i tng

Phm Quang Huy

2008

public new void Xuat() { base.Xuat(); // Goi phuong thuc xuat cua lop co Console.WriteLine(", trong tai {0} tan", TrongTai); } } public class Test { public static void Main() { XeCar c = new XeCar(150,"49A-4444", "Toyota", 24); c.Xuat(); XeTai t = new XeTai(150,"49A-5555", "Benz", 12); t.Xuat(); Console.ReadLine(); } }

Trong v d trn, lp XeHoi c mt phng thc Xuat( ), tuy nhin phng thc ny ch xut ra cc thng tin nh BienSo, TocDo, HangSX nn khng cn ph hp vi hai lp XeTai v XeCar na. Do hai lp dn xut ny nh ngha mt phin bn mi ca phng thc Xuat() theo c php sau:
public new void Xuat( )

{ } Vic thm vo t kho new ch ra rng ngi lp trnh mun to ra mt phin bn mi ca phng thc ny trong cc lp dn xut nhm che du phng thc k tha t lp c s XeHoi. Nh vy, trong hm Main(), khi gi:
c.Xuat();

hoc
t.Xuat();

trnh bin dch s hiu rng y l phng thc Xuat() ca lp XeTai hoc lp XeCar. Hn na, trong phng thc Xuat() ca lp XeTai v XeCar ta vn c th gi phng thc Xuat() ca lp XeHoi bng cu lnh:
base.Xuat();

III.5. Tham chiu thuc lp c s


Mt tham chiu thuc lp c s c th tr n mt i tng thuc lp dn xut nhng n ch c php truy cp n cc thnh phn c khai bo trong lp c

46

Lp trnh hng i tng

Phm Quang Huy

2008

s. Vi cc lp XeHoi, XeCar nh trn, ta c th nh ngha hm Main() nh sau:


public static void Main() { XeCar c = new XeCar(150,"49A-4444", "Toyota", 24); c.Xuat(); Console.WriteLine(); Console.WriteLine("Tham chieu cua lop co so XeHoi co the tro den doi tuong thuoclop dan xuat XeCar"); Console.WriteLine("Nhung chi co the goi ham xuat tuong ung voi XeHoi"); XeHoi h = c; h.Xuat(); Console.ReadLine(); }

Kt qu chy chng trnh:

Khi gi lnh
c.Xuat();

trnh bin dch gi phng thc Xuat() ca lp XeCar v xut cc thng tin: hng sn xut (Toyota), bin s (49A-444), tc ti a (150 km/h), 24 ch ngi. Sau mt i tng h thuc lp c s XeHoi tr n i tng c thuc lp dn xut :
XeHoi h = c;

Khi gi lnh
h.Xuat();

trnh bin dch s thc hin phng thc Xuat() ca lp XeHoi nn ch xut cc thng tin: hng sn xut (Toyota), bin s (49A-444), tc ti a (150 km/h). Bi tp 1: Xy dng lp Stack v lp Queue (ci t theo kiu danh sch lin kt) bng cch a nhng thnh phn d liu v phng chung ca hai lp ny vo mt lp c s SQ v t xy dng cc lp Stack, Queue k tha t lp SQ.

47

Lp trnh hng i tng

Phm Quang Huy

2008

Bi tp 2: Xy dng lp hnh trn vi cc thuc tnh (properties): bn knh, ng knh, din tch. Xy dng lp hnh cu k tha t lp hnh trn. Lp ny che du i cc thuc tnh: din tch (dng t kha new) ng thi b sung thm thuc tnh: th tch. Din tch hnh cu tnh bn knh R c tnh theo cng thc 4*PI*R2 Th tch hnh cu tnh bn knh R c tnh theo cng thc 4/3*PI*R3 Bi tp 3: Tng t, xy dng lp hnh tr trn k tha t lp hnh trn vi cc thuc tnh: chu vi mt y, din tch mt y, din tch xung quanh, din tch ton phn, th tch.

III.6. Phng thc o (virtual method) v tnh a hnh


(polymorphism)
Hai c im mnh nht ca k tha l kh nng s dng li m chng trnh v a hnh (polymorphism). a hnh l tng s dng mt giao din chung cho nhiu phng thc khc nhau, da trn phng thc o (virtual method) v c ch lin kt mun (late binding). Ni cch khc, y l c ch cho php gi mt loi thng ip ti nhiu i tng khc nhau m mi i tng li c cch x l ring theo ng cnh tng ng ca chng. y l mt kch bn thc hin tnh a hnh: Lp ca cc i tng nt nhn (button), nhn (label), nt chn (option button), danh sch s xung (combobox) u k tha t lp Window v u c cc phng thc v (hin th) ring ca mnh ln form. Mt form c th c nhiu i tng nh trn v c lu trong mt danh sch (khng cn bit cc i tng trong danh sch l ListBox hay Button min l i tng l mt th hin Window). Khi form c m, n c th yu cu mi i tng Window t v ln form bng cch gi thng ip v n tng i tng trong danh sch v cc i tng ny s thc hin chc nng v tng ng. Khi ta mun form x l tt c cc i tng Window theo c trng a hnh. thc hin c a hnh ta phi thc hin cc bc sau: 1. Lp c s nh du phng thc o bng t kha virtual hoc abstract. 2. Cc lp dn xut nh ngha li phng thc o ny (nh du bng t kha override). 3. V tham chiu thuc lp c s c th tr n mt i tng thuc lp dn xut v c th truy cp hm o nh ngha li trong lp dn xut nn khi thc thi chng trnh, ty i tng c tham chiu ny tr ti m phng thc tng ng c gi thc hin. Nu tham chiu ny tr ti i tng thuc lp c s th phng thc o ca lp c s c thc hin.

48

Lp trnh hng i tng

Phm Quang Huy

2008

Nu tham chiu ny tr ti i tng thuc lp dn xut th phng thc o c lp dn xut nh ngha li c thc hin. V d:
using System; public class MyWindow { protected int top, left; //Toa do goc tren ben trai public MyWindow(int t, int l) { top = t; left = l; } // Phuong thuc ao public virtual void DrawWindow( ) { Console.WriteLine("...dang ve Window tai toa do {0}, {1}", top, left); } } public class MyListBox : MyWindow { string listBoxContents; public MyListBox(int top,int left,string base(top, left) { listBoxContents = contents; }

contents):

public override void DrawWindow( ) { Console.WriteLine ("...dang ve listbox {0} tai toa do: {1},{2}", listBoxContents, top, left); }

public class MyButton : MyWindow { public MyButton(int top,int left):base(top, left) {} public override void DrawWindow( ) { Console.WriteLine ("...dang ve button tai toa do: {0},{1}", top, left); } } public class Tester { static void Main( )

49

Lp trnh hng i tng

Phm Quang Huy

2008

{ Random R = new Random(); int t; string s = ""; MyWindow[] winArray = new MyWindow[4]; for (int i = 0;i < 4; i++) { t = R.Next() % 3; switch(t) { case 0: winArray[i] =new MyWindow( i * 2, i * 4); break; case 1: s = "thu " + (i+1).ToString(); winArray[i] = new MyListBox(i*3, i * 5, s); break; case 2: winArray[i] =new MyButton(i * 10, i * 20); break; } }

for (int i = 0; i < 4; i++) { winArray[i].DrawWindow( ); } Console.ReadLine(); } }

Trong v d ny ta xy dng mt lp MyWindow c mt phng thc o:


public virtual void DrawWindow( )

Cc lp MyListBox, MyButton k tha t lp MyWindow v nh ngha li (override) phng thc DrawWindow() theo c php:
public override void DrawWindow( )

Sau trong hm Main () ta khai bo v to mt mng cc i tng MyWindow. V mi phn t thuc mng ny l mt tham chiu thuc lp MyWindow nn n c th tr ti bt k mt i tng no thuc cc lp k tha lp MyWindow, chng hn lp MyListBox hay lp MyButton. Vng lp for u tin to ngu nhin cc i tng thuc mt trong cc lp MyWindow, MyListBox, MyButton, v vy, ti thi im bin dch chng trnh, trnh bin dch khng bit i tng th i thuc lp no v do cha th xc nh c on m ca phng thc DrawWindow() cn gi. Tuy nhin, ti thi im chy chng trnh, sau vng lp for u tin, mi winArray[i] tham chiu ti mt loi i tng c th nn trnh thc thi s t ng xc nh c phng

50

Lp trnh hng i tng

Phm Quang Huy

2008

thc DrawWindow() cn gi. (Nh vy ta s dng mt giao din chung l DrawWindow() cho nhiu phng thc khc nhau). Ch rng nu phng thc DrawWindow()trong cc lp MyListBox, MyButton,.. khng c t kha override nh c php:
public override void DrawWindow( )

th trnh bin dch s bo li. V d 2: Mt im dch v cn qun l cc thng tin cho thu xe p v xe my. Vi xe p cn lu h tn ngi thu, s gi thu. Tin thu xe p c tnh nh sau: 10000 (ng) cho gi u tin, 80000 cho mi gi tip theo. Vi mi xe my cn lu h tn ngi thu, s gi thu, loi xe (100 phn khi, 250 phn khi), bin s. Tin thu xe my c tnh nh sau: i vi gi u tin, loi xe 100 phn khi tnh 15000; loi xe 250 phn khi tnh 20000. i vi nhng gi tip theo tnh 10000 cho c hai loi xe my. Vit chng trnh xy dng cc lp cn thit sau nhp danh sch cc thng tin thu xe p v xe my, sau xut ra cc thng tin sau: Xut tt c cc thng tin thu xe (c s tin thu tng ng). Tnh tng s tin cho thu xe p v xe my. Xut tt c cc thng tin lin quan n vic thu xe p. Tnh tng s tin cho thu xe my loi 250 phn khi.

Gii:
using System; public class XE { protected string hoten; protected int giothue; public virtual int TienThue { get {return 0;} } public virtual void Xuat() { public virtual string ID() { return "X"; } } public class XEDAP:XE { public XEDAP(string ht,int gt) { hoten = ht; giothue = gt; }

51

Lp trnh hng i tng

Phm Quang Huy

2008

public override string ID() { return "XD"; } public override int TienThue { get { int T = 10000; if (giothue > 0) T = T+ 8000*(giothue-1); return T; } } public override void Xuat() { Console.WriteLine(hoten + "\t" + giothue +"\t" + TienThue); } } public class XEMAY:XE { string loaixe; string bienso; public XEMAY(string ht,int gt,string lx,string bs) { hoten = ht; giothue = gt; loaixe=lx; bienso=bs; } public override string ID() { if (loaixe=="100")return "XM_100"; else return "XM_250"; } public override int TienThue { get { int T; if (loaixe == "100")T = 15000; else T = 20000; (if (giothue > 0) T = T + 10000*(giothue1); return T; } public override void Xuat() { }

52

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("Xe may: " + hoten + "\t" giothue +"\t" + loaixe + "\t" + bienso +"\t"+ TienThue); } } public class CUAHANG { public int n; XE []XT; //Xe cho thue

public CUAHANG(int size) { n=size; XT= new XE[size]; } public int menu() { int chon; do { Console.WriteLine("****** Bang Chon Nhap ********"); Console.WriteLine("1. Nhap Xe Dap"); Console.WriteLine("2. Nhap Xe May"); chon=int.Parse(Console.ReadLine()); }while((chon!=1) && (chon!=2)); return chon; } public void NhapDSXeChoThue() { int chon; for(int i=0;i<n;i++) { chon=menu(); if(chon==1) { Console.WriteLine("***** Ban chon nhap xe dap *******"); Console.WriteLine("Ho ten nguoi thue?"); string ht=Console.ReadLine(); Console.WriteLine("So gio thue?"); int gt=int.Parse(Console.ReadLine()); XT[i]=new XEDAP(ht,gt); } else { Console.WriteLine("***** Ban chon nhap xe may ********"); Console.WriteLine("Nguoi thue?"); string ht=Console.ReadLine(); Console.WriteLine("So gio thue?");

53

Lp trnh hng i tng

Phm Quang Huy

2008

int gt=int.Parse(Console.ReadLine()); Console.WriteLine("Ban nhap vao loai xe(100 hoac 125 )phan khoi:" ); string lx=Console.ReadLine(); Console.WriteLine("Bien so:"); string bs=Console.ReadLine(); XT[i]=new XEMAY(ht,gt,lx,bs); } } } public void XuatDSXeThue() { for(int i=0;i<n;i++) { XT[i].Xuat(); } } public long TongTienChoThue() { long ts=0; for(int i=0;i<n;i++) { ts=ts+XT[i].TienThue; } return ts; } public void XuatXeDap() { for(int i=0;i<n;i++) { if (XT[i].ID() =="XD")XT[i].Xuat(); } } public long TongTienXeMay250() { long T = 0; for(int i=0;i<n;i++) { if (XT[i].ID() =="XM_250") T += XT[i].TienThue; } return T; } } public class App { public static void Main() { CUAHANG ch=new CUAHANG(3); ch.NhapDSXeChoThue();

54

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("Xuat thue xe"); ch.XuatDSXeThue();

tat

ca

nhung

thong

tin

Console.WriteLine("Tong ch.TongTienChoThue()); Console.WriteLine("Thong thue:"); ch.XuatXeDap();

tien tin

thue ve xe

xe dap

"

+ cho

Console.WriteLine("Tong tien thue xe may 250 phan khoi" + ch.TongTienXeMay250()); Console.ReadLine(); } }

III.7. Lp Object
Tt c cc lp trong C# u c dn xut t lp Object. Lp Object l lp gc trn cy phn cp k tha, n cung cp mt s phng thc m cc lp con c th ghi (override) nh: Phng thc Equals() GetHashCode() GetType() ToString() Finalize() MemberwiseClone() ngha Kim tra hai i tng c tng ng nhau khng Cho php i tng cung cp hm Hash ring s dng trong kiu tp hp. Tr v kiu i tng. Tr v chui biu din i tng. Xa i tng trong b nh. To copy ca i tng.

Trong nhng v d trc ta thc hin vic ghi ln phng thc ToString() v Equals() ca lp Object.

III.8. Lp tru tng(abstract)


Trong cc v d v phng thc o trn, nu lp dn xut khng nh ngha li phng thc o ca lp c s th n c k tha nh mt phng thc thng thng. Tc l lp dn xut khng nht thit phi nh ngha li phng thc o. bt buc tt c cc lp dn xut phi nh ngha li (override) mt phng thc ca lp c s ta phi t t kha abstract trc phng thc v phng thc c gi l phng thc tru tng. Trong phn thn ca phng thc tru tng khng c cu lnh no, n ch to mt tn phng thc v nh du rng n phi c thi hnh trong lp dn xut. Lp cha phng thc tru tng c gi l lp tru tng. C php khai bo phng thc tru tng: abstract public void TnPhngThc( );

55

Lp trnh hng i tng

Phm Quang Huy

2008

Phng thc tru tng phi c t trong lp tru tng. Lp tru tng c t kha abstract ng trc. V d: Xy dng lp HinhHoc vi phng thc tnh chu vi, din tch l phng thc tru tng hoc phng thc o. Sau nh ngha cc lp HinhChuNhat (hnh ch nht), HinhTron (hnh trn) k tha t lp HinhHc vi cc thnh phn d liu v phng thc tnh chu vi, din tch c th ca tng loi i tng.
// lop hinh hoc (truu tuong) abstract public class HinhHoc { abstract public double DienTich(); virtual public double ChuVi() { return 0;} }

// lop hinh tron ke thua tu lop hinh hoc


public class HinhTron : HinhHoc { double _bankinh; public double BanKinh { get{ return _bankinh;} set{ _bankinh = value;} } public override double DienTich() { return _bankinh*_bankinh*3.1416; } public override double ChuVi() { return _bankinh*2*3.1416; } }

// lop hinh chu nhat ke thua tu lop hinh hoc


public class HinhChuNhat : HinhHoc { double _dai, _rong; public double ChieuDai { get{ return _dai;} set{ _dai = value;} } public double ChieuRong { get{ return _rong;} set{ _rong = value;}

56

Lp trnh hng i tng

Phm Quang Huy

2008

} public override double DienTich(){ return _dai*_rong;} public override double ChuVi(){return (_dai+_rong

)*2;} }

class Tester { static void Main(string[] args) { HinhHoc h; HinhTron t = new HinhTron(); t.BanKinh = 5; Console.WriteLine("Thong tin ve hinh tron"); h = t; Console.WriteLine("Chu vi hinh tron: {0} h.ChuVi()); Console.WriteLine("Dien tich hinh tron:{0} h.DienTich());

", ",

HinhChuNhat n = new HinhChuNhat(); n.ChieuDai = 4; n.ChieuRong = 3; h = n; Console.WriteLine("Thong tin ve hinh chu nhat "); Console.WriteLine("Chu vi hinh chu nhat:{0}", h.ChuVi()); Console.WriteLine("Dien tich hinh chu nhat:{0}", h.DienTich()); Console.ReadLine(); } }

Trong lp HinhHoc v d trn, ta khai bo phng thc tnh din tch l mt phng thc tru tng (khng c phn ci t m ca phng thc v cha bit i tng hnh thuc dng no nn khng th tnh din tch ca n). Nh vy, lp HinhHoc l mt lp tru tng.
abstract public double DienTich();

Trong lp trn, ta cng khai bo mt phng thc tnh chu vi l phng thc o vi mc ch minh ha rng trong lp tru tng c th c phng thc o (hoc bt c mt thnh phn no khc ca mt lp). V y l mt phng thc khng tru tng nn phi c phn ci t m bn trong thn phng thc. Cc lp HinhChuNhat, HinhTron k tha t lp HinhHoc nn chng buc phi ci t li phng thc tnh din tch. Trong hm Main(), ta to ra i tng n thuc lp HinhChuNhat v i tng t thuc lp HinhTron. Khi tham chiu h thuc lp HinhHoc tr ti i tng n (tng t vi i tng t), n c th gi c phng thc tnh din tch ca lp

57

Lp trnh hng i tng

Phm Quang Huy

2008

HinhChuNhat (tng t lp HinhTron), iu ny chng t phng thc tru tng cng c th dng vi mc ch a hnh. Ch : Phn bit gia t kha new v override T kha override dng nh ngha li (ghi ) phng thc o (virtual) hoc phng thc tru tng (abstract) ca lp c s, n c dng vi mc ch a hnh. T kha new che du thnh vin ca lp c s trng tn vi thnh vin ca lp dn xut.

III.9. Giao din (interface)


Giao din l mt dng ca lp tru tng c s dng vi mc ch h tr tnh a hnh. Trong giao din khng c bt c mt ci t no, ch c nguyn mu ca cc phng thc, ch mc, thuc tnh m mt lp khc khi k tha n th phi c ci t c th cho cc thnh phn ny (tc l lp k tha giao din tuyn b rng n h tr cc phng thc, thuc tnh, ch mc c khai bo trong giao din). Khi mt lp k tha mt giao din ta ni rng lp thc thi (implement) giao din.

III.9.1. Thc thi giao din


Ta dng t kha interface khai bo mt giao din vi c php sau: [McTruyCp] interface TnGiaoDin [:CcGiaoDinCS] { Ni dung } McTruyCp: public hoc internal. CcGiaoDinCS: danh sch cc interface khc m n k tha. V mt c php, mt giao din ging nh mt lp ch c phng thc tru trng. N c th cha khai bo ca phng thc, thuc tnh, ch mc, s kin (events) nhng khng c cha bin d liu. Khi k tha mt giao din ta phi thc thi mi phng thc, thuc tnh, ca giao din. Ch : Mc nh, tt c cc thnh phn khai bo trong giao din u l public. Nu c t kha public ng trc s b bo li. Cc thnh phn trong giao din ch l cc khai bo, khng c phn ci t m. Mt lp c th k tha mt lp khc ng thi k tha nhiu giao din. V d: Mi chic xe hi hoc xe my u c hnh ng (phng thc) khi ng v dng. Ta c th dng nh ngha mt giao din km thm mt thuc tnh cho bit chic xe khi ng hay cha:
public interface IDrivable

58

Lp trnh hng i tng

Phm Quang Huy

2008

{ void KhoiDong(); void Dung(); bool DaKhoiDong { get; }

Thuc tnh khi ng (DaKhoiDong) ch c phng thc get v khi gi phng thc KhoiDong() th thuc tnh ny s c gi tr true, khi gi phng thc Dung() th thuc tnh ny s c gi tr false. Khi , mt lp Car thc thi giao din ny phi ci t cc phng thc v thuc tnh khai bo trong giao din Idrivable trn:
public interface IDrivable { void KhoiDong(); void Dung(); bool DaKhoiDong { get; } } public class Car:IDrivable { public bool Started = false; public void KhoiDong() { Console.WriteLine("Xe ca khoi dong"); Started = true; } public void Dung() { Console.WriteLine("Xe ca dung"); Started = false; } public bool DaKhoiDong { get{return Started;} } } public class Tester { public static void Main() { Car c = new Car(); c.KhoiDong(); Console.WriteLine("c.DaKhoiDong = c.DaKhoiDong);

"

59

Lp trnh hng i tng

Phm Quang Huy

2008

c.Dung(); Console.WriteLine("c.DaKhoiDong c.DaKhoiDong); Console.ReadLine(); } }

"

III.9.2. Hy i tng
Ngn ng C# cung cp c ch thu dn rc t ng (garbage collection) v do vy khng cn phi khai bo tng minh cc phng thc hy. Tuy nhin, khi lm vic vi cc on m khng c qun l th cn phi khai bo tng minh cc phng thc hy gii phng cc ti nguyn. C# cung cp ngm nh mt phng thc thc hin iu khin cng vic ny, phng thc l Finalize() hay cn gi l b kt thc. Phng thc Finalize() ny s c gi mt cch t ng bi c ch thu dn khi i tng b hy. Phng thc Finalize() ch gii phng cc ti nguyn m i tng nm gi, v khng tham chiu n cc i tng khc. Nu vi nhng on m bnh thng tc l cha cc tham chiu kim sot c th khng cn thit phi to v thc thi phng thc Finalize(). Ta ch lm iu ny khi x l cc ti nguyn khng kim sot c. Ta khng bao gi gi mt phng thc Finalize() ca mt i tng mt cch trc tip, ngoi tr gi phng thc ny ca lp c s khi bn trong phng thc Finalize() ca lp ang nh ngha. Trnh thu dn s t ng thc hin vic gi Finalize() cho chng ta.

a) Cch Finalize thc hin


B thu dn duy tr mt danh sch nhng i tng c phng thc Finalize(). Danh sch ny c cp nht mi ln khi i tng cui cng c to ra hay b hy. Khi mt i tng trong danh sch kt thc ca b thu dn c chn u tin. N s c t vo hng i (queue) cng vi nhng i tng khc ang ch kt thc. Sau khi phng thc Finalize() ca i tng thc thi b thu dn s gom li i tng v cp nht li danh sch hng i, cng nh l danh sch kt thc i tng.

b) B hy ca C#
Ta khai bo mt phng thc hy trong C# nh sau: ~Class1() { } Tuy nhin, trong ngn ng C# th c php khai bo trn l mt shortcut lin kt n mt phng thc kt thc Finalize() c kt vi lp c s, do vy khi vit ~Class1() {

60

Lp trnh hng i tng

Phm Quang Huy

2008

// Thc hin mt s cng vic } Cng tng t nh vit : Class1.Finalize() { // Thc hin mt s cng vic base.Finalize(); } Do s tng t nh trn nn kh nng dn n s ln xn nhm ln l khng trnh khi, nn ta phi trnh vit cc phng thc hy v vit cc phng thc Finalize() tng minh nu c th c.

c) Phng thc Dispose


Nh chng ta bit th vic gi mt phng thc kt thc Finalize() trong C# l khng hp l, v phng thc ny c thc hin mt cch t ng bi b thu dn rc. Nu mun x l cc ti nguyn khng kim sot (nh x l cc handle ca tp tin), ng hay gii phng nhanh chng bt c lc no th ta nn thc thi giao din IDisposable. Giao din IDisposable yu cu nhng lp thc thi n nh ngha mt phng thc tn l Dispose() thc hin cng vic dn dp. ngha ca phng thc Dispose() l cho php chng trnh thc hin cc cng vic dn dp hay gii phng ti nguyn mong mun m khng phi ch cho n khi phng thc Finalize() c gi. Khi chng ta cung cp mt phng thc Dispose() th phi ngng b thu dn gi phng thc Finalize() trong i tng ca chng ta. ngng b thu dn, chng ta gi mt phng thc tnh ca lp GC (garbage collector) l GC.SuppressFinalize() v truyn tham s l tham chiu this ca i tng. V sau phng thc Finalize() s dng gi phng thc Dispose() nh on m sau: public void Dispose() { // Thc hin cng vic dn dp // Yu cu b thu dn GC trong thc hin kt thc GC.SuppressFinalize( this ); } public override void Finalize() { Dispose(); base.Finalize(); } V d:

61

Lp trnh hng i tng

Phm Quang Huy

2008

using System; public class Mang: IDisposable { int []Data; public int Size; public Mang(int n) { Data = new int[n]; Size = n; } public void Dispose() { // Thuc hien viec don dep Console.WriteLine("Huy mang"); Data =new int [0]; Size = 0; // yeu cau bo thu don GC thuc hien ket thuc GC.SuppressFinalize( this ); } public void Nhap() { for( int i =0; i < Size; i++) { Console.WriteLine("nhap phan tu thu {0} ",i); Data[i] int.Parse(Console.ReadLine()); } } public void Xuat() { for( int i = 0; i < Size; i++) { Console.Write("{0} \t",Data[i]); } } class App { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Test() { Mang A = new Mang(5); A.Nhap(); } =

62

Lp trnh hng i tng

Phm Quang Huy

2008

} static void Main(string[] args) { Test(); Console.ReadLine(); } }

A.Xuat(); A.Dispose();

d) Phng thc Close


Khi xy dng cc i tng, chng ta mun cung cp cho ngi s dng phng thc Close(), v phng thc Close() c v t nhin hn phng thc Dispose() trong cc i tng c lin quan n x l tp tin. Ta c th xy dng phng thc Dispose() vi thuc tnh l private v phng thc Close() vi thuc tnh public. Trong phng thc Close() n gin l gi thc hin phng thc Dispose().

e) Cu lnh using
Khi xy dng cc i tng chng ta khng th chc chn c rng ngi s dng c th gi hm Dispose(). V cng khng kim sot c lc no th b thu dn GC thc hin vic dn dp. Do cung cp kh nng mnh hn kim sot vic gii phng ti nguyn th C# a ra c php ch dn using, c php ny m bo phng thc Dispose() s c gi sm nht c th c. tng l khai bo cc i tng vi c php using v sau to mt phm vi hot ng cho cc i tng ny trong khi c bao bi du ({}). Khi khi phm vi ny kt thc, th phng thc Dispose() ca i tng s c gi mt cch t ng. using System.Drawing; class Tester { public static void Main() { using ( Font Afont = new Font(Arial,10.0f)) { // on m s dng AFont ....... }// Trnh bin dch s gi Dispose gii phng AFont Font TFont = new Font(Tahoma,12.0f); using (TFont) { // on m s dng TFont ....... }// Trnh bin dch gi Dispose gii phng TFont } } 63

Lp trnh hng i tng

Phm Quang Huy

2008

Trong phn khai bo u ca v d th i tng Font c khai bo bn trong cu lnh using. Khi cu lnh using kt thc, th phng thc Dispose() ca i tng Font s c gi. Cn trong phn khai bo th hai, mt i tng Font c to bn ngoi cu lnh using. Khi quyt nh dng i tng ny ta t n vo cu lnh using. V cng tng t nh trn khi khi cu lnh using thc hin xong th phng thc Dispose() ca font c gi.

III.9.3. Thc thi nhiu giao din


Cc lp c th thc thi nhiu giao din, y l cch thc hin a k tha trong C#. V d: To mt giao din tn l Istoreable vi cc phng thc Write() lu ni dung ca i tng vo file v phng thc Read() c d liu t file. Sau ta to lp Document thc thi giao din Istorable cc i tng thuc lp ny c th c t c s d liu hoc lu tr vo c s d liu. Vic m file c thc hin thng qua i tng fs thuc lp FileStream, vic ghi v c file thng qua i tng thuc cc lp StreamWriter v StreamReader. ng thi lp Document cng thc thi mt giao din khc tn l Iencryptable, giao din ny c hai phng thc l m ha (Encrypt( ))v gii m (Decrypt( )):
using System; using System.IO; // Khai bao giao dien interface IStorable { // mac dinh cac khai bao phuong thuc la public. Khong cai dat gi void Read(string FileName); void Write(string FileName); string Data { get; set; } } interface IEncryptable { void Encrypt( ); void Decrypt( ); } // Lop Document thuc thi giao dien IStorable public class Document : IStorable, IEncryptable { string S; public Document(string str) { S = str; } // thuc thi phuong thuc Read cua giao dien IStorable

64

Lp trnh hng i tng

Phm Quang Huy

2008

public void Read( string FileName) { //Mo fiel de doc FileStream fs = new FileStream(FileName,FileMode.Open); //tao luong doc du lieu StreamReader sr = new StreamReader(fs); //Doc tung dong cho den khi gia tri doc duoc la null string text; S= ""; while((text = sr.ReadLine())!=null) { S = S + text; } //Dong luong va dong file sr.Close(); fs.Close(); } // thuc thi phuong thuc Write cua giao dien IStorable public void Write(string FileName) { //Mo file de ghi du lieu FileStream fs ; fs = new fileStream(FileName,FileMode.OpenOrCreate); //Tao luong ghi du lieu vao file StreamWriter sw = new StreamWriter(fs); //ghi chuoi S ra file sw .WriteLine(S); //dong luong va dong file sw .Close(); fs.Close(); } // thuc thi thuoc tinh Data cua giao dien IStorable public string Data { get { return S; } set { S = value; } } // thuc thi phuong thuc Encrypt cua giao dien IEncryptable public void Encrypt() { string KQ =""; for (int i = 0 ; i< S.Length; i++) KQ = KQ + (char)((int)S[i] + 5); S = KQ; } // thuc thi phuong thuc Encrypt cua giao dien IEncryptable

65

Lp trnh hng i tng

Phm Quang Huy

2008

} // Thu nghiem chuong chinh public class Tester { static void Main( ) { string FileName = "F:\\datafile.txt"; Document doc = new Document("THIEU NU la viet tat cua tu THIEU NU TINH"); doc.Write(FileName); doc.Read(FileName); Console.WriteLine("Du lieu trong file: {0}", doc.Data); Console.WriteLine("Du lieu sau khi ma hoa:"); doc.Encrypt(); Console.WriteLine(doc.Data); Console.WriteLine("Du lieu sau khi giai ma:"); doc.Decrypt(); Console.WriteLine(doc.Data); Console.ReadLine(); } }

public void Decrypt() { string KQ =""; for (int i = 0 ; i< S.Length; i++) KQ= KQ + (char)((int)S[i] - 5); S = KQ; }

V giao din l mt dng lp c s nn ta c th cho mt tham chiu kiu giao din tr ti i tng thuc lp thc thi giao din v gi nhng phng thc cn thit. Chng hn, trong hm Main() trn ta c th thay cu lnh:
doc.Read(FileName);

bng hai cu lnh sau:


IStorable isDoc = doc; //(IStorable) doc; isDoc.Read(FileName);

III.9.4. M rng giao din


Ta cng c th m rng giao din bng cch b sung nhng thnh vin hay phng thc mi. Chng hn, ta c th m rng giao tip IStorable thnh IStorableAndCompressible bng cch k tha t giao tip Istorable b sung cc phng thc nn file v gii nn file:
interface IStorableAndCompressible : IStorable { // bo sung them phuong thuc nen va giai nen void Compress( ); void Decompress( );

66

Lp trnh hng i tng

Phm Quang Huy

2008

III.9.5. Kt hp giao din


Thay v lp Document thc thi hai giao din IStorable, IEncryptable , ta c th to kt hp hai giao din ny thnh mt giao din mi l IStorableAndEncryptable. Sau lp Document thc thi giao din mi ny:
interface IstorableAndEncryptable: IStorable, IEncryptable { //C th b sung thm cc phng thc, thuc tnh mi } public class Document : IStorableAndEncryptable { }

III.9.6. Kim tra i tng c h tr giao din hay khng bng ton t is
Ta c th hi mt i tng c h tr giao tip hay khng gi cc phng thc thch hp bng cch dng ton t is. Nu i tng khng h tr giao din m ta c tnh p kiu th c th xy ra bit l (li khi thc thi chng trnh). V d: kim tra i tng doc c h tr giao din IStorable hay khng, nu c th p sang kiu IStorable v gi phng thc Read().
static void Main( ) { Document doc = new Document("Test Document"); // chi ep sang kieu Istorable neu doi tuong co ho tro if (doc is IStorable) { IStorable isDoc = (IStorable) doc; isDoc.Read( ); } }

III.9.7. Cc giao din Icomparer, IComparable (giao din so snh) v ArrayList


Thuc name space System.Conllections Khi thi cng giao din IComparer cn ci t hm m t s so snh hai i tng obj1 v obj2: int Compare(Objerct obj1, Object obj2) Khi thi cng giao din IComparable cn ci t hm m t s so snh ca i tng hin ti vi mt i tng obj2 khc. int CompareTo(Object obj2) 67

Lp trnh hng i tng

Phm Quang Huy

2008

ArrayList c cc chc nng ca c mng v danh sch lin kt nh: Tn Count Add BinarySearch Contains Clear IndexOf LastIndexOf Insert Remove RemoveAt Reverse Sort Loi Hm Hm Hm Hm Hm Hm Hm Hm Hm Hm Hm ... ArrayList cho php sp xp bt c i tng no ci t giao din Icomparable. V d 1: o Khai bo v cp pht i tng ArrayList AL:
ArrayList AL = new ArrayList();

ngha Thm mt phn t vo cui Tm nh phn Kim mt phn t c thuc Array List hay khng Xa cc phn t Tr v v tr u tin ca phn t cn tm Tr v v tr cui cng ca phn t cn tm Chn 1 phn t vo 1 v tr no Loi b 1 phn t Loi b 1 phn t ti mt v tr no o chiu Sp xp

Thuc tnh S phn t hin c

o Thm mt phn t c gi tr 5 vo cui AL:


AL.Add(5);

o Chn gi tr 6 vo u AL:
AL.Insert(0, 6);

o Xut phn t th 2 trong AL:


Console.WriteLine({0}, AL[1]);

V d 2: sp xp trn ArrayList theo tn ca nhn vin.


using System; using System.Collections; class NhanVien: IComparable {

68

Lp trnh hng i tng

Phm Quang Huy

2008

sanh khac

string Ten; long Luong; public NhanVien(string T, long L) { Ten = T; Luong = L; } public override string ToString() { return Ten + ", " + Luong; } //Thuc thi ham cua giao dien IComparable //Ham nay uy quyen viec so sanh 2 doi tuong cho ham so //ten cua doi tuong hien hanh voi ten cua doi tuong public int CompareTo(Object rhs) { NhanVien r = (NhanVien) rhs; return Ten.CompareTo(r.Ten); } public void Xuat() { Console.WriteLine(Ten + ", " + Luong); }

} class App { [STAThread] static void Main(string[] args) { string []AT = {"Anh Hai", "Chi Hai","Anh Ba","Chi Ba"}; long []AL = {500, 600, 700, 800}; ArrayList empArray = new ArrayList(); Random r = new Random(10); //r.Next(X):---> Tao so nguyen <= X string T; long L; //Toa cac nhan vien nhan Ten va Luong ngau nhien for (int i =0 ; i<5; i ++) { T= AT[r.Next(4)]; L= AL[r.Next(4)]; empArray.Add(new NhanVien(T, L)); } Console.WriteLine("================================"); Console.WriteLine("Cac nhan vien"); for (int i =0 ; i<5; i ++)

69

Lp trnh hng i tng

Phm Quang Huy

2008

{ Console.WriteLine(empArray[i].ToString()); } Console.WriteLine("Tat ca co {0} nhan vien", empArray.Count); //Chen 2 nhan vien vao vi tri thu 2 v 4 NhanVien nv = new NhanVien("Anh Tu", 900); empArray.Insert(1,nv); nv = new NhanVien("Chi Tu", 300); empArray.Insert(3, nv); //Xuat Console.WriteLine("================================"); Console.WriteLine("Them 2 nhan vien"); foreach (NhanVien x in empArray) { x.Xuat(); } Console.WriteLine("Tat ca co {0} nhan vien", empArray.Count); //Xoa mot nhan vien cuoi cung va sap xep theo ten Console.WriteLine("================================"); empArray.RemoveAt(3); empArray.Sort(); Console.WriteLine("Sau khi xoa nhan vien thu 4 va sap xep theo luong:"); foreach (NhanVien x in empArray) { x.Xuat(); } Console.WriteLine("Tat ca co {0} nhan vien", empArray.Count); } } Console.ReadLine();

Nu mi i tng trong ArrayList c th c nhiu tiu ch so snh ta cng c th sp xp theo tiu ch tng ng. Chng hn ta c th sp xp nhn vin theo tn nhng cng c th sp xp theo lng. Khi cch ci t nh sau: a) Xy dng mt lp chnh k tha giao din IComparable. Thc thi 2 hm sau: int CompareTo(Object obj) ca giao din IComparable .

70

Lp trnh hng i tng

Phm Quang Huy

2008

int CompareTo(Object obj, ThamSQuinhTieuChSoSnh comp).


class NhanVien //LopChinh { int CompareTo(Object obj) {}. int CompareTo(Object obj, ThamSQuinhTiuChSoSnh comp) { //cc cu lnh so snh tng ng vi tiu ch comp }
}

b) Xy dng mt lp k tha giao din Icomparer Lp ny l mt lp ni ti ca lp chnh (inner class-lp nh ngha bn trong mt lp khc) ang xy dng. (Trong v d ny, lp chnh l lp NhanVien, lp ni ti l lp EmpComparer chnh). i tng ca lp ni ti s qun l vic so snh hai i tng thuc lp chnh, n s gi hm so snh ca lp chnh theo tiu ch cn so snh.
public class EmpComparer: IComparer { ThamSQuinhTiuChSoSnh com; public int Compare(Object lhs, Object rhs) { NhanVien r = (NhanVien) rhs; NhanVien l = (NhanVien) lhs; return l.CompareTo(r, _whichComparison); } }

c) Trc khi gi hm Sort() ca i tng ArrayList ta cn thc hin cc vic sau: o To mt i tng (tm gi l comp) thuc lp ni ti. o Qui nh tiu ch so snh thng qua i tng comp ny. o Gi hm Sort ca ArrayList vi tham s l i tng comp ny. V d 3: sp xp cc nhn vin trong ArrayList theo nhiu tiu ch khc nhau.
using System; using System.Collections; class NhanVien: IComparable { string Ten; long Luong; public NhanVien(string T, long L) { Ten = T;

71

Lp trnh hng i tng

Phm Quang Huy

2008

Luong = L; } public override string ToString() { return Ten + " , " + Luong; } public static EmpComparer GetComparer() { return new NhanVien.EmpComparer(); }

// Mac dinh se sap xep theo ten.


//So sanh ten voi ten cua doi tuong khac public int CompareTo(Object rhs) { NhanVien r = (NhanVien) rhs; return Ten.CompareTo(r.Ten); } // So sanh ten voi ten cua doi tuong khac public int CompareTo(NhanVien EmpComparer.ComparisonType whichComparison) { switch (whichComparison) { case EmpComparer.ComparisonType.Ten: return Ten.CompareTo(rhs.Ten); case EmpComparer.ComparisonType.Luong: return Luong.CompareTo(rhs.Luong); default: return 0; } rhs,

} // Lop noi tai (inner class) dung de thiet lap cac thong tin so sanh hai doi tuong cung lop nhan vien public class EmpComparer:System.Collections.IComparer { ComparisonType _whichComparison; public enum ComparisonType { Ten,Luong } public int Compare(Object lhs, Object rhs) { NhanVien r = (NhanVien) rhs; NhanVien l = (NhanVien) lhs; return l.CompareTo(r, _whichComparison); } public ComparisonType WhichComparison {

72

Lp trnh hng i tng

Phm Quang Huy

2008

} }

get {return _whichComparison;} set {_whichComparison =value;}

} class App { [STAThread] static void Main(string[] args) { string []AT = {"Anh Hai", "Chi Hai","Anh Ba","Chi Ba"}; long []AL = {500, 600, 700, 800}; ArrayList empArray = new ArrayList(); Random r = new Random(10); //r.Next(X):---> Tao so nguyen <= X string T; long L; for (int i =0 ; i<5; i ++) { T= AT[r.Next(4)]; L= AL[r.Next(4)]; empArray.Add(new NhanVien(T, L)); } Console.WriteLine("======================="); Console.WriteLine("Truoc khi sap xep"); for (int i =0 ; i<5; i ++) Console.WriteLine(empArray[i].ToString()); //Tao doi tuong quan ly viec so sanh NhanVien.EmpComparer c = NhanVien.GetComparer(); //Qui dinh tieu chi so sanh la theo luong c.WhichComparison = NhanVien.EmpComparer.ComparisonType.Luong; //Goi ham Sort, tham so la doi tuong quan ly viec so sanh empArray.Sort(c); Console.WriteLine("======================="); Console.WriteLine("Sau khi sap xep theo luong:"); for (int i =0 ; i<5; i ++) Console.WriteLine(empArray[i].ToString()); Console.WriteLine("======================="); //Qui dinh lai tieu chi so sanh la theo ten c.WhichComparison = NhanVien.EmpComparer.ComparisonType.Ten; //Goi ham Sort voi tham so la doi tuong quna ly viec so sanh empArray.Sort(c); Console.WriteLine("Sau khi sap xep theo ten:"); for (int i =0 ; i<5; i ++) Console.WriteLine(empArray[i].ToString());

73

Lp trnh hng i tng

Phm Quang Huy

2008

Console.ReadLine(); } }

Giao din IComparable c tc dng thit lp tiu ch sp xp mc nh. V vy, lp chnh (NhanVien) khng nht thit phi k tha giao din IComparable, tuy nhin khi mi ln gi hm Sort() ca ArrayList ta lun phi xc nh trc tiu ch sp xp.

III.9.8. Cu hi n tp
1. S chuyn bit ha c s dng trong C# thng qua tnh g? 2. Khi nim a hnh l g? Khi no th cn s dng tnh a hnh? 3. Hy xy dng cy phn cp cc lp i tng sau: Xe_Toyota, Xe_Dream, Xe_Spacy, Xe_BMW, Xe_Fiat, Xe_DuLich, Xe_May, Xe? 4. T kha new c s dng lm g trong cc lp? 5. Mt phng thc o trong lp c s c nht thit phi c ph quyt (nh ngha li) trong lp dn xut hay khng? 6. Lp tru tng c cn thit phi xy dng hay khng? Hy cho mt v d v mt lp tru tng cho mt s lp. 7. Lp Object cung cp nhng phng thc no m cc lp khc thng xuyn k tha s dng.

III.9.9. Bi tp tng hp
1. Hy xy dng cc lp i tng trong cu hi 3, thit lp cc quan h k tha da trn cy k tha m bn xy dng. Mi i tng ch cn mt thuc tnh l myNane cho bit tn ca n (nh Xe_Toyota th myName l Toi la Toyota...). Cc i tng c phng thc Who() cho bit gi tr myName ca n. Hy thc thi s a hnh trn cc lp . Cui cng to mt lp Tester vi hm Main() to mt mng cc i tng Xe, a tng i tng c th vo mng i tng Xe, sau cho lp tng i tng trong mng n t gii thiu tn (bng cch gi hm Who() ca tng i tng). 2. Xy dng cc lp i tng hnh hc nh: im, on thng, ng trn, hnh ch nht, hnh vung, tam gic, hnh bnh hnh, hnh thoi. Mi lp c cc thuc tnh ring xc nh c hnh v biu din ca n nh on thng th c im u, im cui.... Mi lp thc thi mt phng thc Draw() ph quyt phng thc Draw() ca lp c s gc ca cc hnh m n dn xut. Hy xy dng lp c s ca cc lp trn v thc thi a hnh vi phng thc Draw(). Sau to lp Tester cng vi hm Main() th nghim a hnh ging nh bi tp 1 trn.

74

Lp trnh hng i tng

Phm Quang Huy

2008

PH LC
Ph lc A - C BN V NGN NG C#
I. To ng dng trong C#
V d di y l mt ng dng dng lnh (console application) n gin, ng dng ny giao tip vi ngi dng thng qua bn phm, mn hnh DOS v khng c giao din ha ngi dng, ging nh cc ng dng thng thy trong Windows. Khi xy dng cc ng dng nng cao trn Windows hay Web ta mi cn dng cc giao din ha, cn tm hiu v ngn ng C# thun tu th cch tt nht l ta vit cc ng dng dng lnh. ng dng dng lnh trong v d sau s xut chui Hello World ra mn hnh. V d:
using System; //Khai bo th vin class HelloWorld //Khai bo lp { static void Main( ) //nh ngha hm Main { //Xut cu thng bo Hello ra mn hnh System.Console.WriteLine("Hello World"); //Ch ngi dng g mt phm bt k dng chng trnh System.Console.ReadLine(); } }

Chng trnh trn khai bo mt kiu n gin: lp HelloWorld bng t kha class, c bao bi du {}, trong c mt phng thc (hm) tn l Main(). V khi chng trnh thc thi, CLR gi hm Main() u tin nn mi chng trnh phi c mt v ch mt hm Main(). Cc lp c cc thuc tnh d liu v cc hnh vi ca chng. Thuc tnh d liu l cc thnh phn d liu m mi i tng thuc lp u c. Hnh vi l phng thc ca lp (cn gi l hm thnh vin), l cc hm thao tc trn cc thnh phn d liu ca lp. Trong v d ny, lp HelloWorld khng c thuc tnh d liu v hnh vi no (tr hm Main() bt buc phi c). Trong v d ny, ta s dng i tng Console thao tc vi bn phm v mn hnh. i tng Console thuc khng gian (name space, th vin) System v vy ta s dng ch th using System u chng trnh. truy cp n mt thnh phn ca lp hoc ca i tng ta dng ton t chm .. Lnh System.Console.WriteLine("Hello World"); c

75

Lp trnh hng i tng

Phm Quang Huy

2008

ngha l gi hm WriteLine ca i tng Console trong th vin System xut mt chui "Hello World" ra mn hnh. Lnh System.Console.ReadLine(); thc cht dng nhp mt chui t bn phm. Trong trng hp ny n c tc dng ch ngi dng nhn phm Enter kt thc chng trnh. Ch : Phn 1 ny trnh by cc chng trnh theo phng php lp trnh th tc truyn thng nhm lm quen vi ngn ng C#.

I.1. Son tho chng trnh Hello World

Khi ng MS Visual Studio .Net 2003 qua cc bc sau: Start \ Programs \ Chn MS Visual Studio .Net 2003 \ MS Visual Studio .Net 2003. To ng dng dng lnh tn l Hello World qua cc bc sau: File \ New \ Project. Chn Visual C# Project trong Project Types v chn Console Application trong Templates nh hnh di y. Nhp vo tn d n l HelloWorld vo Name v ng dn lu tr d n vo Location (v d, E:\C#Projects).

Hnh I-1: To ng dng C# console trong Visual Studio .NET.

Sau a lnh sau vo trong phng thc Main(). 76

Lp trnh hng i tng

Phm Quang Huy

2008

System.Console.WriteLine("Hello World");

I.2. Bin dch v chy chng trnh Hello World


Chn Ctrl+Shift+B hay Build Build. Nhn Ctrl + F5 chy chng trnh m khng thc hin d li.

II. C s ca ngn ng C#
Trong phn trc chng ta tm hiu cch to mt chng trnh C# n gin. Phn ny s trnh by cc kin thc c bn cho vic lp trnh trong ngn ng C# nh: h thng kiu d liu xy dng sn (nh int, bool, string), hng, cu trc lit k, chui, mng, biu thc v cu lnh, cc cu trc iu khin nh if, switch, while, do...while, for, v foreach... Nm vng phn ny s gip ta hiu phng php lp trnh hng i tng mt cch nhanh chng, d dng.

II.1. Kiu d liu


Kiu d liu trong C# c th c phn lm 2 lai:

Kiu dng sn: int, long Kiu ngi dng to ra: lp, struct Kiu gi tr: gi tr tht s ca n c cp pht trn stack. V d: int, long , struct. Kiu tham chiu: a ch ca kiu tham chiu c lu tr trn stack nhng d liu tht s lu tr trong heap. V d: lp, mng Tt c cc kiu d liu xy dng sn l kiu d liu gi tr ngoi tr cc i tng, mng v chui. V tt c cc kiu do ngi dng nh ngha ngoi tr kiu cu trc u l kiu d liu tham chiu.

Tuy nhin, ngi lp trnh thng quan tm ti cch phn loi sau:

Ch :

II.1.1. Cc kiu xy dng sn trong C#:


Ngn ng C# a ra cc kiu d liu xy dng sn rt hu dng, ph hp vi mt ngn ng lp trnh hin i. Mi kiu nguyn thy ca C# c nh x n mt kiu d liu c h tr bi h thng xc nhn ngn ng chung (Common Language Specification: CLS) trong MS.NET. Vic nh x ny m bo cc i tng c to ra trong C# c th c s dng ng thi vi cc i tng c to bi bt c ngn ng khc c bin dch bi .NET, chng hn VB.NET. Kiu trong C# Kch thc (byte) Kiu tng ng trong .Net

M t

77

Lp trnh hng i tng

Phm Quang Huy

2008

byte char bool sbyte short ushort int uint float double decimal long ulong

1 1 1 1 2 2 4 4 4 8 8 8 8

Byte Char Boolean Sbyte Int16 Uint16 Int32 Uint32 Single Double Decimal Int64 Uint64

Khng du 0

255

K t unicode True hay false C du(-128 C du -32.768 Khng du (0 127) 32.767 65353)

C du -2,147,483,647 2,147,483,647. Khng du 0 4,294,967,295.


+/-1.5 * 10--45 +/-5.0 * 10-324 +/-3.4 * 1038 +/-1.7 * 10308

Ln n 28 ch s.
-9,223,372,036,854,775,808

9,223,372,036,854,775,807 0 to 0xffffffffffffffff.

C# i hi cc bin phi c khi gn gi tr trc khi truy xut gi tr ca n.

II.1.2. Hng
C php: const kiu tn_bin = gi tr. V d II.1.2: Khai bo hai hng s DoDongDac, DoSoi (nhit ng c v nhit si).
using System; class Values { const int DoDongDac = 32; // Nhit ng c const int DoSoi = 212; // si static void Main( ) { Console.WriteLine("Nhit ng c ca nc: {0}", DoDongDac); Console.WriteLine("Nhit si ca nc: {0}", DoSoi);

78

Lp trnh hng i tng

Phm Quang Huy

2008

} }

II.1.3. Kiu lit k


Kiu lit k l mt kiu gi tr ri rc, bao gm mt tp cc hng c lin quan vi nhau. Mi bin thuc kiu lit k ch c th nhn gi tr l mt trong cc hng lit k. Chng hn, thay v khai bo di dng v ri rc nh sau:
const int DoDongDac = 32; // Nhit ng c const int DoSoi = 212; // si

const int HoiLanh = 60; const int AmAp = 72;

ta c th nh ngha kiu lit k c tn l NhietDo nh sau: enum NhietDo {


DoDongDac = 32; // Nhit ng c DoSoi = 212; // si

HoiLanh = 60; AmAp = 72;

} Mi kiu lit k c th da trn mt kiu c s nh int, short, long..(tr kiu char). Mc nh l kiu int. V d II.1.3.1: Xy dng kiu lit k m t kch c ca mt i tng no da trn kiu s nguyn khng du:
enum KichCo: uint { Nho = 1; Vua = 2; Rong = 3; }

V d II.1.3.2: V d minh ha dng kiu lit k n gin m chng trnh:


using System; enum NhietDo { GiaBuot = 0, DongDac = 32, AmAp = 72, NuocSoi = 212 } class Enum { static void Main(string[] args) { Console.WriteLine("Nhit ng c ca nc: {0}", NhietDo.DoDongDac);

79

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("Nhit si ca nc: {0}", NhietDo.DoSoi); } }

Mi hng trong kiu lit k tng ng vi mt gi tr. Nu chng ta khng ch ra gi tr, gi tr mc nh l 0 v tng th t vi cc phn t tip theo. V d II.1.3.3
enum SomeValues { First, }

Second, Third = 20, Fourth

Khi : First = 0, Second = 2, Third = 20, Fourth = 21.

II.1.4. Kiu chui


i tng string lu tr mt chui cc k t. Chui l mt mng cc k t nn ta c th truy cp n tng k t tng t nh cch truy cp n mt phn t ca mng. Ta khai bo mt bin string sau gn gi tr cho bin string hoc va khai bo va khi gn gi tr. string myString = Hello World; Ch : Ta c th gn (ton b) mt gi tr mi cho mt bin kiu string nhng khng th thay i tng k t trong chui. V d II.1.4.1: C th thc hin cc lnh sau: string S1 = Hello World; S1 = how are you?; V d II.1.4.2: Khng th thc hin cc lnh sau: string S1 = Hello World; S1[0] = h;

II.2. Lnh r nhnh


II.2.1. Lnh if
V d II.2.1: Nhp mt s nguyn, kim tra s va nhp l chn hay l.
using System; namespace IfExample { class IF

80

Lp trnh hng i tng

Phm Quang Huy

2008

{ static void Main(string[] args) { int Value; Console.WriteLine("Nhap mot so nguyen!"); value //Nhp mt s nguyn t bn phm v gn cho Value = Int32.Parse(Console.ReadLine()); if (Value % 2 == 0) Console.WriteLine("Ban nhap so chan!"); else Console.WriteLine("Ban nhap so le!"); Console.Read(); } } }

II.2.2. Lnh switch


C php: switch (Biu thc) { case hngs_1: Cc cu lnh Lnh nhy case hngs_2: Cc cu lnh Lnh nhy [default: cc cu lnh] } V d II.2.2 Hin mt thc n v yu cu ngi dng chn mt
using System; enum ThucDon:int { Xoai,Oi,Coc } //Minh hoa lenh switch class Switch { static void Main(string[] args) { ThucDon Chon; NhapLai: Console.WriteLine("Chon mot mon!");

81

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("{0} - Xoai", (int)ThucDon.Xoai); Console.WriteLine("{0} - Oi", (int)ThucDon.Oi); Console.WriteLine("{0} - Coc", (int)ThucDon.Coc); Chon=(ThucDon) int.Parse(Console.ReadLine()); if (Chon < 0) goto NhapLai; switch(Chon) { case ThucDon.Xoai: Console.WriteLine("Ban chon an 1 qua break; case ThucDon.Oi: Console.WriteLine("Ban chon an 1 mieng break; case ThucDon.Coc: Console.WriteLine("Ban chon an 1 con coc!"); break; default: Console.WriteLine("Nha hang chua co mon nay!"); break; } Console.WriteLine("Chuc ban ngon mieng!"); Console.ReadLine(); } }

xoai!");

oi!");

Ghi ch: Trong C#, ta khng th t ng nhy xung mt trng hp case tip theo nu cu lnh case hin ti khng rng.

II.2.3. Lnh goto


V d II.2.3: Xut cc s t 0 n 9
using System; public class Tester { public static int Main( ) { int i = 0; LapLai: // nhn Console.WriteLine("i: {0}",i); i++; if (i < 10) goto LapLai; // nhy ti nhn LapLai

82

Lp trnh hng i tng

Phm Quang Huy

2008

return 0; } }

II.2.4. Lnh lp while


V d II.2.4: Phn tch s nguyn dng N ra tha s nguyn t.
using System; class While { static void Main(string[] args) { int N, M, i; Console.WriteLine("Nhap so nguyen duong (>1): "); N= int.Parse(Console.ReadLine()); if (N <2) { Console.WriteLine("So khong hop le "); return; } string KetQua; KetQua = ""; i=2; M=N; while(M>1) { if (M%i==0) { M=M/i; if (KetQua.Equals(""))KetQua = KetQua + i; else KetQua = KetQua + "*"+i; } else i = i +1; } Console.WriteLine("So {0} o dang thua so nguyen to la:{1}", N, KetQua); Console.ReadLine(); } }

II.2.5. Lnh dowhile


C php: do <lnh> while <biu_thc>. Vng lp do while thc hin t nht 1 ln. V d II.2.5: Kt qu ca on lnh sau l g?

83

Lp trnh hng i tng

Phm Quang Huy

2008

using System; public class Tester { public static int Main( ) { int i = 11; do { Console.WriteLine("i: {0}",i); i++; } while (i < 10); return 0; } }

II.2.6. Lnh for


C php: for (khi to; iu kin dng; lp) lnh; V d II.2.6: Kim tra s nguyn t
using System; class NguyenTo { static void Main(string[] args) { int N, i; Console.WriteLine("Nhap so nguyen duong (>1): "); N= int.Parse(Console.ReadLine()); if (N <2) { Console.WriteLine("So khong hop le "); return; } bool KetQua; KetQua = true; for ( i = 2; i<= Math.Sqrt(N); i++) { if (N%i==0) { KetQua = false; break; } } if (KetQua) Console.WriteLine("{0} la so nguyen to",N); else Console.WriteLine("{0} khong la so nguyen to",N); Console.ReadLine(); }

84

Lp trnh hng i tng }

Phm Quang Huy

2008

II.2.7. Lnh foreach


Vng lp foreach cho php to vng lp duyt qua mt tp hp hay mt mng. Cu lnh foreach c c php chung nh sau: foreach ( <kiu thnh phn> <tn truy cp thnh phn > in < tn tp hp>) <Cc cu lnh thc hin> V d II.2.7: Xut cc k t trong chui.
using System; using System.Collections.Generic; using System.Text; public class UsingForeach { public static int Main() { string S = "He no"; string[] MonAn; MonAn = new string[3] {"Ga", "Vit","Ngan"}; foreach (char item in S) { Console.Write("{0} ", item); } Console.WriteLine(); foreach (string Si in MonAn) { Console.Write("{0} \n", Si); } System.Console.Read(); return 0; } }

II.2.8. Lnh continue v break


Thnh thong chng ta mun quay li vng lp m khng cn thc hin cc lnh cn li trong vng lp, chng ta c th dng lnh continue. Ngc li, nu chng ta mun thot ra khi vng lp ngay lp tc chng ta c th dng lnh break; V d II.2.8: Mt chng trnh lin tc ghi d liu vo file cho n khi chng trnh nhn c tn hiu X. Nu vic ghi d liu thnh cng th chng trnh nhn c tn hiu 0, nu khng thnh cng th nhn c tn hiu A.
using System;

85

Lp trnh hng i tng

Phm Quang Huy

2008

public class Tester { public static int Main( ) { string signal = "0"; // initialize to neutral while (signal != "X") // X indicates stop { Console.WriteLine("Dang ghi du lieu); Console.WriteLine("Nhap mot chuoi tuong trung cho ket qua ghi file: "); Console.WriteLine("0 Khong co loi!"); Console.WriteLine("A Co loi!"); Console.WriteLine("X Khong duoc ghi du lieu nua!"); signal = Console.ReadLine( ); if (signal == "0") { Console.WriteLine("OK!\n"); continue; } if (signal == "A") { Console.WriteLine("Loi! Huy bo thao tac ghi!\n"); break; } //Thu hien viec huy bo du lieu ghi khong thanh cong Console.WriteLine("{0} Dang huy du lieu khong ghi duoc!\n", signal); } return 0; } }

II.3. Mng
Mng thuc loi d liu tham chiu (d liu thc s c cp pht trong Heap).

II.3.1. Mng mt chiu


C php khai bo mng 1 chiu: Kiu [] Ten_bien; C php cp pht cho mng bng t kha new: Ten_bien = new Kiu [ Kch Thc ];

86

Lp trnh hng i tng

Phm Quang Huy

2008

V d II.3.1: Nhp mt mng s nguyn, sp xp v xut ra mn hnh.


using System; class Array { public static void NhapMang(int[] a, uint n) { int i; for ( i = 0; i<n; i++) { Console.WriteLine("Nhap phan tu thu {0}",i); a[i] = Int32.Parse(Console.ReadLine()); } } public static void XuatMang(int[] a, uint n) { int i; for ( i = 0; i<n; i++) Console.Write("{0} ",a[i]); } public static void SapXep(int[] a, uint n) { int i, j, temp; for ( i = 0; i<n-1; i++) { for ( j= i+1; j<n; j++) { if (a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } } public static void Main() { int[] A; uint n; Console.WriteLine("Nhap kich thuoc mang: "); n = uint.Parse(Console.ReadLine()); A= new int[n]; NhapMang(A,n); Console.WriteLine("Mang vua nhap"); XuatMang(A,n);

87

Lp trnh hng i tng

Phm Quang Huy

2008

SapXep(A,n); Console.WriteLine("Mang sau khi sap xep"); XuatMang(A,n); Console.ReadLine();

II.3.2. Mng nhiu chiu


C php khai bo mng 2 chiu: Kiu [][] Ten_bien; V mng 2 chiu l mng m mi phn t li l mt mng con nn ta thc hin vic cp pht mng cc mng trc, sau ln lt cp pht cho cc mng con. C php cp pht cho mng 2 chiu nh sau: Cp php mt mng cc mng: Ten_bien = new Kiu [ Kch Thc][]; Cp pht cho tng mng con th i: Ten_bien [i] = new Kiu [kich thuoc mng th i]; V d II.3.2: Nhp, xut ma trn s thc.
using System; class Matrix { public static void NhapMaTran(float[][]a, uint n, uint m) { int i, j; for ( i = 0; i < n; i++) { for ( j = 0; j < m; j++) { Console.Write("Nhap phan tu thu [{0},{1}]",i,j);
a[i][j] = float.Parse(Console.ReadLine());

} } } m) { public static void XuatMaTran(float[][]a, uint n, uint

88

Lp trnh hng i tng

Phm Quang Huy

2008

int i, j; for ( i = 0; i < n; i++) { for ( j = 0; j < m; j++) Console.Write(" {0}", Console.WriteLine(); }

a[i][j]);

public static void Main() { float[][] A; uint n, m; Console.WriteLine("Nhap kich thuoc cua ma tran: "); Console.WriteLine("Nhap so dong cua ma tran: "); n = uint.Parse(Console.ReadLine()); Console.WriteLine("Nhap so cot cua ma tran: "); m = uint.Parse(Console.ReadLine()); A = new float[n][]; int i; for( i = 0; i < n; i++) A[i] = new float[m]; NhapMaTran(A,n, m); Console.WriteLine("Ma tran vua nhap"); XuatMaTran(A,n,m); Console.ReadLine();

} }

II.3.3. Mt s v d v mng nhiu chiu


Sau y l mt s v d v mng nhiu chiu: Khai bo mng 3 chiu kiu s nguyn vi kch thc mi chiu l 4, 2 v 3:
int[,,] myArray = new int [4,2,3];

Khai bo mng 2 chiu, cp pht v khi gn gi tr cho mng:


int[,] myArray = new int[,] { {1,2}, {3,4}, {5,6}, {7,8} };

hoc
int[,] myArray = {{1,2}, {3,4}, {5,6}, {7,8}};

Gn gi tr cho mt phn t trong mng 2 chiu: 89

Lp trnh hng i tng

Phm Quang Huy

2008

myArray[2,1] = 25;

II.4. Khng gian tn (namespace)


C th hiu khng gian tn nh l th vin. S dng khng gian tn gip ta t chc m chng trnh tt hn, trnh trng hp hai lp trng tn khi s dng cc th vin khc nhau. Ngoi ra, khng gian tn c xem nh l tp hp cc lp i tng, v cung cp duy nht cc nh danh cho cc kiu d liu v c t trong mt cu trc phn cp. Vic s dng khng gian tn trong lp trnh l mt thi quen tt, bi v cng vic ny chnh l cch lu cc m ngun s dng v sau. Ngoi th vin (namespace) do MS.NET v cc hng th ba cung cp, ta c th to ring cho mnh cc khng gian tn . C# a ra t kha using khai bo s dng khng gian tn trong chng trnh: using < Tn namespace > Trong mt khng gian tn ta c th nh ngha nhiu lp v khng gian tn . to mt khng gian tn ta dng c php sau:
namespace <Tn namespace> { < nh ngha lp A> < nh ngha lp B > ..... }

V d II.4.1 : nh ngha lp Tester trong namespace Programming_C_Sharp.


namespace Programming_C_Sharp { using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } }

V d II.4.2: Khai bo khng gian tn lng nhau:

90

Lp trnh hng i tng

Phm Quang Huy

2008

namespace Programming_C_Sharp { namespace Programming_C_Sharp_Test1 { using System; public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } } namespace Programming_C_Sharp_Test2 { public class Tester { public static int Main( ) { for (int i=0;i<10;i++) { Console.WriteLine("i: {0}",i); } return 0; } } } }

91

Lp trnh hng i tng

Phm Quang Huy

2008

Ph lc B - BIT L (NGOI L)
L cc dng li gp phi khi chy chng trnh (lc bin dch chng trnh khng pht hin c). Thng l do ngi dng gy ra lc chy chng trnh. Kt thc bi t kho Exception.

I. Nm ra bit l
bo ng s bt thng ca chng trnh. C php: throw [biu thc to bit l]; Sau khi nm ra mt ngoai l, cc on lnh sau lnh throw s b b qua. Chng trnh thc hin vic bt ngoi l hoc dng.

II. Bt ngoi l
chng trnh c tnh dung th li cao hn, cho php vn chy chng trnh i vi nhng li khng qu quan trng. Chng hn khi nhp mt gi tr nguyn, ngi dng v tnh nhp mt k t, khi khng nht thit phi dng chng trnh m ch thng bo li v cho php ngi dng nhp li. chng trnh thn thin hn i vi ngi s dng. Thng bo li c th, thay v dng thng bo li mang tnh k thut kh hiu ca h thng. Vic bt ngoi l c thc hin thng qua khi try { } catch { } nh sau: try { Cc cu lnh c th gy ra bit l. } catch (khai bo bit l 1 ) {cc cu lnh x l bit l 1} catch (khai bo bit l n ) {cc cu lnh x l bit l n} Nu khng c khai bo bit l no trong khi catch th khi ta bt tt c cc dng ngoi l do khi try gy ra. V d: Xt on chng trnh
using System; class Class1 { static void Main(string[] args) {

92

Lp trnh hng i tng

Phm Quang Huy

2008

int x=0; Console.WriteLine("Nhap mot so nguyen"); x=int.Parse(Console.ReadLine()); Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine(); } }

Khi chy chng trnh, nu ta nhp mt s nguyn chng trnh s chy tt. Nu ta (v tnh) nhp mt d liu khng phi l s nguyn (chng hn nhp k t r), chng trnh s dng v bo li runtime sau:
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll Additional information: Input string was not in a correct format.

V vy, chng trnh c tnh dung th li (v y c th l li v tnh ca ngi s dng) ta cn vit li nh sau cho ngi dng nhp li:
using System; class Class1 { static void Main(string[] args) { int x=0; Console.WriteLine("Nhap mot so nguyen"); NHAPLAI: try { x=int.Parse(Console.ReadLine()); } //catch(System.Exception e) catch(System.FormatException e) { Console.WriteLine("Loi : " + e.ToString()); Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; } Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine(); } }

V on m
x=int.Parse(Console.ReadLine());

c th gy ra bit l
System.FormatException

93

Lp trnh hng i tng

Phm Quang Huy

2008

nn ta t n trong khi try v khi catch bt bit l ny. Sau xut thng bo li, nhng khng dng chng trnh m cho php nhp li bng lnh nhy ti nhn NHAPLAI:
goto NHAPLAI;

V mi loi bit l u dn xut t System.Exception nn ta c th xem mi bit l l mt System.Exception. Do vy, nu ta khng bit loi bit l l g ta thay lnh
catch(FormatException e)

bng lnh:
catch(Exception e)

Nu mun bt mi ngoi l nhng khng thng bo li ta c th s dng khi catch rng nh sau:
catch { Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; }

Khi chng trnh cho php nhp li nhng khng thng bo cho ngi dng li l g. V d 2: Bt nhiu ngoi l
using System; class Class1 { static void Main(string[] args) { byte x=0; NHAPLAI: Console.WriteLine("Nhap mot so nguyen"); try { x=byte.Parse(Console.ReadLine()); } //catch(System.Exception e) catch(FormatException e1) { Console.WriteLine("Loi : " +e1.ToString()); Console.WriteLine("Khong duoc nhap loai du lieu khac. Hay nhap lai"); goto NHAPLAI; } catch(OverflowException e2) { Console.WriteLine("Loi : " +e2.ToString());

94

Lp trnh hng i tng

Phm Quang Huy

2008

Console.WriteLine("So phai thuoc doan [0..256]. Hay nhap lai"); goto NHAPLAI; } Console.WriteLine("So nguyen vua nhap {0}",x); Console.ReadLine();

} }

Khi mt ngoi l pht sinh, chng trnh s nhy ngay ti khi catch gn nht c th bt ngoi l hoc dng nu khng c khi catch no c th bt ngoi l ny.

III. Khi finally


Khi t khi finally sau cc khi catch th cho d c bit l hay khng chng trnh vn khng dng m s thc hin khi finally. (Nu bt c ngoi l th chng trnh s thc hin khi catch tng ng trc khi thc hin khi finally). Hy th thm on lnh sau vo v d trn.
finally { Console.WriteLine("So nguyen vua nhap {0}",x); }

IV. Mt s ngoi l khc:


System.OutOfMemoryException: Li khng th cp pht b nh. System.StackOverflowException: Li trn stack. Thng l do gi qui qu su hoc gi qui b lp v tn. System.NullReferenceException: Li xy ra khi truy cp ti mt tham chiu tr ti null trong khi cn mt tham chiu tr ti mt i tng thc s hin hu. System.TypeInitializationException: Hm constructor nm ra mt ngoi l nhng khng c ngoi l catch no bt ngoi l ny. System.InvalidCastException: Xy ra khi khng th thc hin vic p kiu tng minh t mt kiu c s hoc mt giao din sang mt kiu dn xut.

System.ArrayTypeMismatchException: Kiu ca gi tr cn lu vo mng khng hp kiu vi kiu ca mng.


System.IndexOutOfRangeException: Truy cp ngoi mng. System.MulticastNotSupportedException: Li lin quan ti vic khng th kt hp 2 delegate khng null v kiu tr v ca delegate khng phi l void. System.ArithmeticException: Li s hc. Chng hn chia cho 0, trn d liu.

95

Lp trnh hng i tng

Phm Quang Huy

2008

System.DivideByZeroException: Li chia cho 0 System.OverflowException: Trn d liu. Chng hn gn d liu qu ln cho mt bin kiu byte. ...

V. Mt s v d khc
Nn bt bit l c th trc, bit l tng qut
using System; public class Test { public static void Main( ) { Test t = new Test( ); t.CanAChiaB(4,-5 ); Console.ReadLine(); } public void CanAChiaB(int a,int b) { try { if (b == 0) throw new DivideByZeroException( ); if (a*b<= 0) throw new ArithmeticException( ); else { double kq = Math.Sqrt(a/b); Console.WriteLine ("Ket qua = {0}",kq ); } } // Bat ngoai le cu the truoc catch (DivideByZeroException) { Console.WriteLine("Loi chia cho 0!"); } //Bat ngoai le tong quat sau; catch (ArithmeticException) { Console.WriteLine("Co loi so hoc gi gi do...hehe!"); } } }

96

Lp trnh hng i tng

Phm Quang Huy

2008

TI LIU THAM KHO


1) Phm Hu Khang, C# 2005 c bn, Nxb Lao ng X Hi, 2006. 2) Phm Hu Khang, C# 2005 Tp 2-Lp trnh Windows Form, Nxb Lao ng X Hi, 2006. 3) Dng Quang Thin, Lp trnh Visual C# nh th no? Tp 1,2,3, Nxb Tng hp Tp HCM, 2005. 4) Ths.Nguyn Cn, T hc ngn ng lp trnh C++,Nbx ng Nai,1996 . 5) Jesse Liberty, Programming C#, 2nd Edition, tr 1-320 ,Nxb OReilly. 6) Ben Albahari, CSharp Essentials, 2nd Edition, tr 1-88, Nxb OReilly. 7) VN-Guide, Lp trnh Java, Nxb Thng K, 2000.

97

You might also like