1 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 1 Class & Object (tt)Class & Object (tt) 1 Thiết kế và cài đặtThiết kế và cài đặt lớp & đối tượnglớp & đối tượng Thiết kế và cài đặtThiết kế và cài đặt lớp & đối tượnglớp & đối tượng OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 2 8.8. Tham chiếu thisTham chiếu this KhiKhi mộtmột đốiđối tượngtượng đangđang thựcthực thithi mộtmột phươngphương thứcthức (không(không phảiphải làlà phươngphương thứcthức tĩnh),tĩnh), thamtham chiếuchiếu thisthis tựtự độngđộng trỏtrỏ đếnđến đốiđối tượngtượng nàynày CóCó 33 trườngtrường hợphợp sửsử dụngdụng thamtham chiếuchiếu thisthis:: TránhTránh xungxung độtđột têntên khikhi thamtham sốsố củacủa phươngphương thứcthức trùngtrùng têntên vớivới têntên biếnbiến dữdữ liệuliệu củacủa ObjectObject DùngDùng truyềntruyền đốiđối tượngtượng hiệnhiện tạitại làmlàm thamtham sốsố chocho mộtmột phươngphương thứcthức kháckhác (VD(VD gọigọi đệđệ qui)qui) DùngDùng vớivới mụcmục đíchđích chỉchỉ mụcmục (Index)(Index) 2 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 3 Vd: thisVd: this Xem thêm vd trang 25Xem thêm vd trang 25 2626 publicpublic classclass PointPoint {{ privateprivate intint x,yx,y;; publicpublic Point(Point(intint ox,ox, intint oy)oy) {{ thisthis xx == oxox;; //// tươngtương đươngđương xx == oxox;; thisthis yy == oyoy;; //// tươngtương đươngđương yy == oyoy;; }} }} //// GiảGiả sửsử trongtrong hàmhàm MainMain tata khaikhai báobáo nhưnhư sausau:: PointPoint AA == newnew Point(Point(33,,44));; NoteNote:: Trong trường hợp này tham số truyền choTrong trường hợp này tham số truyền cho thisthis chính đối tượng A. Do đó:chính đối tượng A. Do đó: thisthis.x chính là A.x.x chính là A.x Tóm lại:Tóm lại: Tham số truyền cho đốiTham số truyền cho đối thisthis chính làchính là đối tượng đi kèm với phương thức trong lời gọiđối tượng đi kèm với phương thức trong lời gọi phương thức.phương thức. OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 4 9. Đóng gói dữ liệu với thuộc tính9. Đóng gói dữ liệu với thuộc tính ThuộcThuộc tínhtính làlà kháikhái niệmniệm chocho phépphép truytruy cậpcập trạngtrạng tháithái củacủa lớplớp thaythay vìvì thôngthông quaqua truytruy cậpcập trựctrực tiếptiếp cáccác biếnbiến thànhthành viên,viên, nónó sẽsẽ đựơcđựơc thaythay thếthế bằngbằng việcviệc truytruy cậpcập thôngthông quaqua phươngphương thứcthức củacủa lớplớp NóiNói cáchcách kháckhác ThuộcThuộc tínhtính làlà cáccác phươngphương thứcthức lấylấy giágiá trịtrị ((getget)) vàvà gángán giágiá trịtrị ((setset)):: Chỉ đọcChỉ đọc ((readread onlyonly):): chỉ có phương thứcchỉ có phương thức getget Chỉ ghiChỉ ghi ((writewrite onlyonly):): chỉ có phương thứcchỉ có phương thức setset Vừa đọc vừa ghiVừa đọc vừa ghi ((read/writeread/write):): có cả hai phươngcó cả hai phương thứcthức getget vàvà setset 3 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 5 Khai báo Phương thức cho thuộc tínhKhai báo Phương thức cho thuộc tính publicpublic <Return_Type><Return_Type> <Property_name><Property_name> {{ //// phương thức lấy giá trị của thuộc tínhphương thức lấy giá trị của thuộc tính getget {{ // trả về một giá trị cùng kiểu với biến thành viên// trả về một giá trị cùng kiểu với biến thành viên returnreturn BiểuThứcTrảVề;BiểuThứcTrảVề; }} //// phương thức gán giá trị cho thuộc tínhphương thức gán giá trị cho thuộc tính setset {{ BiếnThànhViên =BiếnThànhViên = valuevalue ;; }} }} OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 6 VD minh họaVD minh họa Public class Time { int _Hour, _Minute, _Second ; public int Hour { set { _Hour = value ; } get { return _Hour; } } public int Minute { set { _Minute = value ; } get { return _Minute ; } } public int Second { set { _Second = value ; } get { return _Second ; } } } 4 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 7 VD minh họaVD minh họa Xem thêm vd trang 28Xem thêm vd trang 28 2929 Public class CSinhVien { string _MaSV, _Ten; int _NamSinh ; string _TenNguoiYeu; // No Access-Modifier public string MaSV { // mã sinh viên read-only get { return _MaSV; } } public string Ten { set { _Ten = value ; } get { return _Ten ; } } public int NamSinh { set { _NamSinh = value ; } get { return _NamSinh ; } } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 8 10. Toán tử (operator)10. Toán tử (operator) TrongTrong C#C# toántoán tửtử làlà mộtmột phươngphương thứcthức tĩnhtĩnh (static(static method)method) dùngdùng đểđể quáquá tảitải (overload)(overload) mộtmột phépphép toántoán nàonào đóđó trêntrên cáccác đốiđối tượngtượng MụcMục đíchđích củacủa toántoán tửtử làlà đểđể viếtviết mãmã chươngchương trìnhtrình gọngọn gàng,gàng, dễdễ hiểuhiểu hơn,hơn, thaythay vìvì phảiphải gọigọi phươngphương thứcthức VdVd:: giảgiả sửsử tata cócó lớplớp PhânPhân SốSố cócó pp thứcthức CongCong PhanSoPhanSo psps11 == newnew PhanSo(PhanSo(22,,44)) ;; PhanSoPhanSo psps22 == newnew PhanSo(PhanSo(11,,33)) ;; thaythay vìvì viếtviết:: psps33 == psps11 Cong(psCong(ps22)) tata viếtviết:: PhanSoPhanSo psps33 == psps11 ++ psps22;; nếunếu tata dùngdùng operatoroperator overloadedoverloaded 5 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 9 10. Toán tử (operator) tt10. Toán tử (operator) tt Ta có thể quá tải các toán tử sau:Ta có thể quá tải các toán tử sau: Toán học: + ,Toán học: + , , * , / , %, * , / , % Cộng trừ một ngôi: ++ ,Cộng trừ một ngôi: ++ , ,, Quan hệ so sánh: == , != , > , < , >= , <=Quan hệ so sánh: == , != , > , < , >= , <= Ép kiểu: ()Ép kiểu: () Cú pháp khai báo nguyên mẫu của một toán tử T:Cú pháp khai báo nguyên mẫu của một toán tử T: public staticpublic static KiểuTrảVềKiểuTrảVề operatoroperator T (CácThamSố)T (CácThamSố) {{ //các câu lệnh trong thân toán tử//các câu lệnh trong thân toán tử }} OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 10 10. Chú ý quá tải toán tử (operator overloaded)10. Chú ý quá tải toán tử (operator overloaded) Tham số của toán tử phải là tham trịTham số của toán tử phải là tham trị (không(không dùng các từ khóa ref, out).dùng các từ khóa ref, out). Không được quá tải toán tửKhông được quá tải toán tử == (gán),(gán), &&&& ,, |||| (and,(and, or logic),or logic), ?:?: (điều kiện),(điều kiện), checkedchecked,, uncheckedunchecked,, newnew,, typeoftypeof,, asas,, isis [ ] không được xem là một toán tử[ ] không được xem là một toán tử Khi quá tải các toán tử dạng:Khi quá tải các toán tử dạng: ++,, ,, **,, // ,, %% thì cácthì các toán tửtoán tử +=+=,, ==,, *=*=,, /=/= ,, %=%= được quá tải tự độngđược quá tải tự động Khi quá tải toán tử thì nên quá tải theo cặp đốiKhi quá tải toán tử thì nên quá tải theo cặp đối ngẫu. Chẳng hạn, khi quá tải toán tửngẫu. Chẳng hạn, khi quá tải toán tử ==== thì quáthì quá tải thêm toán tửtải thêm toán tử !=!= …… 6 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 11 10. Chú ý quá tải toán tử (operator overloaded)10. Chú ý quá tải toán tử (operator overloaded) KhiKhi quáquá tảitải toántoán tửtử ==,==, !=!= thìthì nênnên phátphát triểntriển thêmthêm cáccác phươngphương thứcthức Equals()Equals(),, GetHashCode()GetHashCode() đểđể đảmđảm bảobảo luậtluật “hai“hai đốiđối tượngtượng bằngbằng nhaunhau theotheo toántoán tửtử ==== hoặchoặc phươngphương thứcthức EqualsEquals sẽsẽ cócó cùngcùng mãmã băm”băm” KhiKhi địnhđịnh nghĩanghĩa toántoán tửtử épép kiểukiểu tata phảiphải chỉchỉ rara đâyđây làlà toántoán tửtử épép kiểukiểu ngầmngầm địnhđịnh (implicit)(implicit) hayhay tườngtường minhminh (explicit)(explicit) Cú pháp định nghĩa toán tử ép kiểu:Cú pháp định nghĩa toán tử ép kiểu: publicpublic staticstatic [[ implicitimplicit || explicitexplicit ]] operatoroperator KiểuTrảVềTKiểuTrảVềT (Type V)(Type V) Trong đóTrong đó Type VType V là biến cần ép sang kiểulà biến cần ép sang kiểu KiểuTrảVềTKiểuTrảVềT OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 12 VD minh họaVD minh họa Public class PhanSo { int Tu, Mau; public PhanSo(int TuSo, int MauSo) { Tu = TuSo; Mau = MauSo; } public static PhanSo operator + (PhanSo ps1, PhanSo ps2) { int MauMoi = ps1.Mau * ps2.Mau ; int TuMoi = ps2.Mau * ps1.Tu + ps1.Mau * ps2.Tu; return new PhanSo(TuMoi, MauMoi); } } Xem thêm vd trang 31Xem thêm vd trang 31 3333 7 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 13 11. Chỉ mục (Index)11. Chỉ mục (Index) ViệcViệc địnhđịnh nghĩanghĩa chỉchỉ mụcmục chocho phépphép tạotạo cáccác đốiđối tượngtượng củacủa lớplớp hoạthoạt độngđộng giốnggiống nhưnhư mộtmột mảngmảng ảoảo TứcTức làlà cáccác đốiđối tượngtượng cócó thểthể sửsử dụngdụng toántoán tửtử [[ ]] đểđể truytruy cậpcập đếnđến mộtmột thànhthành phầnphần dữdữ liệuliệu nàonào đóđó ViệcViệc địnhđịnh nghĩanghĩa chỉchỉ mụcmục tươngtương tựtự nhưnhư việcviệc địnhđịnh nghĩanghĩa mộtmột thuộcthuộc tínhtính OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 14 11. Cú pháp tạo Chỉ mục (Index)11. Cú pháp tạo Chỉ mục (Index) publicpublic KiểuTrảVềKiểuTrảVề thisthis [DanhSáchThamSố][DanhSáchThamSố] {{ //Hàm đọc//Hàm đọc getget {{ // thân hàm đọc// thân hàm đọc }} // Hàm ghi// Hàm ghi setset {{ // thân hàm ghi// thân hàm ghi }} }} vd trang 34vd trang 34 3535 8 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 15 11. Ghi chú về chỉ mục (Index)11. Ghi chú về chỉ mục (Index) MộtMột chỉchỉ mụcmục phảiphải cócó ítít nhấtnhất mộtmột thamtham số,số, vàvà thamtham sốsố cócó thểthể cócó kiểukiểu bấtbất kỳkỳ ChỉChỉ mụcmục cócó thểthể chỉchỉ cócó phươngphương thứcthức getget MặcMặc dùdù chỉchỉ mụcmục làlà mộtmột đặcđặc điểmđiểm thúthú vịvị củacủa C#C# nhưngnhưng cầncần phảiphải sửsử dụngdụng đúngđúng mụcmục đíchđích (sử(sử dụngdụng đểđể đốiđối tượngtượng cócó thểthể họathọat độngđộng nhưnhư mảng,mảng, mảngmảng nhiềunhiều chiều)chiều) MộtMột lớplớp cócó thểthể cócó nhiềunhiều chỉchỉ mụcmục nhưngnhưng chúngchúng phảiphải cócó cáccác dấudấu hiệuhiệu phânphân biệtbiệt vớivới nhaunhau (tương(tương tựtự nhưnhư quáquá tảitải phươngphương thức)thức) OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 16 Q&AQ&A Bài tập:Bài tập: 1. Đọc lại bài giảng1. Đọc lại bài giảng 2. Làm các bài VD & bài tập trong GT2. Làm các bài VD & bài tập trong GT 3. Đọc bài:3. Đọc bài: Kế thừaKế thừa 4. Buổi tới thảo luận & kiểm tra bài cũ4. Buổi tới thảo luận & kiểm tra bài cũ 16 . 1 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 1 Class & Object (tt )Class & Object (tt) 1 Thiết kế và cài đặtThiết kế và cài đặt lớp & đối tượnglớp & đối tượng Thiết kế và cài. tượng Thiết kế và cài đặtThiết kế và cài đặt lớp & đối tượnglớp & đối tượng OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 2 8.8. Tham chiếu thisTham chiếu this KhiKhi mộtmột đối ối tượngtượng. mụcmục (Index)(Index) 2 OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com 3 Vd: thisVd: this Xem thêm vd trang 25Xem thêm vd trang 25 2626 publicpublic classclass PointPoint {{ privateprivate intint