Nội dung bài giảng bao gồm: Dẫn nhập; quản lý đời sống đối tượng - Hàm Constructor; quản lý đời sống đối tượng - Hàm Destructor; tương tác giữa các đối tượng trong VC#; liên kết tĩnh trong việc gởi thông điệp; liên kết động để có đa xạ, xử lý sự kiện luôn có tính đa xạ. Mời các bạn cùng tham khảo.
Chương Vòng ₫ời ₫ối tượng tương tác chúng 4.0 Dẫn nhập 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor 4.2 Quản lý ₫ời sống ₫ối tượng - Hàm Destructor 4.3 Tương tác ₫ối tượng VC# 4.4 Liên kết tĩnh việc gởi thơng ₫iệp 4.5 Liên kết ₫ộng ₫ể có ₫a xạ 4.6 Xử lý kiện ln có tính ₫a xạ 4.7 Kết chương Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.0 Dẫn nhập Chương giới thiệu vòng ₫ời ₫ối tượng chương trình, cách thức quản lý ₫ời sống ₫ối tượng, thời ₫iểm quan trọng lúc tạo ₫ối tượng, lúc xóa ₫ối tượng cách miêu tả hoạt ₫ộng xảy thời ₫iểm Chương giới thiệu tương tác ₫ối tượng lúc chúng ₫ang sống ₫ể hồn thành nhiệm vụ chương trình Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor Class mơ hình ₫ối tượng loại mà phần mềm dùng Lúc lập trình, ta ₫ặc tả class, ₫ối tượng chưa có Khi ứng dụng chạy, thời ₫iểm cần thiết, phần mềm phải tạo tường minh ₫ối tượng lệnh new : Rectangle objRec = new Rectangle(); //tạo ₫ối tượng Trạng thái ₫ối tượng tập giá trị cụ thể thuộc tính Ngay sau ₫ối tượng ₫ược tạo ra, cần có trạng thái ban ₫ầu xác lập ₫ó Hàm constructor cho phép người lập trình miêu tả hoạt ₫ộng xác lập trạng thái ban ₫ầu ₫ối tượng Cũng giống nhiều tác vụ khác, hàm contructor có nhiều "overloaded" khác (với số lượng tham số khác hay tính chất tham số ₫ó khác nhau) Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor Mỗi lần ₫ối tượng ₫ược tạo (bởi lệnh new), máy gọi tự ₫ộng contructor class tương ứng Tùy theo tham số lệnh new mà contructor tương thích ₫ược kích hoạt chạy Trong nội class, tác vụ truy xuất thuộc tính thuộc tính thừa kế từ cha có tầm vực protected, public, khơng thể truy xuất trực tiếp thuộc tính thừa kế từ cha có thuộc tính private Do ₫ó chạy constructor class cần tạo ₫ối tượng khơng thể khởi tạo hết thuộc tính ₫ối tượng, cần kích hoạt hết contructor class cha (gián tiếp hay trực tiếp) Mặc ₫ịnh, cần gọi constructor class cha chạy, máy gọi contructor không tham số Nếu người lập trình muốn khác phải khai báo lại tường minh "overloaded" cần chạy thông qua mệnh ₫ề base() lệnh ₫ịnh nghĩa hàm contructor Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor class A { C c = new C(); //A()->B(3.1416)->C() private int i;… A() { this.i = 0; } … A(int i) { this.i = i; } } C = new C(true); //A()->B()->C(true) class B : A { private double d;… B() { this.d = 0; } B(double d) : base () { this.d = d; } } class C : B { private bool b;… C() : base(3.1416) { this.b = false; } C(bool b) { this.b = b; } } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor //C++ for (;;) { obj = new C(); //xu ly obj //xoa delete(obj); } C c = new C(); … C = new C(true); //C# for (;;) { obj = new C(); //xu ly obj } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor int[] vec; vec[0] = 1; //loi vi phan tu vec[0] chua co vec = new int [10]; // tao array gom 10 phan tu, moi phan tu chua so nguyen vec[0] = 1; //OK class A {public int i; …} A[] vec; vec[0].i = 1; //loi vi phan tu A[0] chua co vec = new A [10]; //tao array 10 phan tu, moi phan tu chua tham khao den doi tuong class A nao vec[0].i = 1; //loi vi phan tu A[0] dang chua tham khao null vec[0] = new A(); vec[0].i = 1; //OK Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor //class A có hàm contructor class A { A() { } A(int i) { } }; //class B thừa kế A, có hàm contructor class B : A { B() : base() { } B(int i) : base (i) { } }; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor //class C thừa kế B, có hàm contructor class C : B { C() : base () { } C(int i) : base (i) { } }; C c1 = new C(); //kích hoạt A() B() C() C c2 = new C(5); //kích hoạt A(5) B(5) C(5) Việc xác ₫ịnh contructor ₫ược kích hoạt phải theo chiều từ lên bắt ₫ầu từ class ₫ược new, contructor ₫ược chạy thực theo chiều từ xuống bắt ₫ầu từ class tổ tiên ₫ời ₫ầu Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4.2 Quản lý ₫ời sống ₫ối tượng - Hàm Destructor Đối tượng thực thể, có ₫ời sống bao thực thể khác Như ta ₫ã biết, ta gọi lệnh new, ₫ối tượng thuộc class tương ứng ₫ược tạo (trong không gian hệ thống), trạng thái ban ₫ầu ₫ược xác lập thơng qua việc kích hoạt dây chuyền contructor class thừa kế Chương trình lưu giữ tham khảo ₫ến ₫ối tượng biến tham khảo ₫ể cần, gởi thông ₫iệp nhờ ₫ối tượng thực thi dùm tác vụ ₫ó VC# khơng cung cấp tác vụ delete ₫ể xóa ₫ối tượng khơng cần dùng Thật vậy, ₫ánh giá ₫ối tượng ₫ó có cần dùng hay không việc không dễ dàng, dễ nhằm lẫn ₫ể chương trình tự làm Tóm lại, VC#, chương trình tạo tường minh ₫ối tượng cần dùng nó, chương trình khơng quan tâm việc xóa ₫ối tượng khơng có khả xóa ₫ối tượng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 10 4.2 Quản lý ₫ời sống ₫ối tượng - Hàm Destructor Như vậy, ₫ối tượng bị xóa lúc nào, ? Hệ thống có module ₫ặc biệt tên "Garbage collection" (trình dọn rác), module theo dõi việc dùng ₫ối tượng, thấy ₫ối tượng mà khơng cịn dùng xóa dùm tự ₫ộng Trình dọn rác trạng thái ₫ối tượng thời ₫iểm bị xóa nên khơng làm ngồi việc thu hồi vùng nhớ mà ₫ối tượng chiếm Như nguy hiểm, thí dụ ₫ối tượng bị xóa ₫ã mở, khóa file ₫ang truy xuất file dỡ dang Để giải vấn ₫ề xóa ₫ối tượng ₫ược triệt ₫ể, trình dọn rác gọi tác vụ destructor ₫ối tượng bị xóa, nhiệm vụ người ₫ặc tả class thực tác vụ Tác vụ destructor khơng có kiểu trả về, khơng có tham số hình thức khơng có overloaded, có destructor/class mà Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 11 4.2 Quản lý ₫ời sống ₫ối tượng - Hàm Destructor Mặc dù người ₫ặc tả class thực tác vụ destructor thấy cần thiết, code chương trình khơng ₫ược gọi trực tiếp destructor ₫ối tượng Chỉ có trình dọn rác hệ thống gọi destructor ₫ối tượng trước xóa ₫ối tượng ₫ó Destructor class xử lý trạng thái ₫ối tượng thuộc tính class ₫ó qui ₫ịnh, cần gọi destructor class cha ₫ể xử lý tiếp trạng thái ₫ối tượng thuộc tính private class cha qui ₫ịnh, tiếp tục Tóm lại trước xóa ₫ối tượng, trình dọn rác gọi destructor theo chiều từ lên, bắt ₫ầu từ class hành ₫ối tượng, sau ₫ó tới class cha, cuối class tổ tiên ₫ời ₫ầu (root) Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 12 4.3 Tương tác ₫ối tượng VC# Muốn tương tác với ₫ối tượng ₫ó, ta phải có tham khảo ₫ến ₫ối tượng ₫ó Thường ta lưu giữ tham khảo ₫ối tượng cần truy xuất biến ₫ối tượng (biến tham khảo) Thơng qua tham khảo ₫ến ₫ối tượng, ta thực hành ₫ộng tương tác sau ₫ây : truy xuất thuộc tính vật lý ₫ối tượng có tầm vực cho phép (public hay internal hay protected) truy xuất thuộc tính luận lý ₫ối tượng gọi tác vụ hay tốn tử có tầm vực cho phép truy xuất event ₫ối tượng truy xuất phần tử danh sách indexer ₫ối tượng Gọi tác vụ hay toán tử giống cần làm rõ chi tiết slide sau Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 13 4.4 Liên kết tĩnh việc gởi thông ₫iệp Xét ₫oạn lệnh sau : class C1 { public void func1() {} //dịch hàm mã máy có tên C1_func1 public virtual func2() {} //dịch hàm mã máy có tên C1_func2 } class C2 : C1 { public override void func1() {} //dịch hàm mã máy có tên C2_func1 public override func2() {} //dịch hàm mã máy có tên C2_func2 } C1 obj = new C1(); obj.func1(); //lần gọi hàm mã máy ? //₫oạn code làm obj ₫ối tượng class C2, C3, obj.func1(); //lần gọi hàm mã máy ? Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 14 4.4 Liên kết tĩnh việc gởi thông ₫iệp class C1 { public void func1() {} //dịch hàm mã máy có tên C1_func1 public virtual func2() {} //dịch hàm mã máy có tên C1_func2 } class C2 : C1 { public override void func1() {} //dịch hàm mã máy có tên C2_func1 public override sealed func2() {} //dịch hàm mã máy có tên C2_func2 } class C3 : C2 { public override void func1() {} //dịch hàm mã máy có tên C2_func1 public override func2() {} //dịch hàm mã máy có tên C2_func2 } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 15 4.4 Liên kết tĩnh việc gởi thông ₫iệp Hai lệnh gởi thông ₫iệp obj.func1() slide trước kích hoạt tác vụ func1() class C1 hay tác vụ func1() class C2 ? Dùng kỹ thuật xác ₫ịnh hàm liên kết tĩnh : Tại thời ₫iểm dịch, chương trình dịch biết biến obj thuộc kiểu C1 dịch lời gởi thông ₫iệp obj.func1() thành lời gọi hàm C1_func1() Như máy chạy lệnh obj.func1() lần 1, hàm C1_func1() ₫ược gọi, ₫iều ₫úng theo yêu cầu phần mềm Nhưng máy chạy lệnh obj.func1() lần 2, hàm C1_func1() ₫ược gọi, ₫iều khơng ₫úng theo u cầu phần mềm lúc obj ₫ang tham khảo ₫ối tượng class C2 Mặc ₫ịnh, VC# dùng kỹ thuật xác ₫ịnh hàm liên kết tĩnh dịch lời gởi thông ₫iệp, ₫ó tạo ₫ộ rủi ro cao, chương trình ứng dụng thường chạy không ₫úng theo yêu cầu mong muốn!!! Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 16 4.5 Liên kết ₫ộng ₫ể ₫ảm bảo tính ₫a xạ Bây ta hiệu chỉnh lệnh gởi thơng ₫iệp obj.func1() slide trước thành obj.func2() máy kích hoạt tác vụ func2() class C1 hay tác vụ func2() class C2 ? Dùng kỹ thuật xác ₫ịnh hàm liên kết ₫ộng : Lệnh gởi thông ₫iệp obj.func2() ₫ược dịch thành ₫oạn lệnh máy với chức sau : xác ₫ịnh biến obj ₫ang tham khảo ₫ến ₫ối tượng nào, thuộc class nào, gọi hàm func2() class ₫ó chạy Như vậy, lần gởi thông ₫iệp 1, biến obj ₫ang tham khảo ₫ối tượng thuộc class C1 nên máy gọi hàm C1_func2(), ₫iều ₫úng theo yêu cầu phần mềm Khi máy chạy lệnh obj.func2() lần 2, ₫oạn code xác ₫ịnh hàm liên kết ₫ộng gọi ₫ược hàm C2_func2(), ₫iều ₫úng theo yêu cầu phần mềm Ta nói lời gởi thơng ₫iệp obj.func2() có tính ₫a xạ Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 17 4.5 Liên kết ₫ộng ₫ể ₫ảm bảo tính ₫a xạ Trong VC#, dùng từ khóa virtual lệnh ₫ịnh nghĩa tác vụ tác vụ ₫ược xử lý theo chế liên kết ₫ộng ₫ảm bảo ₫ược tính ₫a xạ, tức ₫ảm bảo tính ₫úng ₫ắn lời gởi thơng ₫iệp Biết ₫ược ₫iều này, từ ₫ây sau, lần ₫ịnh nghĩa tác vụ hay toán tử, ta ln dùng từ khóa virtual kết hợp với Lưu ý tác vụ constructor destructor ₫ối tượng tác vụ ₫ặc biệt, chúng quản lý ₫ời sống ₫ối tượng ₫ược gọi hệ thống Ta khơng ₫ược phép dùng từ khóa virtual ₫ịnh nghĩa chúng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 18 4.6 Xử lý kiện ln có tính ₫a xạ Chúng ta viết chương trình nhỏ gồm form giao diện, form ta tạo Button có thuộc tính Text="Làm ₫ây?", thuộc tính (Name) = btnStart, ₫ịnh nghĩa hàm xử lý kiện Click cho viết code sau : //hàm xử lý Click chuột button máy tạo private void btnStart_Click(object sender, EventArgs e) { //xuất thông báo ₫ể kiểm tra MessageBox.Show("Hàm btnStart_Click xứ lý ₫ây"); //thay ₫ổi hàm xử lý Click cho Button this.btnStart.Click -= new EventHandler(btnStart_Click); this.btnStart.Click += new EventHandler(btnStart_Click1); } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 19 4.6 Xử lý kiện ln có tính ₫a xạ Hãy viết thêm hàm btnStart_Click1() sau : //hàm xử lý Click chuột button tự viết thêm private void btnStart_Click1(object sender, EventArgs e) { //xuất thông báo ₫ể kiểm tra MessageBox.Show("Hàm btnStart_Click1 xứ lý ₫ây"); //thay ₫ổi hàm xử lý Click cho Button this.btnStart.Click -= new EventHandler(btnStart_Click1); this.btnStart.Click += new EventHandler(btnStart_Click); } Bây chạy chương trình, lần ₫ầu click chuột ta thấy hàm btnStart_Click() chạy, click chuột tiếp hàm btnStart_Click1() chạy, thay phiên chạy (theo ý muốn người lập trình) Ta nói xử lý kiện người dùng ln có tính ₫a xạ Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 20 4.7 Kết chương Chương ₫ã giới thiệu vòng ₫ời ₫ối tượng chương trình, cách thức quản lý ₫ời sống ₫ối tượng, thời ₫iểm quan trọng lúc tạo ₫ối tượng, lúc xóa ₫ối tượng cách miêu tả hoạt ₫ộng xảy thời ₫iểm Chương ₫ã giới thiệu tương tác ₫ối tượng lúc chúng ₫ang sống ₫ể hoàn thành nhiệm vụ chương trình Gởi thơng ₫iệp tương tác yếu ₫ối tượng, cần phải có tính ₫a xạ Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 21 ... Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 20 4. 7 Kết chương Chương ₫ã giới thiệu vòng ₫ời ₫ối tượng chương trình, cách thức quản... 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 4. 1 Quản lý ₫ời sống ₫ối tượng - Hàm Constructor class A { C c = new C(); //A( )-> B(3. 141 6 )-> C() private... Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Các mẫu thiết kế hướng ₫ối tượng Chương : Vòng ₫ời ₫ối tượng tương tác chúng C# Slide 14 4 .4 Liên kết tĩnh việc gởi thông ₫iệp class C1 { public