Bài giảng Thiết kế và cài đặt lớp - Đối tượng (Tiếp theo)
Khi một đối tượng đang thực thi một phương
thức (không phải là phương thức tĩnh), tham
chiếu this tự động trỏ đến đối tượng này.
Có 3 trường hợp sử dụng tham chiếu this:
Tránh xung đột tên khi tham số của phương
thức trùng tên với tên biến dữ liệu của Object
Dùng truyền đối tượng hiện tại làm tham số
cho một phương thức khác (VD gọi đệ qui)
Dùng với mục đích chỉ mục (Index)
1OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com1 Class & Object (tt) 1 Thiết kế và cài đặt lớp & đối tượng OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com2 8. Tham chiếu this Khi một đối tượng đang thực thi một phương thức (không phải là phương thức tĩnh), tham chiếu this tự động trỏ đến đối tượng này. Có 3 trường hợp sử dụng tham chiếu this: Tránh xung đột tên khi tham số của phương thức trùng tên với tên biến dữ liệu của Object Dùng truyền đối tượng hiện tại làm tham số cho một phương thức khác (VD gọi đệ qui) Dùng với mục đích chỉ mục (Index) 2OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com3 Vd: this Xem thêm vd trang 25-26 public class Point { private int x,y; public Point(int ox, int oy) { this.x = ox; // tương đương x = ox; this.y = oy; // tương đương y = oy; } } // Giả sử trong hàm Main ta khai báo như sau: Point A = new Point(3,4); Note: Trong trường hợp này tham số truyền cho this chính đối tượng A. Do đó: this.x chính là A.x Tóm lại: Tham số truyền cho đối this chính là đối tượng đi kèm với phương thức trong lời gọi phương thức. OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com4 9. Đóng gói dữ liệu với thuộc tính Thuộc tính là khái niệm cho phép truy cập trạng thái của lớp thay vì thông qua truy cập trực tiếp các biến thành viên, nó sẽ đựơc thay thế bằng việc truy cập thông qua phương thức của lớp. Nói cách khác Thuộc tính là các phương thức lấy giá trị (get) và gán giá trị (set): Chỉ đọc (read-only): chỉ có phương thức get Chỉ ghi (write-only): chỉ có phương thức set Vừa đọc vừa ghi (read/write): có cả hai phương thức get và set 3OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com5 Khai báo Phương thức cho thuộc tính public { // phương thức lấy giá trị của thuộc tính get { // trả về một giá trị cùng kiểu với biến thành viên return BiểuThứcTrảVề; } // phương thức gán giá trị cho thuộc tính set { BiếnThànhViên = value ; } } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com6 VD 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 ; } } } 4OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com7 VD minh họa Xem thêm vd trang 28-29 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.com8 10. Toán tử (operator) Trong C# toán tử là một phương thức tĩnh (static method) dùng để quá tải (overload) một phép toán nào đó trên các đối tượng. Mục đích của toán tử là để viết mã chương trình gọn gàng, dễ hiểu hơn, thay vì phải gọi phương thức . Vd: giả sử ta có lớp Phân Số có p. thức Cong PhanSo ps1 = new PhanSo(2,4) ; PhanSo ps2 = new PhanSo(1,3) ; thay vì viết: ps3 = ps1.Cong(ps2) ta viết: PhanSo ps3 = ps1 + ps2; nếu ta dùng operator overloaded 5OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com9 10. Toán tử (operator) tt Ta có thể quá tải các toán tử sau: Toán học: + , - , * , / , % Cộng trừ một ngôi: ++ , -- , - Quan hệ so sánh: == , != , > , = , <= Ép kiểu: () Cú pháp khai báo nguyên mẫu của một toán tử T: public static KiểuTrảVề operator T (CácThamSố) { //các câu lệnh trong thân toán tử } OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com10 10. Chú ý quá tải toán tử (operator overloaded) Tham số của toán tử phải là tham trị (không dùng các từ khóa ref, out). Không được quá tải toán tử = (gán), && , || (and, or logic), ?: (điều kiện), checked, unchecked, new, typeof, as, is. [ ] không được xem là một toán tử Khi quá tải các toán tử dạng: +, -, *, / , % thì các toán tử +=, -=, *=, /= , %= được quá tải tự động Khi 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ử == thì quá tải thêm toán tử != … 6OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com11 10. Chú ý quá tải toán tử (operator overloaded) Khi quá tải toán tử ==, != thì nên phát triển thêm các phương thức Equals(), GetHashCode() để đảm bảo luật “hai đối tượng bằng nhau theo toán tử == hoặc phương thức Equals sẽ có cùng mã băm” Khi định nghĩa toán tử ép kiểu ta phải chỉ ra đây là toán tử ép kiểu ngầm định (implicit) hay tường minh (explicit) Cú pháp định nghĩa toán tử ép kiểu: public static [ implicit | explicit ] operator KiểuTrảVềT (Type V) Trong đó Type V là biến cần ép sang kiểu KiểuTrảVềT OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com12 VD 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 31-33 7OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com13 11. Chỉ mục (Index) Việc định nghĩa chỉ mục cho phép tạo các đối tượng của lớp hoạt động giống như một mảng ảo Tức là các đối tượng có thể sử dụng toán tử [ ] để truy cập đến một thành phần dữ liệu nào đó. Việc định nghĩa chỉ mục tương tự như việc định nghĩa một thuộc tính. OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com14 11. Cú pháp tạo Chỉ mục (Index) public KiểuTrảVề this [DanhSáchThamSố] { //Hàm đọc get { // thân hàm đọc } // Hàm ghi set { // thân hàm ghi } } vd trang 34-35 8OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com15 11. Ghi chú về chỉ mục (Index) Một chỉ mục phải có ít nhất một tham số, và tham số có thể có kiểu bất kỳ. Chỉ mục có thể chỉ có phương thức get. Mặc dù chỉ mục là một đặc điểm thú vị của C# nhưng cần phải sử dụng đúng mục đích (sử dụng để đối tượng có thể họat động như mảng, mảng nhiều chiều). Một lớp có thể có nhiều chỉ mục nhưng chúng phải có các dấu hiệu phân biệt với nhau (tương tự như quá tải phương thức). OOP in C# - GV: Phạm Đình Sắc – dinhsac@gmail.com16 Q&A Bài tập: 1. Đọc lại bài giảng 2. Làm các bài VD & bài tập trong GT 3. Đọc bài: Kế thừa 4. Buổi tới thảo luận & kiểm tra bài cũ 16
File đính kèm:
- 02_Class_Object_2.pdf