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

