Tài liệu Tài liệu Lập trình hướng đối tượng: MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Đối tượng : sv đại học chính quy ngành CNTT
Tài liệu tham khảo :
■ Tập slide bài giảng & thực hành của môn học này.
■ The C++ Programming Language (special 3rd edition), 
Bjarne Stroustrup, 2000.
■ 3 CD MSDN trong Microsoft Visual Studio.
■ Online-Help của môi trường JBuilder
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Slide 1
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Nội dung chính gồm 10 chương :
1. Ôn lại các tính chất của lập trình cấu trúc.
2. Các khái niệm chính của lập trình OOP.
3. Cơ chế dịch mã OOP sang mã máy.
4. Tổng quát về mức độ hỗ trợ OOP của VC++ & Java.
5. Đặc tả class & các tính chất cơ bản của đối tượng trong VC++.
6. Đặc tả class & các tính chất cơ bản của đối tượng trong Java.
7. Chi tiết về gọi hàm, gởi thông điệp & đa xạ của VC++.
8. Chi tiết về gọi hàm, gởi thông điệp & đa xạ của Java.
9. Chi tiết về thường trú, serialization, COM, Generalization & Template 
của VC+...
                
              
                                            
                                
            
 
            
                 107 trang
107 trang | 
Chia sẻ: Khủng Long | Lượt xem: 1522 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Tài liệu Lập trình hướng đối tượng, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Đối tượng : sv đại học chính quy ngành CNTT
Tài liệu tham khảo :
■ Tập slide bài giảng & thực hành của môn học này.
■ The C++ Programming Language (special 3rd edition), 
Bjarne Stroustrup, 2000.
■ 3 CD MSDN trong Microsoft Visual Studio.
■ Online-Help của môi trường JBuilder
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Slide 1
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Nội dung chính gồm 10 chương :
1. Ôn lại các tính chất của lập trình cấu trúc.
2. Các khái niệm chính của lập trình OOP.
3. Cơ chế dịch mã OOP sang mã máy.
4. Tổng quát về mức độ hỗ trợ OOP của VC++ & Java.
5. Đặc tả class & các tính chất cơ bản của đối tượng trong VC++.
6. Đặc tả class & các tính chất cơ bản của đối tượng trong Java.
7. Chi tiết về gọi hàm, gởi thông điệp & đa xạ của VC++.
8. Chi tiết về gọi hàm, gởi thông điệp & đa xạ của Java.
9. Chi tiết về thường trú, serialization, COM, Generalization & Template 
của VC++.
10. Chi tiết về thường trú, serialization, Generalization của Java.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Slide 2
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Chưong 1
ỒN LẠI CÁC TÍNH CHẤT 
CỦA LÂP TRÌNH CẤU TRÚC
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 3
Phương pháp phân tích từ-trên-xuống
Mỗi sự vật trong môi trường xung quanh ta đều được cấu thảnh từ nhiều phần tử 
nhỏ hơn, mỗi phần tử nhỏ lại được cấu thành từ nhiều phần tử nhỏ hơn nữa. Thí 
dụ, con người gồm đầu, mình, tứ chi. Tứ chi gồm 2 tay và 2 chân...
Mỗi công việc cần giải quyết bằng máy tính cũng được cấu thành từ nhiều cống 
việc nhỏ hơn, mỗi công việc nhỏ hơn lại được cấu thành từ nhiều công việc nhỏ 
hơn nữa...
Phương pháp phân tích từ-trên-xuống (top-down analysis) là phương pháp thường 
sử dụng để phân tích cống việc, nội dung của phương pháp này là cố gắng xác 
định xem công việc cần giải quyết được cấu thành từ những công việc nhỏ nào, 
mỗi công việc nhỏ được cấu thành từ các cống việc nhỏ hơn nào, cứ như vậy cho 
đến khi những công việc xác định được là những công việc thật đơn giản, có thể 
thực hiện dễ dàng.
Thí dụ việc học lấy bằng kỹ sư CNTT khoa CNTT ĐHBK TP.HCM có thể bao gồm 
9 công việc nhỏ hơn là học từng học kỳ từ 1 tới 9, học học kỳ i là học n môn học 
của học kỳ đó, học 1 môn học lả học m chương của môn đó,...
Hình vẽ của slide kế cho thấy trực quan của phương pháp phân tích top-down.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 4
Phương pháp phân tích từ-trên-xuống (tt)
chia thành nhiều công 
việc nhỏ hơn, đơn giản để 
giải quyết hơn.
Công việc cần 
giải quyết (A)
I
I Công viêc Công việc Công viêc
I A, A2 ■ ■ ■ A„
Công việc 
Ẩ.‘11
Công việc 
A.12
Công việc 
A,
Các công việc đủ nhỏ 
để được miêu tả bằng 
1 lệnh hay 1 lời gọi 
hàm/thủ tục đã có.
I
Công việc 
A,n1
Công việc 
A.
i
Công việc 
A.nn
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 5
Tầm vực truy xuất biến
- Tầm vực của một biến là tập các lệnh được phép truy xuất biến đó.
- c và C++ cho phép 3 cấp độ tầm vực sau :
o cục bộ trong function : bất kỳ lệnh nào trong function đều có thể truy xuất 
được biến cục bộ trong function đó. 
void Command1_Click() { 
char strGreeting[256]; // Khai báo cục bộ
}
o cục bộ trong module : bất kỳ lệnh nào trong module đều có thể truy xuất 
được biến cục bộ trong module đó. 
static char strAddr[256]; // biến cục bộ trong module
char strName[256]; // biến toàn cục
o toàn cục : bất kỳ lệnh nào trong chương trình cũng có thể truy xuất được 
biến toàn cục.
- Trong một ngữ cảnh (cùng 1 function, cùng 1 module, hay cấp toàn cục), không 
thể dùng hai biến cùng tên (C phân biệt chữ HOA và chữ thường).
Khoa Công nghệ Thông tin 
Trưởng ĐH Bách Khoa Tp.HCM
Môn : Lập trinh hướng đối tưọng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 6
Cấu trúc 1 chương trình huứng cấu trúc
Chương trình = cấu trúc dữ liệu + giải thuật
local data 
of function
module
(package)
entry 'start'
local data 
module
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 7
Cẩu trúc 1 chương trình huứng cấu trúc
□ Thành phần “giải thuật” bao gồm code được viết trong các module. Trong từng 
module, code được gom nhóm thành những hàm chức năng, mỗi hàm được 
nhận dạng và truy xuất thông qua tên hàm.
□ Thành phần “dữ liệu” bao gồm các biến dữ liệu được định nghĩa trong các 
module. Trong từng module, về mặt tầm vực truy xuất, các biến có thể được 
định nghĩa 1 trong 2 cấp tầm vực :
■ Public : bất kỳ lệnh nào của chương trình đều có thể truy xuất được.
■ Private : chỉ có các lệnh trong module hiện hành mới có thể truy xuất.
- Ngoài ra trong từng hàm chức năng, người ta có thể định nghĩa các biến cục 
bộ, các biến này chỉ được truy xuất cục bộ bởi các lệnh trong hàm tương 
ứng. Ngoại lệ, trong 1 số ngôn ngữ như c, người ta cho phép định nghĩa biến 
trong lệnh thực thi (block - compose), biến này chỉ được truy xuất cục bộ bởi 
các lệnh trong thân của lệnh block tương ứng.
■=> điểm yếu nhất trong ngốn ngữ hướng cấu trúc là cho phép định nghĩa biến toàn 
cục, nếu biến này bị lỗi, ta rất khó xác định nguyên nhân gây lỗi. Việc mang 1 
hàm hay 1 module của ứng dụng này sang ứng dụng khác cũng sẽ khó khăn vì 
__ thưởng gây ra hiệu ứng “dây chuyền”.__________________
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 8
Cẩu trúc 1 chương trình huứng cấu trúc
□ Xét Turbo Pascal, 1 ứng dụng gồm 1 module chương trình và 
nhiều module dịch vụ được gọi là Unit. Để sử dụng các thành phần 
trong 1 module nào đó, ta phải dùng lệnh Use.
□ Xét c, 1 ứng dụng gồm nhiều module ngang hàng, mỗi module là 
1 file gồm nhiều hàm chức năng. Điểm nhập ứng dụng là hàm 
main(). Module c cũng có thể là file thư viện liên kết tĩnh (Mib) hay 
động (*.dll). Để sử dụng các thành phần trong 1 module nào đó, ta 
phải dùng lệnh #include.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 9
Mối quan hệ clienưserver giũa các module
//đặc tả interface của module A : Client
#include B.h
extern int A_intA;
typedef struct {...} A_Type1;
¿define A_PI 3.14159 
int A_func1 (int a, double b);
#include A.h
//hiện thục của module A 
int AJntA; 
static int AJntB; 
int A_func1 (int a, double b) { 
B_Type1 var;
BJntA = B_MAXLEN; 
A_func2(a);
B_func1(a,b);
}
static void A_func2(int a) {
}
//đặc tả interface của module B : server
extern int BJntA;
typedef struct {...} B_Type1 ;
#define B_MAXLEN 1024 
int B_func1 (char c, char* d);
#include B.h
//hiện thực của module B 
int BJntA; 
static int BJntB; 
int B_func1(int a, double b) {
B_func2(a);
}
static void B_func2(int a) {
}
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 10
Hai module sử dụng tài nguyên của nhau
//đặc tả interface của module A
#define _AH
#ifndef _BH
#include B.h
#endif
extern int A_intA; 
typedef struct {...} A_Type1; 
¿define A_PI 3.14159 
int A_func1 (int a, double b);
#include A.h
//hiện thục của module A 
int A_intA; 
static int AJntB; 
int A_func1 (int a, double b) {
A_func2(a);
}
static void A_func2(int a) {
}
//đặc tả interface của module B
#define _BH
#ịfndef _AH
#include A.h
#endif
extern int B_intA; 
typedef struct {...} B_Type1 ; 
#define B_PI 3.14159 
int B_func1 (char c, char* d);
#include B.h
//hiện thực của module B 
int BJntA; 
static int AJntB; 
int B_func1(int a, double b) {
B_func2(a);
}
static void B_func2(int a) {
}
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chuông 1: ôn lại các tính chất của lập trinh cấu trúc
Slide 11
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Chương 2
CÁC KHÁI NIỆM CHÍNH 
CỦA LÂP TRÌNH HƯỚNG ĐỐI TƯƠNG
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 12
Nội dung
2.1 Cấu trúc của 1 ứng dụng hướng đôi tưọng
2.2 Đối tượng, thuộc tính, tác vụ.
2.3 Abstract type và class.
2.4 Tính bao đóng.
2.5 Tính thùa kê & cơ chê 'override'.
2.6 Tính bao gộp.
2.7 Thông điệp, tính đa xạ và kiểm tra kiểu.
2.8 Tính tổng quát hóa.
2.9 Tính thường trú.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 13
Cấu trúc chuong trình OOP
ocal data 
of operation
Đối 
(object)
Chương = tập các đối tượng tương tác nhau
local data 
of object
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 14
Cấu trúc chuong trình OOP
□ Cấu trúc chương trình hướng đối tượng rất thuần nhất, chỉ chứa
1 loại thành phần : đối tượng.
□ Các đối tượng có tính độc lập rất cao => quản lý, kiểm soát 
chương trình rất dễ (cho dù chương trình có thể rất lớn) => dễ 
nâng cấp, bảo trì.
□ Không thể tạo ra dữ liệu toàn cục của chương trình => điểm yếu 
nhất của chương trình cấu trúc không tồn tại nữa.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 15
Đối tượng (Object)
□ Đối tượng là nguyên tử cấu thành ứng dụng.
□ Đối tượng bao gồm 2 loại thành phần :
■ thuộc tính (dữ liệu): mỗi thuộc tính mang 1 giá trị nhất định tại 
từng thời điểm.
■ tác vụ (operation): thực hiện 1 công việc nào đó.
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? Thõng tin Chương 2 : Các khái niêm chính của lâp trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a siide 16
Kiểu trừu tượng (Abstract type)
■ Abstract type (type) định nghĩa interface sử dụng đối tượng. Ta 
dùng tên nhận dạng để đặt tên cho kiểu và để nhận dạng nó.
■ Interface là tập hợp các 'entry' mà bên ngoài có thể giao tiếp với 
đối tượng.
■ Ta dùng signature để định nghĩa mỗi 'entry1. Signature gồm :
■ tên tác vụ (opération, function)
■ danh sách tham số hình thức, mỗi tham số được đặc tả bởi 3 
thuộc tính : tên, type và chiều di chuyển (IN, OUT, INOUT).
■ đặc tả chức năng của tác vụ (thường ở dạng chú thích).
■ Ta dùng tên của abstract type (chứ không phải class) để đặc tả 
kiểu cho biến, thuộc tính, tham số hình thức.
■ User không cần quan tâm đến class (hiện thực cụ thể) của đối
 tượng.____________________________________________________________
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<l n? ^ 9hệ Thông tin Chương 2 : Các khái niêm chính của lâp trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a Slide 17
Kiểu trừu tượng trong Java
Java hỗ trợ kiểu trừu tượng thống qua lệnh interface, lệnh này định nghĩa 
abstract type của nhiều đối tượng của ứng dụng (có thể thuộc nhiều class khác 
nhau.
public interface Sleeper { 
public void wakellpO;
public long ONE_SECOND = 1000; // in milliseconds
public long ONE_MINUTE = 60000; // in milliseconds
}
public class DigitalClock extends Applet implements Sleeper {...} 
public class AnalogClock extends Applet implements Sleeper {...}
Sleeper object;
Object = new DigitalClockO; //biến object giữtham khảo đến 1 đối tượng 
DigitalClock
Object = new AnalogClockO; //biến object giữ tham khảo đến 1 đối tượng 
AnalogClock
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 18
Class (Implementation)
© Ta dùng tên nhận dạng để đặt tên cho class và để nhận dạng nó.
Class định nghĩa chi tiết hiện thực đối tượng :
■ định nghĩa các thuộc tính dữ liệu, mỗi thuộc tính được đặc tả bởi 
các thông tin về nó như tên nhận dạng, kiểu dữ liệu, tầm vực truy 
xuất,... Kiểu của thuộc tính có thể là type cổ điển (số nguyên, thực, 
ký tự, chuỗi ký tự,...) hay 'abstract type1, trong trường hợp sau thuộc 
tính sẽ là tham khảo đến đối tượng khác. Trạng thái của đối tượng 
là tập giá trị tại thời điểm tương ứng của tất cả thuộc tính của đối 
tượng. Trong thời gian tồn tại và hoạt động, trạng tái của đối tượng 
sẽ thay đổi.
■ 'coding' các tác vụ (miêu tả giải thuật chi tiết về hoạt động của tác 
vụ) và các 'internal function1.
© Định nghĩa các tác vụ tạo (create) và xóa (delete) đối tượng.
© Định nghĩa các tác vụ 'constructor' và 'destructor'.
© User không cần quan tâm đến class của đổi tượng.________________
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? Thõng tin Chương 2 : Các khái niêm chính của lap trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a K a Slide 19
Ví dụ về định nghĩa class trongVC++
class CMiniChatClientDlg : public CDialog { 
public:
CMiniChatClientDlg(CWnd* pParent = NULL); // Standard constructor 
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 
support
virtual LRESULT WindowProc(UINT message, WPARAM wParam, 
LPARAM IParam);
virtual BOOL OnlnitDialogO; 
afx_msg void OnPaint(); 
afx_msg void OnConnect();
HICON m_hlcon; 
private :
SOCKET sock;
u_short portno; // Which tcp port are we going to use?
- k - ----------------------------------------------------------------------- — ------------------------------------------- 7 —^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? " 9hệ Thõng tin Chương 2 : Các khái niêm chính của lap trinh hưóng đối tưong
BK ^ Trường ĐH Bách Khoa Tp.HCM a K a Slide 20
Tính bao dóng (encapsulation)
□ Bao đóng : che dấu mọi chi tiết hiện thực của đối tượng, không 
cho bên ngoài thấy và truy xuất => tạo độ độc lập cao giữa các 
đối tượng (hay tính kết dính - cohesion giữa các đối tượng rất 
thấp).
■ che dấu các thuộc tính dữ liệu : nếu cần cho phép bên ngoài 
truy xuất 1 thuộc tính, ta tạo 2 tác vụ get/set tương ứng để 
giám sát và kiểm soát việc truy xuất (thuộc tính này vẫn được 
che giấu).
■ che dấu chi tiết hiện thực các tác vụ.
■ che dấu các internal function và sự hiện thực của chúng.
□ Java, VC++ cung cấp các từ khóa private, protected, public để 
xác định tầm vực truy xuất từng thành phần của class.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 21
Tính thừa kê (inheritance)
□ Tính thừa kế cho phép giảm nhẹ công sức định nghĩa type/class : ta 
có thể định nghĩa các type/class không phải từ đầu mà bằng cách kế 
thừa type/class có sẵn, ta chỉ định nghĩa thêm các chi tiết mới mà thôi 
(thường khá ít).
■ Đa thừa kế hay đơn thừa kế.
■ Thừa kế tạo ra mối quan hệ supertype/subtype và 
superclass/subclass.
■ Có thể override các method của class cha, kết quả override chỉ tác 
dụng trên đối tượng của class con.
■ Đối tượng của class con có thể đóng vai trò của đối tượng class 
cha nhưng ngược lại thưòng không được.
□ VC++ cho phép hạn chế tầm vực truy xuất các thành phần của class 
cha:
class c : protected A, private B {...}
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? Thõng tin Chương 2 : Các khái niêm chính của lap trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a K a Slide 22
Ví dụ vé thừa kê và override - VC++ 
■
class Geometry { //abstract base class
public:
Geometry();
virtual void Draw( Window *pWnd ) = 0; //abstract operation 
protected:
int xPos, yPos;
COLORREF color;
};
class Group : public Geometry { 
public:
Group();
~Group();
virtual void Draw( Window *pWnd ); //override 
private:
Geometry **ppGeo; //pointer container 
int geoCount;
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? " 9hệ Thõng tin Chương 2 : Các khái niêm chính của lâp trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a siide 23
Tính bao gộp (aggregation)
■ 1 đối tượng có thể chứa nhiều đối tượng khác =^> tạo nên mối 
quan hệ bao gộp 1 cách đệ quy giữa các đối tượng.
■ Có 2 góc nhìn về tính báo gộp : ngữ nghĩa & hiện thực.
Góc nhìn ngữ nghĩa Góc nhìn hiện thực
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 24
Ví dụ vé bao gộp - VC++
class Geometry { //abstract base class
public:
Geometry();
~Geometry();
virtual void Draw( Window *pWnd ) = 0; //abstract operation 
protected:
int xPos, yPos;
double xScale, yScale;
COLORREF color;
class Group : public Geometry { 
public:
Group();
~Group();
virtual void Draw( Window *pWnd ); //override 
private:
Geometry **ppGeo; //=G eometry* ppGeo[n];
int geoCount;
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng 
Chương 2 : Các khái niệm chính của lập trinh hưóng đối tưọng
Slide 25
Thông điệp (Message)
□ Thông điệp là 1 phép gọi tác vụ đến 1 đối tượng từ 1 tham 
khảo.
□ Thông điệp bao gồm 3 phần :
■ tham khảo đến đối tượng đích.
■ Tên tác vụ muốn gọi.
■ danh sách tham số thực cần truyền theo (hay nhận về từ) 
tác vụ.
■ ví dụ : aCircle.SetRadius (3); aCircle.Dravv (pWnd);
□ Thông điệp là phương tiện giao tiếp (hay tương tác) duy nhất 
giữa các đối tượng.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 26
Tính đa xạ (Polymorphism)
□ Cùng 1 lệnh gởi thông điệp đến đối tượng thông qua cùng 1 tham 
khảo nhưng ở vị trí/thời điểm khác nhau có thể kích hoạt việc thực 
thi tác vụ khác nhau của các đối tượng khác nhau.
T1 p1; // C1 và C2 là 2 class Java hiện thực T 1
p1 = New C1; // tạo đối tượng C1, gán tham khảo vào biến p1 
p1 .methl (...); // gởi thông điệp nhờ tác vụ methl thực thi
p1 = New C2; // tạo đối tượng C2, gán tham khảo vào biến p1 
p1 .methl (...); // gởi thông điệp nhờ tác vụ methl thực thi
Lệnh gởi thông điệp p1 .methl (...); ở 2 vị trí khác nhau kích hoạt
2 tác vụ khác nhau của 2 class khác nhau.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 27
Kiểm tra kiểu (type check)
□ Chặt và dùng mối quan hệ 'conformity' (tương thích tổng quát). 
Type A tương thích với type B A chứa mọi tác vụ của B và ứng 
với từng tác vụ của type B :
■ Tồn tại 1 tác vụ cùng tên trong A.
■ danh sách tham số của 2 tác vụ tương ứng phải bằng nhau 
về số lượng tham số.
■ kiểu đối số OUT hay giá trị return của tác vụ trong A phải 
tương thích với kiểu của đối số tương ứng trong B.
■ kiểu đối số IN của tác vụ trong B phải tương thích với kiểu 
của đối số tương ứng trong A.
■ kiểu đối số INOUT phải trùng với kiểu của đối số tương ứng 
trong B.
 quan hệ so trùng hay quan hệ con/cha (sub/super) lả trường hợp 
đặc biệt của quan hệ tương thích tổng quát.
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? Thõng tin Chương 2 : Các khái niêm chính của lap trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a K a Slide 28
Tính tổng quát hóa (Generalization)
□ Có 2 ngữ nghĩa khác nhau của tính tổng quát hóa :
■ class tổng quát hóa cho phép sản sinh tự động các class bình 
thường, các class bình thường tự nó chỉ có thể tạo ra đối 
tượng. Thường dùng ngữ nghĩa này trong giai đoạn lập trình.
■ ngược với tính thừa kế : supertype/superclass là type/class 
tổng quát hóa của các con của nó. Thường dùng ngữ nghĩa 
này trong giai đoạn phân tích/thiết kế phần mềm.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slide 29
Tính thuửng trú (persistence)
□ Thời gian sống của 1 đối tượng độc lập với thời gian sống của 
phần tử (ứng dụng, đối tượng khác) tạo ra nó.
■ Đối tượng phải tồn tại khi còn ít nhất 1 tham khảo đến nó 
trong hệ thống.
■ Đối tượng phải bị xóa khi không còn tham khảo nào đến nó, vì 
tại thời điểm này đối tượng là rác. Việc xác định chính xác 1 
đối tượng có phải là rác hay không là 1 việc phức tạp, code 
ứng dụng không được phép thực hiện, đây là công việc của hệ 
thống thông qua module 'garbage collection'.
■ thường trú không phải là vĩnh hằng. Mức độ có thể là 1 
session của máy ảo (JVM) hay lâu dài (thông qua đĩa cứng, 
CDROM).
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 2 : Các khái niệm chính của lập trình hưóng đối tưọng
Slĩde 30
Tổng kết
□ Mô hình hướng đối tượng quan niệm thế giới (hay chương trình) bao 
gồm các đối tượng độc lập sống chung và tương tác lẫn nhau.
□ Các đặc điểm chính của mô hình hướng đối tượng :
■ Bao đóng : mỗi đối tượng bao gồm 1 số dữ liệu và tác vụ. Các tác 
vụ thiết lập nên hành vi của đối tượng. Các đối tượng cùng loại 
được đặc tả bằng 1 class.
■ Các đối tượng độc lập và tương tác lẫn nhau bằng cách gởi thông 
điệp.
■ Giữa các class/đối tượng có thể tồn tại quan hệ bao gộp, thừa kế, 
tổng quát hóa.
■ Tính đa xạ : kết quả của sự kiểm tra kiểu chặt dựa vào mối quan 
hệ 'conformity1.
■ Tính thường trú : mỗi đối tượng tồn tại khi còn ít nhất 1 tham khảo 
đến nó.
^ Môn : Lập trinh hướng đối tuợng
o LT L ^ h0aC<ĩn? Thõng tin Chương 2 : Các khái niêm chính của lap trinh hưóng đối tưong
B K ^ Trường ĐH Bách Khoa Tp.HCM a K a Slide 31
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Chưong 3
cơ CHẾ DỊCH MÃ HƯỚNG ĐỐI TƯỢNG 
SANG MÃ MÁY
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 3: Cơ chế dịch mã OOP sang mã mấy
Slide 32
Tổng quát vé vấn đé dịch OOP
□ Chương trình là tập các đối tượng sống độc lập và tương tác lẫn 
nhau khi cần thiết.
□ Các đối tượng thuộc 1 số loại nhất định (n)
□ Mỗi loại đối tượng được miêu tả bởi 1 type & 1 class
□ Mã nguồn chương trình là tập n định nghĩa type & class
□ Dịch chương trình OOP là qui trình lặp dịch n type & n class.
□ Ta sê miêu tả qui trình dịch 1 type và 1 class trong chương này.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 33
Dịch 1 abstract type
□ Abstract type chỉ chứa thông tin trừu tượng (interface), không 
miêu tả sự hiện thực -> Kết quả việc dịch 1 type chỉ dừng lại ở 
việc xây dựng cây ngữ nghĩa của type tương ứng để phục vụ việc 
kiểm tra kiểu của chương trình dịch, chứ không tạo code mã máy.
□ Chỉ cần 3 bước : duyệt từ vựng, phân tích cú pháp và phân tích 
ngữ nghĩa.
□ Nên dùng công cụ hỗ trợ như LEX, YACC cho 2 bước duyệt từ 
vựng & phân tích cú pháp.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 34
Dịch 1 class
■
□ Dịch class là công việc chính của chương trình dịch hướng đối 
tượng.
□ Gồm 2 công việc chính : dịch thuộc tính dữ liệu và dịch các 
method (hay các internal function).
□ Cần đầy đủ các bước : duyệt từ vựng, phân tích cú pháp, phân 
tích ngữ nghĩa và tạo mã.
□ Nên dùng công cụ hỗ trợ như LEX, YACC cho 2 bước duyệt từ 
vựng & phân tích cú pháp.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 35
Dịch thuộc tính dữ liệu■ ■ ■
□ class -> cấu trúc record
class C1 : CO 
double d; 
int i ;
public :
int proc4(int i); 
void proc5 (double d);
};
typedef struct {
// import các field từ cấu trúc 
// được sinh ra từ co
// các field tương ứng với C1 
double C1_d; 
int C1 _i;
// các field dữ liệu điều khiển 
// tự tạo bởi chương trình dịch 
void (*pvfaddr)();
} 01 ;
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 3: Cơ chế dịch mã OOP sang mã mấy
Slide 36
Dịch thuộc tính dữ liệu (tt)
□ mỗi class -> 1 record dữ liệu cổ điển.
□ tên class -» tên record.
□ copy các field dữ liệu của cấu trúc sinh ra từ việc dịch class cha.
□ Chuyển từng thuộc tính của class thành từng field của record, 
“tuyệt đối hóa” tên của thuộc tính để tránh nhặp nhằng.
□ thêm các field dữ liệu điều khiển phục vụ cho run-time : thí dụ 
bảng địa chỉ các tác vụ của đối tượng (pvftbl).
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 37
Dịch thuộc tính dữ liệu (tt)
□ Cấu trúc record được dịch ra mã máy thành 1 vùng nhớ liên tục có 
độ dài bằng đội dài của record.
- khai báo biến C1 01; C1_o1 db dup (sizeof(C1))
□ truy xuất 1 thuộc tính dữ liệu trở thành việc truy xuất ô nhớ dùng 
cách định địa chỉ chỉ số :
-o1.i = 5; movbx, C1_o1
mov [bx+8], 5
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 38
Tạo bảng địa chỉ các tác vụ
pvftbl
class C1 : CO { 
double d; 
int i ;
public: 
void proc2(); //override 
int proc4(int i, double k); 
void proc5 (double d);
};
0
1
3
4
5
fname faddr
Mproc1" C0_proc1
Mproc2" C1_proc2
'1Jpfoc3" C0_proc3
"proc4" C1_proc4
"proc5" C1_proc5
— ...
Khoa Công nghệ Thông tin
BK Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trình hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã mấy
Slide 39
Tạo bảng địa chỉ các tác vụ (tt)
□ Tạo bảng địa chỉ gồm C1METHCNT phần tử (C1METHCNT là số
tác vụ của class hiện hành, kể cả các tác vụ thừa kế).
□ Mỗi phần tử được nhận dạng qua chỉ số và gồm 2 thông tin chính : 
tên gợi nhớ của tác vụ và địa chỉ của tác vụ.
□ copy bảng địa chỉ của class cha đã có.
□ Hiệu chỉnh lại các địa chỉ của các tác vụ bị override.
□ Thêm vào các tác vụ mới định nghĩa trong class hiện hành.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 40
Dich 1 method
■
int C1 ::proc1 (int i,double 
C2 02;
C2 *p2;
01 ::i = i;
k ){
d = k;
C1::proc5(d);
o2.proc2(i,d); 
p2 = New(C2); 
p2->proc2(i,d);
};
int C1_proc1(C1* p, int i, double d) { 
C2 02; C2 *p2;
// truy xuất thuộc tính 
p->C1_i = i; p->C1_d = d;
// gọi hàm 
C1_proc5(p,d);
C2_proc2(&o2, i,d);
};
// gởi thông điệp : kiểm tra, load, 
// cập nhật bảng địa chỉ method 
for (i = 0; i <C2METHCNT; j ++) 
if (strcmp ("proc2", p2-> 
pvftbl[i].fname)==0) break; 
(*p2->pvftbl[i].faddr)(p2,i,d);
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng đối tuọng
Chương 3: Cơ chế dịch mã OOP sang mã mấy
Slide 41
Dịch 1 method (tt)
□ tên method được chuyển từ dạng “tương đối” sang “tuyệt đối” (nối 
kết tên class vào).
□ thêm tham số đầu tiên cho hàm sinh ra : miêu tả tham khảo đến 
đối tượng mà hàm sẽ truy xuất các thuộc tính dữ liệu.
□ tên thuộc tính được chuyển từ dạng “tương đối” sang “tuyệt đối” 
(nối kết tên class vào).
□ gọi hàm internal -> gọi hàm nhưng thêm tham số đầu tiên.
□ gởi thông điệp gồm 3 bước :
■ kiểm tra, tìm, load đối tượng rồi cập nhật bảng địa chỉ các 
method của đối tượng.
■ tìm chỉ số của method cần gọi trong bảng (i).
■ gọi gián tiếp method thông qua địa chỉ phần tử thứ i trong 
bảng.
w I Khoa Công nghệ Thông tin
^ Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng đối tuọng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 42
Tối ưu hóa code tạo ra
■
□ Có 2 vấn đề lớn trong quá trình dịch 1 class sang ngôn ngữ cổ 
điển.
■ Bảng địa chỉ các method chiếm nhiều không gian.
■ Tốn thời gian chạy lệnh gởi thông điệp : kiểm tra, tìm, load đối 
tượng, cập nhật bảng địa chỉ các tác vụ, tìm chỉ số method 
cần gọi và gọi gián tiếp qua địa chỉ trong bảng.
□ 1 số chương trình dịch tìm cách tối ưu hóa các vấn đề trên.
□ slide sau là các tối ưu hóa của chương trình dịch c++ và các giá 
phải trả.
w I Khoa Công nghệ Thông tin
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 43
Tối ưu hóa code tạo ra (tt)
□ trong c++, tất cả đối tượng đều tạm thời và gắn chặt vào ứng 
dụng bảng địa chỉ các method của các đối tượng luôn nằm 
sẵn trong không gian của ứng dụng.
□ Mỗi lần tạo đối tượng mới, biến pvftbl trong đối tượng được gán 
ngay địa chỉ bảng địa chỉ các method -» không cần thực hiện 
bước 1 khi xử lý lệnh gởi thông điệp đến đối tượng.
□ C++ chỉ dùng mối quan hệ con/cha trong kiểm tra kiểu -> công 
việc 2 (tìm chỉ số tác vụ) được làm tại thời điểm dịch thay VI tại 
thời điểm gởi thông điệp trong lúc chạy -> cột tên gợi nhớ 
method không cần phải lưu trữ trong bảng địa chỉ các method.
□ chỉ có các virtual function mới được giải quyết theo cơ chế đa xạ 
-> bảng địa chỉ chỉ chứa các hàm Virtual của class, còn các 
function khác được dịch ra lời gọi hàm trực tiếp.
w I Khoa Công nghệ Thông tin
^ Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng đối tuọng
Chương 3: Cơ chế dịch mã OOP sang mã máy
Slide 44
Tối ưu hóa code tạo ra (tt)
□ cái giá phải trả của việc tối ưu hóa trong C++ :
■ người lập trình phải tự quyết định tác vụ nào cần xử lý theo 
cơ chế đa xạ, tác vụ nào không ? Nếu sự quyết định này sai 
thì sẽ gây lỗi khi chạy, mà là người thì khó lòng quyết định 
chính xác.
■ tính đa xạ chỉ đúng giữa các đối tượng có mối quan hệ 
con/cha, ở đó thứ tự các địa chỉ method của mọi class con 
trong bảng địa chỉ luôn giống thứ tự các method tương ứng 
của class cha, tuy nhiên giữa 2 class bất kỳ thì không thể 
đảm bảo -> kiểm tra kiểu trong C++ không thể nâng cấp lên 
bằng cách dùng mối quan hệ "conformity".
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 3: Cơ chế dịch mã OOP sang mã mấy
Slide 45
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG■ ■
Chương 4
TỔNG QUÁT VỂ MỨC ĐỘ Hỗ TRỢ 
OOP CỦA VC++ & JAVA
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 46
4.1 Ngôn ngữ Visual C++
1. Chỉ hỗ trợ class, không hỗ trợ abstract type.
2. Cho phép đa thừa kế & Override method khi thừa kế.
3. Dùng 'abstract class' để định nghĩa interface.
4. Tầm vực truy xuất các thành phần.
5. Đa xạ có chọn lọc nhờ Virtual function'
6. Chỉ hỗ trợ các đối tượng tạm.
7. Có thể định nghĩa “overloaded function”.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 47
Chỉ hỗ trợ class, không hỗ trợ abstract type
Chỉ cung cấp lệnh “class” để đặc tả sự hiện thực của đối tượng, 
không có lệnh interface hay type để định nghĩa type của đối 
tượng.
Dùng class để định nghĩa kiểu cho các biến, các thuộc tính.
Cần phân biệt cách định nghĩa kiểu cho biến :
C1 o1; // biến 01 là vùng nhớ chứa đối tượng
C1 * p1; // biến p1 là vùng nhớ chứa pointer tới đối tượng
=>
■ Nếu 1 class có chứa thuộc tính đối tượng thuộc kiểu class thì 
đối tượng tương ứng sẽ là đối tượng gộp vật lý đối tượng khác.
■ Nếu 1 class có chứa thuộc tính đối tượng thuộc kiểu class 
pointer thì đối tượng tương ứng sẽ là đối tượng gộp chứa tham 
khảo (pointer) đến đối tượng khác.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 48
Đa thừa kê
Đa thừa kế trong định nghĩa class, hấp dẫn cho người lập trình nhưng 
chi phí hiện thực thì rất cao :
■ dễ gây ra việc trùng tên giữa các thành phần nằm trong các class cha 
khác nhau nhưng đều được thừa kế cho class con => phải giải quyết 
vấn đề trùng tên và tránh nhặp nhằng trong việc truy xuất chúng.
■ 1 class có thể chứa nhiều class cha trùng nhau => phải giải quyết việc 
duplicate các thành phần của các class cha trùng nhau này (dư thừa và 
mất tính nhất quán) => VC++ đề nghị dùng "Virtual base class" để tối 
ưu hóa bộ nhớ đối tượng.
^ Môn : Lập trinh hướng đối tuợng
Khoa Công nghệ Thông tin Chương 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 49
Đa thừa kê
■ Phát biểu :
class NguoiCa : public Nguoi, public Ca {...}; 
sẽ tạo ra các đối tượng NguoiCa có cấu trúc dữ liệu theo hình a. 
trong slide trước => các thuộc tính trong class Sinhvat được nhân 
bản và tồn tại 2 lần ở 2 vị trí khác nhau trong đối tượng NguoiCa 
=> dư thừa dữ liệu và mất tính nhất quán dữ liệu.
■ Còn phát biểu :
class NguoiCa : public Virtual Nguoi, public Virtual Ca {...}; 
sẽ tạo ra các đối tượng NguoiCa có cấu trúc dữ liệu theo hình b. 
trong slide trước => các thuộc tính trong class Sinhvat chỉ tồn tại 
1 lần trong đối tượng NguoiCa => khắc phục được sự dư thừa dữ 
liệu và không mất tính nhất quán dữ liệu.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 50
Class trừu tuợng (Abstract class)
VC++ hỗ trợ khái niệm "abstract class" để định nghĩa class chỉ chứa thông 
tin interface nhưng không cho phép dùng class này để định nghĩa kiễu cho 
biến hay thuộc tính (trừ pointer). Một “abstract class” là 1 class chứa ít 
nhất 1 "pure Virtual funtion“, một "pure Virtual funtion“ là 1 Virtual function 
được gán =0 (nghĩa là không có phần hiện thịực kèm theo).
cỉass Geometry { //abstract class
public:
Geometry( );
~Geometry( );
Virtual void Draw( Window *pWnd ) = 0; //pure Virtual fonction 
protected:
int xPos, yPos;
double xScaíe, yScale;
COLORREF color;
};
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 51
Tầm vực truy xuất thành viên của class
Tầm Vực truy xuất thành viên trong đối tượng được miêu tả bởi 1 
trong 3 từ khóa sau :
private : thành phần bị che dấu hoàn toàn.
protected : chỉ che dấu bên ngoài nhưng cho con, cháu, chát,... 
truy xuất.
public : cho phép tất cả mọi nơi truy xuất.
Friend class : là class mà mỗi hàm của nó đều có thể truy xuất tự 
do các thành phần của class hiện hành.
Friend function : là function cổ điển có thể truy xuất tự do các 
thành phần của class hiện hành.
Có thể hạn chế tầm vực các thành viên của class cha khi thừa kế.
class c : protected A, private B {...}
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 52
Hỗ trợ tính đa xạ có chọn lọc
■ ■ ■ ■
Định nghĩa Virtual function' nếu muốn áp dụng tính đa xạ trong lệnh 
gởi thông điệp yêu cầu hàm này thực thi.
Tất cả các Virtual function1 của class được quản lý trong 1 danh 
sách "virtual function table". Danh sách này là 1 trong các field dữ 
liệu nằm trong đối tượng được tạo tự động bởi chương trình dịch.
địa chỉ function 1
địa chỉ function 2
địa chỉ function 3
địa chỉ function 4
địa chỉ function 5
^ Môn : Lập trinh hướng đối tuợng
Khoa Công nghệ Thông tin Chương 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 53
Các đối tượng đéu tạm thời
Các đối tượng chỉ tồn tại tạm thời trong không gian process.
Tham khảo đến đối tượng thực chất là pointer cục bộ trong không 
gian làm việc của process.
Chương trình phải tự viết code cho hoạt động save/restore đối tượng 
nếu muốn lưu giữ/dùng lại đối tượng.
VC++ hỗ trợ hoạt động save/restore đối tượng nhờ khả năng 
'Serialization'.
Có quyền 'override' bất cứ method của bất kỳ function nào của class 
cha.
Cho phép định nghĩa các hàm 'overloaded': cùng tên nhưng 
'signature' khác nhau.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 54
Skeleton định nghĩa class
class Geometry : Object { // == class Geometry : public Object { 
public:
Geometry();
~Geometry();
virtual void Draw( Window *pWnd ); //virtualmethod 
BOOL IsDisplayed(void);
protected:
COLORREF color;
private:
int xPos, yPos; 
double xScale, yScale;
};
class Point : Geometry {}; 
class Line : Geometry {....}; 
class Polygon : Geometry {....}; 
class Rectangle : Geometry {....};
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 4 : Tổng quát vẻ mức độ hỗ trợ OOP của VC++ & Java
Slide 55
Cấu trúc 1 chương trình Dialog based đơn giản
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 56
Cấu trúc 1 chuông trình SDI đơn giản
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 57
Cấu trúc 1 chương trình MDI đơn giản
^ Môn : Lập trinh hướng đối tuợng
Khoa Công nghệ Thông tin Chương 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 58
4.2 Ngôn ngữ Java
1. Hỗ trợ đầy đủ 'interface' (abstract type) và class.
2. Hỗ trợ đơn thừa kế.
3. Có thể dùng 'abstract class' để định nghĩa interface.
4. Tầm vực truy xuất các thành phần.
5. Hỗ trợ package
6. Đa xạ đầy đủ.
7. Chỉ hỗ trợ đối tượng tạm trong từng session JVM
8. Override function khi thừa kế.
9. Có thể định nghĩa overloaded function.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 59
Hỗ trợ Class và Interface
■
1. Java hỗ trợ việc định nghĩa đối tượng theo cả 2 góc nhìn : phát 
biểu interface định nghĩa góc nhìn sử dụng và phát biểu class 
định nghĩa góc nhìn hiện thực => về nguyên tắc người lập trình 
nên dùng tên interface để định nghĩa biến đói tượng, tuy nhiên 
do tập quán và thói quen, người lập trình chủ yếu vẫn dùng class 
để định nghĩa kiểu cho các biến, thuộc tính. Tuy nhiên dù dùng 
tên interface hay tên class định nghĩa biến đối tượng thì biến này 
vẫn chỉ chứa tham khảo đến đối tượng, còn đối tượng được tạo 
ra trong không gian quản lý của máy ảo JVM (chứ không phải 
trong không gian ứng dụng).
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 60
Tạo & xóa đôi tirợng
Phải gọi hàm tạo đối tượng 1 cách tường minh, nhưng không cần 
xóa đối tượng (việc này nên để cho module dọn rác của JVM thực 
hiện để đảm bảo tính đúng đắn và an toàn), 
class C1 extends Rootciăss {...}
C1 o1; // o1 chứa tham khảo đến đối tượng C1
01 = New C1; //tạo đối tượng mới và gán tham khảo vào biến đối
tượng
Việc dùng tên interface đặc tả kiểu cho biến, thuộc tính luôn có lợi 
hơn việc dùng tên class. Thí dụ về ứng dụng hiển thị đồng hồ thời 
gian thực trong chương này sẽ cho ta thấy rõ điều này.
2. Đơn thừa kế trong định nghĩa interface và định nghĩa class => mối 
quan hệ thừa kế giữa các interface/class khá đơn giản, dễ hiện 
thục.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 61
Hỗ trợ abstract class
■
3. Tiếp tục hỗ trợ khái niệm "abstract class" để định nghĩa class chỉ 
chứa thông tin interface và không cho phép 'instanciate' đối 
tượng. Người lập trình chỉ có thể dùng class 'abstract class' để 
đặc tả kiểu cho các biến hoặc để thừa kế trong việc định nghĩa 
class con.
class abstract Geometry { //abstract class
protected int xPos, yPos;
protected double xScale, yScale;
protected COLORREF color;
public abstract Draw(Graphics g); / / abstract function 
};
Abstract class có thể chứa đầy đủ các hiện thực bên trong,
___ nhưng thưởng chỉ chứa các 'abstract function1._________________
^ Môn : Lập trinh huửng đối tuợng
Khoa Công nghệ Thông tin Chuung 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 62
Tầm vực truy xuất các thành phần
4. Tầm Vực truy xuất các thành phần trong đối tượng :
private : thành phần bị che dấu hoàn toàn.
protected : che dấu bên ngoài nhưng cho phép các đối tượng 
con, cháu, chắt... truy xuất.
public : cho phép tất cả mọi nơi truy xuất.
friendly : cho phép mọi phần tử trong cùng package truy xuất. 
Đây là tầm vực mặc định và không có từ khóa tầm vực tường 
minh.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 63
Hỗ trợ package
5. Package là đơn vị đóng gói các class và cũng là đơn vị quản lý 
tầm vực của java, mỗi package chứa nhiều class (ở dạng mã 
trung gian - mã bytecode).
package graphics;
public class Circle extends Graphic implements Draggable {
}
Tất cả mọi phần tử được định nghĩa trong 1 file mã nguồn đều 
thuộc 1 package, tên package này được đặc tả trong phát biểu 
package, phát biểu này phải nằm ở đầu file mã nguồn. Nếu 
không có thì các class trong file mã nguồn sẽ được chứa trong 
package mặc định (không có tên).
Nhiều file source có thề được dịch và ỈƯU trong cùng 1 package.__
^ Môn : Lập trinh huửng đối tuợng
Khoa Công nghệ Thông tin Chuung 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 64
Hỗ trợ đầy đủ tính đa xạ
6. Tất cả các tác vụ mà có thể được gọi từ bên ngoài (public, 
protected, friendly) đều được quản lý trong 1 danh sách "public 
function table“ của đối tượng.
Địa chỉ function 1 
Địa chỉ function 2 
Địa chỉ function 3 
Địa chỉ function i 
Địa chỉ function n
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 65
Các đối tượng đều 'tạm thời'
7. Các đối tượng chỉ tồn tại tạm thời trong 1 session chạy JVM.
Coe của ứng dụng phải tạo ra đối tượng nếu muốn dùng nó, 
nhưng không cần phải xóa đối tượng. Đối tượng sẽ tồn tại 1 khi 
còn tham khảo đến nó trong không gian của 1 session JVM. 
Module Garbage Collection trong JVM sẽ chịu trách nhiệm phát 
hiện đối tượng ‘rác’ và xóa nó ra khỏi bộ nhớ JVM.
8. Có quyền 'override' bất kỳ function nào của class cha. Class cha 
có thể quyết định không cho các class con override tác vụ của 
mình bằng cách dùng từ khóa final trong lệnh định nghĩa tác vụ 
đó.
9. Cho phép định nghĩa các hàm 'overloaded': cùng tên nhưng 
'signature' khác nhau.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 66
Thí dụ vé chương trình Java
import java.net.*; 
public class getnet { 
public static void main(String args[]) { 
try {
if(args.length!=1) {
S ystem .out.prin tln fllsage: java AddrLookupApp M); 
return;
}
InetAddress host = lnetAddress.getByName(args[0]);
String hostName = host.getHostName();
System.out.println ("Host name : M+hostName);
System.out.println ("IP address:"+host.getHostAddress());
}
catch (UnknownHostException e) {...}
^ Môn : Lập trinh hướng đối tuợng
Khoa Công nghệ Thông tin Chương 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 67
Thí dụ về chương trình Java
GUICIock
12.34.25
« c h ứ a » AlarmClock
wakeupO
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 68
Thí dụ vé các class Java
■
public class AlarmClock {
private static final int MAX_CAPACITY = 10; 
private static final int UNUSED = -1; 
private static final int NOROOM = -1; 
private Sleeper[] sleepers = new Sleeper[MAX_CAPACITY]; 
private long[] sleepFor = new long[MAX_CAPACITY]; 
public AlarmClock 0 { 
for (int i = 0; i < MAX_CAPACITY; i++) 
sleepFor[i] = UNUSED;
}
//còn tiếp Ở slide kế
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 69
Thí dụ vé các class Java
■
//tác vụ đếm dùm khách hàng s thời gian time (ms) 
public synchronized boolean letMeSleepFor(Sleeper s, long time) 
{
int index = findNextSlot(); 
if (index == NOROOM) { 
return false;
} else { 
sleepers[index] = s; 
sleepFor[index] = time; 
new AlarmThread(index).start(); 
return true;
}
}
//còn tiếp Ở slide kế
w I Khoa Công nghệ Thông tin 
B K k Trường ĐH Bach Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 4 : Tổng quát vẻ mức độ hỗ trợ OOP của VC++ & Java
Slide 70
Thí dụ vé các class Java
■
private synchronized int findNextSlot() { 
for (int i = 0; I < MAX_CAPACITY; i++) { 
if (sleepFor[i] == UNUSED) 
return i;
} _ _ _ 
return NOROOM;
}
private synchronized void wakellpSleeper(int sleeperlndex) { 
sleepers[sleeperlndex].wakeUp(); 
sleepers[sleeperlndex] = null; 
sleepFor[sleeperlndex] = UNUSED;
}
//còn tiếp Ở slide kế
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 71
Thí dụ vé các class Java
■
private class AlarmThread extends Thread { 
int mySleeper;
AlarmThread(int sleeperlndex) { 
super();
mySleeper = sleeperlndex;
}
public void run() { 
try {
sleep(sleepFor[mySleeper]);
} catch (InterruptedException e) {} 
wakeUpSleeper(mySleeper);
}
}
}
//hết phần đặc tả class AlarmClock
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 72
Thí dụ vé các class Java
■
public interface Sleeper {
public void wakeUpO;
public long ONE_SECOND = 1000;// in milliseconds 
public long ONE_MINUTE = 60000; // in milliseconds
}
import java.applet.Applet; 
import java.awt.Graphics; 
import java.util.*; 
import java.text.DateFormat;
public class GUICIock extends Applet implements Sleeper { 
private AlarmClock clock; 
public void init() { 
clock = new AlarmClockO;
}
^ Môn : Lập trinh hướng đối tuợng
Khoa Công nghệ Thông tin Chương 4 : Tổng quát vẻ mức đô hỗ trơ OOP của VC++ & Java
BK ^ Trường ĐH Bach Khoa Tp.HCM a Slide 73
Thí dụ vé các class Java
■
public void start() { 
clock.letMeSleepFor(this, 1000);
}
public void paint(Graphics g) {
Calendar cal = Calendar.getlnstance();
Date date = cal.getTime();
DateFormat dateFormatter = DateFormat.getTimelnstance(); 
g.drawString(dateFormatter.format(date), 5, 10);
}
public void wakellp() { 
repaint();
clock.letMeSleepFor(this, 1000);
}
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 4 : Tổng quát vé mức độ hỗ trợ OOP của VC++ & Java
Slide 74
MÔN KỸ THUẬT LẬP TRÌNH■ ■
Chương 5
ĐẶC TẢ CLASS & CÁC TÍNH CHẤT cơ BẢN 
CỦA ĐỐI TƯƠNG TRONG VC++
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lặp trinh huửng đối tuợng
Chương 5 :Đặc tả class & cấc tính chất cơ bản của đối tượng trong VC++
Slide 75
Đặc tả class trong VC++
Thông tin chi tiết trong bài thực hành số 6.
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lặp trinh huửng đối tuợng
Chương 5 :Đặc tả class & cấc tính chất cơ bản của đối tượng trong VC++
Slide 76
MÔN KỸ THUẬT LẬP TRÌNH■ ■
Chương 6
ĐẶC TẢ CLASS & CÁC TÍNH CHẤT cơ BẢN 
CỦA ĐỐI TƯƠNG TRONG JAVA
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 6 :Đặc tả class & các tính chát cơ bản của đối tượng trong Java
Slide 77
Đặc tả interface (abstract type) trong Java
Thông tin chi tiết trong bài thực hành số 7.
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 6 :Đặc tả class & các tính chát cơ bản của đối tượng trong Java
Slide 78
MÔN KỸ THUẬT LẬP TRÌNH■ ■
Chưong 7
GỌI HÀM, GỞI THÔNG ĐIỆP 
& ĐA XA TRONG VC++
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++
Slide 79
Tổng quát vé gọi hàm trong VC++
Trong VC++, các lệnh thực thi đều phải nằm trong thân của 1 hàm 
nào đó. Ta phân biệt 2 loại hàm :
■ Hàm cổ điển, tồn tại ở cấp ngoài cùng (không thuộc class nào).
■ Hàm trong 1 class đối tượng nào đó, ta tạm dùng thuật ngữ "tác 
vụ" để nói về loại hàm này.
Trong thân của 1 hàm cổ điển, xét lệnh sau :
tunctionl (...);
::function1 (...);
Hai lệnh trên được gọi là lời gọi hàm cổ điển function1(). Hàm 
function1() phải tồn tại trong module nào đó của phần mềm hoặc 
trong module thư viện mà phần mềm sẽ liên kết đến.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++
Slide 80
Tổng quát vé gọi hàm trong VC++
Trong thân của 1 tác vụ, xét lệnh sau :
::function1 (...);
Lệnh trên là lời gọi hàm cổ điển function1(). Hàm function1() phải 
tồn tại trong module nào đó của phần mềm hoặc trong module thư 
viện mà phần mềm sẽ liên kết đến.
Trong thân của 1 tác vụ, xét lệnh sau :
function1 (...);
Nếu function10 không được định nghĩa trong class của đối tượng 
tương ứng thì lệnh trên là lời gọi hàm cổ điển function1(). Hàm 
function10 phải tồn tại trong module nào đó của phần mềm hoặc 
trong module thư viện mà phần mềm sẽ liên kết đến.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++
Slide 81
Tổng quát vé gọi hàm trong VC++
□ Trong VC++, có 2 cách truy xuất đối tượng khác nhau :
- thông qua biến đối tượng MyClass obj;
■ thông qua biến tham khảo đến đối tượng : MyClass *pobj;
□ Biến obj miêu tả bản thân đối tượng MyClass (1 cách tường 
minh, xác định và không nhầm lẫn với bất kỳ đối tượng thuộc 
class nào khác. Cú pháp gọi tác vụ thông qua biến đối tượng là :
obj.function1 (...);
lệnh trên luôn được dịch ra thảnh lời gọi hàm function1(...) của 
class MyClass tại thời điểm dịch. Do đó tại thời điểm chạy, nếu 
biến obj đang chứa 1 đối tượng khác thì lệnh obj.function1(..) vẫn 
luôn là lời gọi hàm function1(..) của class MyClass. Không có đa 
xạ trong trường hợp này. Ngữ nghĩa của lời gọi hàm như trên có 
thể đúng/không đúng với yêu cầu của người lập trình tại từng thời 
điểm/vị trí chạy nó.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! ™ n9J in, . Chương 7 : Goi hàm, gởi thông đ êp & đa xa trong VC++B K ^ Trường ĐH Bách Khoa Tp.HCM a V ,a a c* g |j(ỊỊe 82
Tổng quát vé gọi hàm trong VC++
Trong thân của 1 tác vụ, xét lệnh sau : 
tunctionl (...);
Nếu function1() được định nghĩa trong class của đối tượng tương 
ứng thì lệnh trên sẽ được chuyển thành lệnh :
this->function1 (...);
trong đó this là tên biến tham khảo đến đối tượng hiện hành.
Lệnh this->function1 (...); là trường hợp đặc biệt của lệnh :
pobj->function1 (...);
trong đó pobj là tên biến tham khảo đến đối tượng nào đó đã được 
định nghĩa trước đó.
Bây giờ chúng ta hãy khảo sát chi tiết về việc xử lý lệnh 
pobj->function1 (...); trong VC++.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! ™ n9J in, . Chương 7 : Goi hàm, gởi thông đ êp & đa xa trong VC++B K ^ Trường ĐH Bách Khoa Tp.HCM a V ,a a 8g
xử lý lệnh gởi thông điệp trong VC++
Giải sử biến tham khảo pobj đã được định nghĩa như sau :
MyClass *pobj;
Việc xử lý lệnh gởi thông điệp pobj->function 1 (...); như sau :
Kiểm tra xem functionl có phải là tác vụ Virtual của class MyClass không?
■ Nếu functionl không phải là tác vụ Virtual, lệnh gởi thông điệp sẽ 
được dịch ra lời gọi hàm tường minh đến hàm function 1 của class 
MyClass (bất chấp tại thời điểm chạy biến pobj đang tham khảo đến 
đối tượng thuộc class nào khác). Như vậy, cách giải quyết này không 
tạo ra tính đa xạ cho lời gởi thông điệp.
■ Nếu functionl là tác vụ Virtual, lệnh gởi thông điệp sẽ được dịch ra 
đoạn mã máy thực hiện việc tìm và liên kết động tới hàm fucntionl 
nhờ bảng địa chỉ các hàm Virtual của đối tượng được tham khảo bởi 
biến pobj. Như vậy, cách giải quyết này sẽ tạo ra tính đa xạ cho lời 
gởi thông điệp.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++
Slide 84
Thí dụ củng cô nội dung chương 7
Giới thiệu bài thực hành số 8.
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++
Slide 85
MÔN KỸ THUẬT LẬP TRÌNH■ ■
Chưong 8
GỌI HÀM, GỞI THÔNG ĐIỆP 
& ĐA XA TRONG JAVA
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 8 : Gọi hàm, gỏi thông điệp & đa xạ trong Java
Slide 86
Trong Java, chỉ có 1 cách truy xuất đối tượng duy nhất : thông qua 
biến tham khảo đến đối tượng. Biến tham khảo được định nghĩa 
theo 1 trong 2 cách :
MyClass pobj; //dùng class miêu tả kiểu cho biến
My Interface pobj; //dùng interface miêu tả kiểu cho biến
Trong Java, các lệnh thực thi đều phải nằm trong thân của 1 tác vụ 
nào đó của 1 class nào đó.
Tổng quát về gỏi thông điệp trong Java
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 8 : Gọi hàm, gỏi thông điệp & đa xạ trong Java
Slide 87
Tổng quát về gỏi thông điệp trong Java
Trong thân của 1 tác vụ, xét lệnh sau : 
function"! (...);
Nếu function1() được định nghĩa trong class của đối tượng tương 
ứng thì lệnh trên sẽ được chuyển thành lệnh :
this.functionl (...);
trong đó this là tên biến tham khảo đến đối tượng hiện hành.
Lệnh this.functionl (...); là trường hợp đặc biệt của lệnh :
pobj.functionl (...);
trong đó pobj là tên biến tham khảo đến đối tượng nào đó đã được 
định nghĩa trước đó.
Bây giờ chúng ta hãy khảo sát chi tiết về việc xử lý lệnh 
pobj.functionl (...); trong Java.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! 3J]ôn9 ttn , Chương 8 : Goi hàm, gỏi thông điêp & đa xa trong Java
B K ^ Trường ĐH Bách Khoa Tp.HCM Slide 88
xử lý lệnh gởi thông điệp trong Java
Giả sử biến tham khảo pobj đã được định nghĩa như sau :
MyClass pobj;
Việc xử lý lệnh gởi thông điệp pobj.functionl (...); là kiểm tra xem functionl 
có phải là tác vụ private của class MyClass không?
■ Nếu function 1 là tác vụ private, lệnh gởi thông điệp chỉ được xử lý khi 
pobj = this. Máy sẽ dịch ra lời gọi hàm tường minh đến hàm functionl 
của class FuncClass (class chứa hàm function“!), bất chấp tại thời 
điểm chạy biến this đang tham khảo đến đối tượng thuộc class nào 
khác. Như vậy, cách giải quyết này không tạo ra tính đa xạ cho lời gởi 
thông điệp.
■ Nếu function 1 có tầm vực khác private, lệnh gởi thông điệp sẽ được 
dịch ra đoạn mã máy thực hiện việc tìm và liên kết động tới hàm 
tucntionl nhờ bảng địa chỉ các tác vụ của đối tượng được tham khảo 
bởi biến pobj. Như vậy, cách giải quyết này sẽ tạo ra tính đa xạ cho 
lời gởi thông điệp.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! 3J]ôn9 ttn , Chương 8 : Goi hàm, gỏi thông điêp & đa xa trong Java
B K ^ Trường ĐH Bách Khoa Tp.HCM Slide 89
Thí dụ củng cô nội dung chương 8
Giới thiệu bài thực hành số 9.
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình huửng đối tuợng
Chương 8 : Gọi hàm, gỏi thông điệp & đa xạ trong Java
Slide 90
MÔN KỸ THUẬT LẬP TRÌNH■ ■
Chương 9
TỔNG QUÁT HÓA TRONG XÂY DỰNG 
HÀM & CLASS
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 91
Tính tổng quát hóa (Generalization)
□ Như ta đã biết, xây dựng một ứng dụng theo hướng đối tượng là 
xây dựng các class có đối tượng được dùng để phục vụ ứng dụng 
đó. Công việc chính của xây dựng 1 class là xây dựng những 
method cấu thành interface của class đó. Có thể có nhiều 
method trong các class khác nhau dùng cùng một giải thuật 
(đoạn lệnh thực thi) nhưng tác động trên những dữ liệu có số 
lượng và cấu trúc (kiểu) khác nhau. Tương tự có thể có nhiều 
class khác nhau cung cấp cùng một interface giống nhau nhưng 
tác động trên những dữ liệu có số lượng và cấu trúc khác nhau.
□ Thí dụ ta cần method hoán vị 2 số nguyên, method hoán vị 2 
chuỗi, method hoán vị 2 dãy,... Ta cần class quản lý danh sách 
n số nguyên, class quản lý m chuỗi, class quản lý k dãy...
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 92
Tính tổng quát hóa (tt)
□ Hàm tổng quát hóa (function template) cho phép ta đặc tả 1 tập 
các hàm mà dùng chung đoạn lệnh thực thi nhưng tác động trên 
những dữ liệu thuộc kiểu hay class khác nhau và/hoặc với số 
lượng khác nhau.
□ Class tổng quát hóa (class template) cho phép ta đặc tả 1 tập 
các class có tính chất và giao diện giống nhau nhưng tác động 
trên những dữ liệu thuộc kiểu hay class khác nhau và/hoặc với số 
lượng khác nhau. Class tổng quát hóa cho phép sản sinh tự động 
các class bình thường, các class bình thường tự nó chỉ có thể tạo 
ra đối tượng.
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 93
Function template
Function template cho phép ta đặc tả 1 tập các hàm mà dùng chung 
đoạn lệnh thực thi nhưng tác động trên những dữ liệu thuộc kiểu hay 
class khác nhau. Thí dụ hàm IntSwapO sau đây : 
void lntSwap(int& a, int& b ) { 
int c = a; 
a = b; b = c;
}
chỉ cho phép swap 2 số nguyên, nhưng template MySwapO sau : 
template void MySwap( T& a, T& b ) {
T c (a); 
a = b; b = c;
}
định nghĩa 1 họ các hàm swap 2 dữ liệu có kiểu bất kỳ.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! ™ n9J in, . Chương 9 : Tổng quát hóa trong xây dưng ham & classB K ^ Trường ĐH Bách Khoa Tp.HCM a a H a / v a SHde 94
Function template (tt)
■ Ta CÓ thể gọi hàm “template function” y như gọi hàm bình 
thường, không có sự khác biệt nào cả :
int i, j;
char k;
MySwap (i, j); //Ok
MySwap (i, k); //Sai vì khác kiểu.
■ Ta có thể đặc tả tham số rõ ràng khi gọi hàm “template function”, 
thí dụ :
MySwap(i,j); //tạo hàm MySwap (int&, int&) và gọi nó với 
(ij)
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 95
Class template
Class template cho phép ta đặc tả 1 tập các class mà dùng chung 
interface và cấu trúc dữ liệu nhưng tác động trên những dữ liệu thuộc kiểu 
hay class khác nhau. Thí dụ class Intstack sau đây : 
class Intstack {
int StackBuffer[100]; 
int cltems; 
public:
void lntstack( void ) : cltems( 100 ) {}; 
void push( const int item ); 
int pop( void );
}; int lntStack::pop ( void ) {
void lntStack::push( const int item ) { 
if ( cltems > 0 ) StackBuffer[--cltems] 
else throw "Stack overflow error."; 
return;
if ( cltems < 100)
return StackBuffer[cltems++];
= item; else
throw "Stack underflow error.";
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh hướng đối tượng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 96
Class Intstack được đặc tả ở slide trước chỉ có thể tạo ra các đối 
tượng stack chứa các số nguyên. Nếu muốn stack chứa các số thực, 
ta phải đ|nh nghĩa mới 1 class khác (gần giống với class Intstack). 
Tương tự, nếu muốn stack chứa các chuỗi, ta lại phải định nghĩa mới 
1 class khác (gần giống với class Intstack)....
Class template cho phép ta khắc phục được phiền hà này.
Class template
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 97
Class template
Cú pháp khai báo 1 class template :
template-declaration :
template déclaration 
template-argument-list : 
template-argument
template-argument-list, template-argument 
template-argument : 
type-argument 
argument-declaration 
type-argument : 
class identifier 
typename identifier 
déclaration :
là đặc tả class bình thường nhưng có nhiều vị trí có dùng các tham số 
template.
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 98
Class template (tt)
template class MyStack { 
T StackBuffer[i]; 
int cltems; 
public:
void MyStack( void ): cltems( i ) {}; 
void push( const T item );
T pop( void);
template void MyStack::push( const T item ) { 
if( cltems > 0 )
StackBuffer[--cltems] = item; 
else
throw "Stack overflow error."; 
return;
4 ------------------------------------------------------------------------------------------------------------------------
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 99
Class template (tt)
template T MyStack::pop( void ) { 
if( cltems < i )
return StackBuffer[cltems++]; 
else
throw "Stack underflow error.";
Cho phep dac ta cac class mieu ta cac stack gom nhieu du lieu bat ky 
nao do, thi du :
MyStack intstack; // bien quan ly stack co toi da 20 so nguyen.
MyStack strstack; // bien quan ly stack co toi da 40 chu6i.
MyStack dblstack; // bien quan ly stack co toi da 100 so 
thuc.
^ Mon : Lap trinh huong doi tuong
au L i h0a Cl r!? " Qh! Iu 6n9-r-tin, , Chuong 9 : Tong quat hoa trong xay dung ham & classJ 3 K ^ Truong OH Bach Khoa Tp.HCM a a / . a S|id e i 00
Class template (tt)
Xem phần phụ lục chương 9 để biết chi tiết, cụ thể của 2 template MFC được 
dùng phổ biến nhất là CArray và CList.
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 101
Định nghĩa class "serializable"
Đọc/ghi dữ liệu của 1 biến thuộc kiểu cổ điển (int, double, char[],..) 
rấr dễ vì nội dung của biến này không chứa tham khảo đến các 
thành phần khác. Ngược lại, việc đọc/ghi nội dung của 1 đối tượng 
thường rất khó khăn vì đối tượng có thể chứa nhiều tham khảo đến 
các đối tượng khác và các đối tượng có thể tham khảo vòng lẫn 
nhau. Để hỗ trợ phần nào việc đọc/ghi nội dung của đối tượng, VC++ 
đề nghị kỹ thuật "Serialization".
Để định nghĩa 1 class "serializable", ta cần thực hiện 5 tác vụ :
1. định nghĩa class như là con của class CObject (gián tiếp hay trực 
tiếp).
2. Overriding tác vụ "Serialize".
3. Dùng macro DECLARE_SERIAL trong phát biểu đặc tả class.
4. Định nghĩa hàm constructor không tham số.
5. Dùng macro IMPLEMENT_SERIAL trong hiện thực class.
^ Môn : Lập trinh hướng đối tuợng
au L T h° i c l r!? " gh! 3J]ôn9 ttn , Chương 9 : Tổng quát hóa trong xây dưng ham & classB K ^ Trường ĐH Bách Khoa Tp.HCM a a / v a Slide-102
Định nghĩa class "serializable"
//1. thừa kế class CObject 
class MyClass : public CObject { 
public :
//3. dùng macro DECLARE_SERIAL 
DECLARE_SERIAL( MyClass);
//4. định nghĩa constructor không tham số 
MyClassO;
virtual void Serialize( CArchive& archive );
};
//5. dùng macro IMPLEMENT_SERIAL 
IMPLEMENT_SERIAL(MyClass, CObject, 1 )
//2. Override hàm Serialize
void MyClass::Serialize( CArchive& a r ) {...}
^ Môn : Lập trinh hướng đối tuợng
au L íh°iclr!? "gh! 3J]ôn9 ttn , Chương 9 : Tổng quát hóa trong xây dưng ham & classB K ^ Trường ĐH Bách Khoa Tp.HCM a a / v a Slide-103
Định nghĩa hàm Serialize
void MyClass::Serialize (CArchive& a r ) {
//1. gọi hàm Serialize của class cha 
CObject::Serialize(ar);
//2. gọi hàm Serialize trên từng đối tượng con được chứa vật lý 
ba.Serialize( a r );
//3. Serialize đối tượng con được tạo động và các thuộc tính cổ điển 
if ( ar.lsStoringO ) { llờ chế độ ghi đối tượng 
ar « pba l; a r« pba;
// Store other members 
ar « b1; ar « b2;
} else { Hà chế độ đọc đối tượng 
ar » pba l; a r» pba; // Polymorphic reconstruction of persistent object 
//load other members 
ar » b1; ar » b2;
}
}
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 104
Ghi đôi tượng
2.
3.
4.
5.
Để ghi 1 đối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ : 
1. Định nghĩa đoi tượng CFile miêu tả file chứa thông tin.
Định nghĩa đối tượng CArchive ổ chế độ "store".
Gọi tác vụ Serialize khi cần ghi đối tượng.
Đồng đối tượng CArchive 
Đóng file 
//1. Định nghĩa đối tượng CFile 
CFile theFile;
theFile.Open("c:\\persist.bin", CFile::modeCreate I CFile::modeWrite); 
//2. Định nghĩa đối tượng CArchive 
CArchive archive(&theFile, CArchive::store);
MyClass obj;
//3. Gọi tác vụ Serialize để ghi đối tượng 
obj.Serialize(archive);
//4. Gọi tác vụ Close để đóng đối tượng archive 
archive.Close();
//5. Gọi tác vụ Close để đóng đối tượng file 
theFile.Close();
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 105
Đọc lại đối tượng■ ■
1.
2.
3.
4.
5.
Để đọc lại 1 đối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ : 
Định nghĩa đối tượng CFile miêu tả file chứa thông tin.
Định nghĩa đối tượng CArchive ổ chế độ "load".
Gọi tác vụ Serialize khi cần ghi đối tượng.
Đồng đối tượng CArchive 
Đóng file 
//1. Định nghĩa đối tượng CFile 
CFile theFile;
theFile.Open("c:\\persist.bin", CFile::modeRead);
//2. Định nghĩa đối tượng CArchive 
CArchive archive(&theFile, CArchive::load);
MyClass obj;
//3. Gọi tác vụ Serialize để đọc lại đối tượng 
obj.Serialize(archive);
HA. Gọi tác vụ Close để đóng đối tượng archive 
archive.Close();
//5. Gọi tác vụ Close để đóng đối tượng file 
theFile.Close();
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 106
Thí dụ về đọc/ghi đối tượng
đối tượng class A
BK
Khoa Công nghệ Thông tin 
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trinh huớng đối tuợng
Chương 9 : Tổng quát hóa trong xây dựng hàm & class
Slide 107
            Các file đính kèm theo tài liệu này:
 slidelaptrinhoop_3582.pdf slidelaptrinhoop_3582.pdf