Professional Documents
Culture Documents
2008
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
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
2008
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.
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.
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.
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.
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; }
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.
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 }
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
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.
11
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
2008
} 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
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
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;} }
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
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( );
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
2008
vi tng thng. Tuy nhin vi thng 2 th ty nm c nhun hay khng m ta tnh ra gi tr tng ng.
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
2008
Console.ReadLine(); } }
Kt qu chng trnh:
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;
Hour,
Minute,
void GetTime(ref int h, ref int m, ref int s) = Hour; = Minute; = Second;
19
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(); } }
20
2008
Console.ReadLine(); }
21
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
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
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)
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
2008
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
2008
} //
~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
2008
} //Chuyen N dia tu cot A sang cot C, lay cot B lam trung gian A.ChuyenNhieuDia(SoDia,B, C); Console.ReadLine(); } }
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
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
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
2008
{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).
30
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).
// 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
2008
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
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
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)
34
2008
//throw IndexOutOfRangeException();
} set { }
new
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
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
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
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.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
2008
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
2008
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
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
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).
42
2008
43
2008
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.
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
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
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();
46
2008
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
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.
48
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
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; } }
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
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
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
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
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
2008
tat
ca
nhung
thong
tin
tien tin
thue ve xe
xe dap
"
+ cho
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.
55
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;} }
56
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
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.
58
2008
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
2008
"
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.
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
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.
61
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
2008
A.Xuat(); A.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
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.
64
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
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);
66
2008
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( ); } }
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
o Chn gi tr 6 vo u AL:
AL.Insert(0, 6);
68
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
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
2008
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
2008
Luong = L; } public override string ToString() { return Ten + " , " + Luong; } public static EmpComparer GetComparer() { return new NhanVien.EmpComparer(); }
} // 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
2008
} }
} 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
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
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
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#.
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).
2008
System.Console.WriteLine("Hello World");
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.
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 :
M t
77
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)
Ln n 28 ch s.
-9,223,372,036,854,775,808
9,223,372,036,854,775,807 0 to 0xffffffffffffffff.
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
2008
} }
} 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; }
79
2008
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, }
80
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(); } } }
81
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.
82
2008
return 0; } }
83
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; } }
84
2008
85
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).
86
2008
87
2008
88
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();
} }
hoc
int[,] myArray = {{1,2}, {3,4}, {5,6}, {7,8}};
2008
myArray[2,1] = 25;
90
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
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
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
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
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.
95
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
2008
97