Chương 5 Thiết lập các phương thức

Sự đóng gói là cơ chế ràng buộc dữ liệu và thao tác trên dữ liệu đểthành một thể thống nhất, tránh được các tác động bất ngờ từ bên ngoài. Thể thống nhất này gọi là đối tượng.

pdf27 trang | Chia sẻ: lylyngoc | Lượt xem: 1586 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chương 5 Thiết lập các phương thức, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Thiết Lập Các Phương Thức Môn Lập Trình Hướng Đối Tượng – Chương 5 Nguyễn Minh Thành [Mail] : Thanhnm@itc.edu.vn 1 Nhắc Lại  Sự đóng gói là cơ chế ràng buộc dữ liệu và thao tác trên dữ liệu để thành một thể thống nhất, tránh được các tác động bất ngờ từ bên ngoài. Thể thống nhất này gọi là đối tượng. 2 Nhắc lại (tt) class { thuộc tính; phương thức(); } • Chỉ có các phương thức nằm trong class mới được quyền truy cập thuộc tính (hay dữ liệu). • Thuộc tính (hay dữ liệu) mà phương thức truy cập sẽ tương ứng với đối tượng được tạo từ class đó. 3 Thiết Kế Các Phương Thức • Có 5 nhóm hành động (phương thức) ▫ Nhóm khởi tạo: Cung cấp giá trị đầu cho đối tượng ▫ Nhóm cập nhật: Thay đổi giá trị thuộc tính của đối tượng ▫ Nhóm kiểm tra ràng buộc: Kiểm tra khởi tạo, cập nhật ▫ Nhóm cung cấp thông tin: Cung cấp thuộc tính nội bộ của đối tượng cho thế giới bên ngoài ▫ Nhóm xử lý tính toán: Xử lý tính toán có tác dụng tương tự thế giới cung cấp thông tin do bên ngoài gởi vào 4 Thiết Kế Các Phương Thức (tt) • Ví dụ 1: Thiết kế các hành động của lớp CDIEM ▫ 1. Nhóm khởi tạo public void Nhap(); public void KhoiTao (int xx, int yy, char cc); public void PhatSinh(); ▫ 2. Nhóm cập nhật //Trực tiếp public void GanX (int xx); public void GanY (int xx); //property set: Tìm hiểu sau 5 Thiết Kế Các Phương Thức (tt) • Ví dụ 1: Thiết kế các hành động của lớp CDIEM ▫ 2. Nhóm cập nhật //Gián tiếp public void DichPhai(uint k); public void DichTrai(uint k); public void DichLen(uint k); public void DichXuong(uint k); public void DichXien1(uint k); public void DichXien2(uint k); ▫ 3. Nhóm kiểm tra ràng buộc public bool KiemTraX(int xx); public bool KiemTraY(int yy); 6 Thiết Kế Các Phương Thức (tt) • Ví dụ 1: Thiết kế các hành động của lớp CDIEM ▫ 4. Nhóm cung cấp thông tin public void Xuat(); public int LayX(); public int LayY(); public char LayKiTu(); //property get: Tìm hiểu sau ▫ 5. Nhóm xử lý tính toán public float KhoangCach(CDIEM M); public int KhoangCachX(CDIEM M); public int KhoangCachY(CDIEM M); 7 Thiết Kế Các Phương Thức (tt) • Ví dụ 2: Thiết kế các hành động của lớp CHCN ▫ 1. Nhóm khởi tạo public void Nhap(); public void KhoiTao (CDIEM M, int mm, int nn); public void KhoiTao(int x, int y, int m, int n); public void KhoiTao(CDIEM X, CDIEM Y); public void PhatSinh(); ▫ 2. Nhóm cập nhật //Trực tiếp //property set: Tìm hiểu sau 8 Thiết Kế Các Phương Thức (tt) • Ví dụ 2: Thiết kế các hành động của lớp CHCN ▫ 2. Nhóm cập nhật //Gián tiếp public void DichPhai(uint k); public void DichTrai(uint k); public void DichLen(uint k); public void DichXuong(uint k); public void TangNgang(uint k); public void GiamNgang(uint k); public void TangDung(uint k); public void GiamDung(uint k); public void Xoaythuan(); public void Xoaynghich(); //Xoay 1 góc 90o với tâm xoay là điểm gốc (Xoay thuận theo chiều kim đồng hồ) 9 Thiết Kế Các Phương Thức (tt) • Ví dụ 2: Thiết kế các hành động của lớp CHCN ▫ 3. Nhóm kiểm tra ràng buộc public bool KiemTraM(int mm); public bool KiemTraN(int nn); ▫ 4. Nhóm cung cấp thông tin public void Xuat(); public void Xoa(); //property get: Tìm hiểu sau public int ChuVi(); public long DienTich(); public double DuongCheo(); 10 Thiết Kế Các Phương Thức (tt) • Ví dụ 2: Thiết kế các hành động của lớp CHCN ▫ 5. Nhóm xử lý tính toán public int XetViTri(CDIEM M); //-1: Bên trong, 0: Trên cạnh, 1: Bên ngoài public int KhoangCachX(CDIEM M); public int KhoangCachY(CDIEM M); 11 Bài tập • Thiết kế các lớp sau: ▫ Lớp phân số (CPHANSO) ▫ Lớp các đoạn thẳng trong mặt phẳng (CDOAN) ▫ Lớp các tam giác (CTAMGIAC) ▫ Lớp các đường tròn (CDTRON) • Cài đặt hoàn chỉnh những lớp trên. • Cài đặt chương trình quản lý học sinh của một lớp học gồm tối đa 50 học sinh • Cài đặt chương trình quản lý học sinh của một trường học gồm tối đa 20 lớp học 12 Hàm Dựng (Contructor) • Là hàm khởi tạo đặc biệt, hàm dựng có một số tính chất sau : ▫ Được gọi đến một cách tự động khi một đối tượng của lớp được tạo ra (new) . Dùng để khởi động các giá trị đầu cho các thành phần dữ liệu của đối tượng thuộc lớp. ▫ Tên phương thức giống với tên lớp và có mức độ truy cập là public. ▫ Không có giá trị trả về. ▫ Trước khi phương thức tạo lập chạy, đối tượng chưa thực sự tồn tại trong bộ nhớ, sau khi tạo lập hoàn thành, bộ nhớ lưu trữ một thể hiện hợp lệ của lớp. ▫ Khi ta không định nghĩa một phương thức tạo lập nào cho lớp, trình biên dịch sẽ tự động tạo một phương thức tạo lập mặc định cho lớp đó và khởi tạo các biến bằng các giá trị mặc định. 13 Hàm Dựng (Contructor) (tt) • Khai báo : Tên hàm dựng chính là tên của lớp public tên_lớp([tham_số_khởi_tạo]) Ví dụ : class SinhVien { string hoten; int namsinh; string gioitinh; public SinhVien(){}; //Khởi tạo rỗng //Khởi tạo có giá trị sẵn public SinhVien(string ht, int ns, string gt) { hoten = ht; namsinh = ns; gioitinh = gt; } ... } 14 Thuộc tính • Để dễ dàng cho việc truy xuất dữ liệu trong lớp, C# đưa ra khái niệm thuộc tính. public tên_thuộc_tính { get { return dữ_liệu ; } set { dữ_liệu = value ; } } Ví dụ : class SinhVien { string hoten; int namsinh; string gioitinh; public string HoTen { get {return hoten;} set {hoten = value;} } } 15 Cài đặt phép toán (operator) • Giả sử khi ta thiết kế lớp phân số (CPHANSO) có phương thức cộng (Cong), trừ (Tru), nhân (Nhan) và chia (Chia) 2 phân số. Khi đó, ta muốn cộng 2 phân số a và b lưu vào phân số tổng c, ta phải viết là: c = a.Cong(b); Tương tự cho trường hợp nhân c = a.Nhan(b); • Cách này hơi gượng ép và không thể hiện hết ý nghĩa. Điều ta muốn viết là: c = a + b; c = a * b; Muốn làm được điều này, C# đã cung cấp cơ chế cài đặt phương thức thông qua các ký hiệu phép toán (operator). 16 Cài đặt phép toán (operator) • Công thức public static TênLớp operator ký hiệu(TênLớp trái, TênLớp phải) • Trong đó : ▫Ký hiệu: Gồm các ký hiệu phép toán số học, logic và so sánh ▫Trái: Tên tham số sẽ nằm bên trái phép toán ▫Phải: Tên tham số sẽ nằm bên phải phép toán • Ví dụ: Giả sử có lớp phân số (CPHANSO) public static CPHANSO operator + (CPHANSO ps1, CPHANSO ps2) { //Cài đặt } Giả sử có 2 phân số a, b và phân số tổng c. Yêu cầu thực hiện như sau: c = a + b; 17 Cài đặt phép toán (operator) Không dùng operator class Program { static void Main(string[] args) { CPHANSO a = new CPHANSO(3, 5); a.Xuat(); CPHANSO b = new CPHANSO(1, 2); b.Xuat(); CPHANSO c; c = a.Cong(b); Console.WriteLine("Ket qua: "); c.Xuat(); } } 18 Cài đặt phép toán (operator) Dùng operator class CPHANSO { private int tuso, mauso; public CPHANSO(int t, int m) { tuso = t; mauso = m; } public static CPHANSO operator +(CPHANSO ps1, CPHANSO ps2) { int tu = ps1.tuso*ps2.mauso + ps2.tuso*ps1.mauso; int mau = ps1.mauso*ps2.mauso; CPHANSO c = new CPHANSO(tu, mau); return c; } public void Xuat() { Console.WriteLine("{0}/{1}", tuso, mauso); } } 19 Sự trùng tên phương thức • Các phương thức có thể có tên trùng nhau ngay cả các phương thức này ở cùng trong 1 lớp nhưng trong số các tham số phải có ít nhất 1 tham số khác (khác về kiểu hoặc khác về số lượng tham số) public void Nhap() { } public void Nhap(int aa) { } public void Nhap(float aa) { } public void Nhap(int aa, float bb) { } 20 Sử dụng từ khoá this • Ví dụ 21 class ViDu { int a, b; public void GanGiaTri(int a, int b) { a = a; b = b; } public void Xuat() { Console.WriteLine("a={0}, b={1}", a, b); } } class Program { static void Main(string[] args) { ViDu vd = new ViDu(); vd.GanGiaTri(21, 9); vd.Xuat(); } } Sử dụng từ khoá (this) • Trường hợp tên tham số trùng với tên thuộc tính của đối tượng ta dùng từ khóa this. Từ khoá this được dùng để tham chiếu đến chính bản thân của đối tượng đó class ViDu { int a, b; public void GanGiaTri(int a, int b) { this.a = a; this.b = b; } public void Xuat() { Console.WriteLine("a={0}, b={1}", a, b); } } 22 Nạp chồng (Overloading) • Một số phương thức đã được định nghĩa mặc định cho các lớp. Tuy nhiên, ta có thể viết lại nó. Điều này được gọi là nạp chồng phương thức. • Thông thường, phương thức toString là phương thức mặc định của các lớp. Thường là trả về tên của lớp. Ta có thể viết lại để xuất ra nội dung của lớp đó. 23 Nạp chồng (Overloading) phương thức xuất toString() 24 class CPHANSO { private int tuso, mauso; public CPHANSO(int t, int m) { tuso = t; mauso = m; } public override string ToString() { string s = tuso.ToString() + "/" + mauso.ToString(); return s; } public void Xuat() { Console.WriteLine("{0}/{1}", tuso, mauso); } } Nạp chồng (Overloading) phương thức xuất toString() 25 static void Main(string[] args) { CPHANSO a = new CPHANSO(3, 5); Console.Write("Xuat bang phuong thuc xuat doi tuong: "); a.Xuat(); Console.WriteLine("Xuat bang phuong thuc WriteLine: " + a.ToString()); } Kết quả: FAQs 26 Hết chương 5 Môn Lập Trình Hướng Đối Tượng 27