Tải bản đầy đủ (.pdf) (54 trang)

Slide Lap Trinh Huong Doi Tuong

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (334.81 KB, 54 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 1


<b>MƠN L</b>

<b>Ậ</b>

<b>P TRÌNH H</b>

<b>ƯỚ</b>

<b>NG </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG</b>



<b>Tài liệu tham khảo :</b>


ƒ 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


<b>Đối tượng : </b>SV đại học chính quy ngành CNTT


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 2


<b>Nội dung chính gồm 10 chương :</b>



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.


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 3


<b>MƠN L</b>

<b>Ậ</b>

<b>P TRÌNH H</b>

<b>ƯỚ</b>

<b>NG </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG</b>



<i><b>Ch</b><b>ươ</b><b>ng 1</b></i>


<b>ƠN L</b>

<b>Ạ</b>

<b>I CÁC TÍNH CH</b>

<b>Ấ</b>

<b>T </b>




<b>C</b>

<b>Ủ</b>

<b>A L</b>

<b>Ậ</b>

<b>P TRÌNH C</b>

<b>Ấ</b>

<b>U TRÚC</b>



Chương 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 trình hướng đối tượng


Slide 4
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.


<b>Ph</b>

<b>ươ</b>

<b>ng pháp phân tích t</b>

<b>ừ</b>

<b>-trên-xu</b>

<b>ố</b>

<b>ng</b>



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 5


<b>Ph</b>

<b>ươ</b>

<b>ng pháp phân tích t</b>

<b>ừ</b>

<b>-trên-xu</b>

<b>ố</b>

<b>ng (tt)</b>



Chương 1: Ơn lại các tính chất của lập trình cấu trúc


Công việc cần
giải quyết (A)


Công việc
A<sub>1</sub>


Công việc
A<sub>2</sub>


Công việc
A<sub>n</sub>



Công vi<i>ệ</i>c
A<sub>11</sub>


Công vi<i>ệ</i>c
A<sub>12</sub>


Công vi<i>ệ</i>c
A<sub>1n</sub>


Công vi<i>ệ</i>c
A<sub>n1</sub>


Công vi<i>ệ</i>c
A<sub>n2</sub>


Công vi<i>ệ</i>c
A<sub>nn</sub>


<b>...</b>


<b>...</b> <b>...</b> <b>...</b> <b>...</b>


<b>chia thành nhiều công </b>
<b>việc nhỏhơn, đơn giản để</b>
<b>giải quyết hơn.</b>


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ó.


Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 6


<b>T</b>

<b>ầ</b>

<b>m v</b>

<b>ự</b>

<b>c truy xu</b>

<b>ấ</b>

<b>t bi</b>

<b>ế</b>

<b>n</b>



ƒ 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 <b>cục bộtrong function</b>: 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 <b>cục bộtrong module</b>: 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 <b>toàn cục</b>: 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 tồ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).


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 7


Chương trình = cấu trúc dữliệu + giải thuật


entry 'start'


global data
module


(package)


local data
of module


local data
of function



<b>C</b>

<b>ấ</b>

<b>u trúc 1 ch</b>

<b>ươ</b>

<b>ng trình h</b>

<b>ướ</b>

<b>ng c</b>

<b>ấ</b>

<b>u trúc</b>



Chương 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 trình hướng đối tượng


Slide 8
‰ 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.


ƒ Ngồ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”.


Chương 1: Ơn lại các tính chất của lập trình cấu trúc


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 9


‰ 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 (*.lib) 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.


Chương 1: Ơn lại các tính chất của lập trình cấu trúc


<b>C</b>

<b>ấ</b>

<b>u trúc 1 ch</b>

<b>ươ</b>

<b>ng trình h</b>

<b>ướ</b>

<b>ng c</b>

<b>ấ</b>

<b>u trúc</b>



Khoa Cơng nghệ Thơng tin


Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 10


<b>M</b>

<b>ố</b>

<b>i quan h</b>

<b>ệ</b>

<b>client/server gi</b>

<b>ữ</b>

<b>a các module</b>



//đặ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);


//đặc tảinterface của module B : server
extern int B_intA;


typedef struct {...} B_Type1;
#define B_MAXLEN 1024
int B_func1(char c, char* d);


#include A.h


//hiện thực của module A
int A_intA;


static int A_intB;



int A_func1(int a, double b) {
B_Type1 var;


...


B_intA = B_MAXLEN;
A_func2(a);


B_func1(a,b);
}


static void A_func2(int a) {
}


#include B.h


//hiện thực của module B
int B_intA;


static int B_intB;


int B_func1(int a, double b) {
...


B_func2(a);
...


}



static void B_func2(int a) {
}


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 11


<b>Hai module s</b>

<b>ử</b>

<b>d</b>

<b>ụ</b>

<b>ng tài nguyên c</b>

<b>ủ</b>

<b>a nhau</b>



//đặ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);


//đặc tảinterface của module B
#define _BH


#ifndef _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 A.h


//hiện thực của module A
int A_intA;


static int A_intB;


int A_func1(int a, double b) {
...


A_func2(a);
...


}


static void A_func2(int a) {
}


#include B.h


//hiện thực của module B
int B_intA;



static int A_intB;


int B_func1(int a, double b) {
...


B_func2(a);
...


}


static void B_func2(int a) {
}


Chương 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 trình hướng đối tượng


Slide 12
<i><b>Ch</b><b>ươ</b><b>ng 2</b></i>


<b>CÁC KHÁI NI</b>

<b>Ệ</b>

<b>M CHÍNH </b>



<b>C</b>

<b>Ủ</b>

<b>A L</b>

<b>Ậ</b>

<b>P TRÌNH H</b>

<b>ƯỚ</b>

<b>NG </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG</b>



Chương 2 : Các khái niệm chính của lập trình hướng đối tượng


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

Khoa Công nghệ Thông tin


Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 13


<b>N</b>

<b>ộ</b>

<b>i dung</b>



<b>2.1 Cấu trúc của 1 ứng dụng hướng đối tượng</b>
<b>2.2 Đối tượng, thuộc tính, tác vụ.</b>


<b>2.3 Abstract type và class.</b>
<b>2.4 Tính bao đóng.</b>


<b>2.5 Tính thừa kế & cơ chế'</b><i><b>override'.</b></i>


<b>2.6 Tính bao gộp.</b>


<b>2.7 Thơng điệp, tính đa xạ</b> <b>và kiểm tra kiểu.</b>
<b>2.8 Tính tổng qt hóa.</b>


<b>2.9 Tính thường trú.</b>


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 hướng đối tượng



Slide 14


Chương trình = tập các đối tượng tương tác nhau


entry
Đối tượng


(object)


local data
of object


local data
of operation


<b>C</b>

<b>ấ</b>

<b>u trúc ch</b>

<b>ươ</b>

<b>ng trình OOP</b>



</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 15


‰ 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 số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 tồ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.


Chương 2 : Các khái niệm chính của lập trình hướng đối tượng


<b>C</b>

<b>ấ</b>

<b>u trúc ch</b>

<b>ươ</b>

<b>ng trình OOP</b>



Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 16


<b>Đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng (Object)</b>



‰ Đố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 đó.


Interface
(abstract type)


Implementation
(class)



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 17


<b>Ki</b>

<b>ể</b>

<b>u tr</b>

<b>ừ</b>

<b>u t</b>

<b>ượ</b>

<b>ng (Abstract type)</b>



Chương 2 : Các khái niệm chính của lập trình hướng đối tượng


ƒ Abstract type (<i>type</i>) đị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 ngồi có thể giao tiếp với


đối tượng.


ƒ Ta dùng signatuređểđịnh nghĩa mỗi 'entry'. Signature gồm :


ƒ têntác vụ(operation, 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ăngcủ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.


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 18


<b>Ki</b>

<b>ể</b>

<b>u tr</b>

<b>ừ</b>

<b>u t</b>

<b>ượ</b>

<b>ng trong Java</b>



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 wakeUp();


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 DigitalClock(); //biến object giữtham khảo đến 1 đối tượng


DigitalClock


Object = new AnalogClock(); //biến object giữtham khảo đến 1 đối tượng
AnalogClock


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 19


<b>Class (Implementation)</b>



Chương 2 : Các khái niệm chính của lập trình hướng đối tượng


~ 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 type', 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 function'.



~ Đị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.


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 20


<b>Ví d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>đị</b>

<b>nh ngh</b>

<b>ĩ</b>

<b>a class trongVC++</b>



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 lParam);


virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnConnect();


HICON m_hIcon;


private :


SOCKET sock;


u_short portno; // Which tcp port are we going to use?
};


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 21


<b>Tính bao </b>

<b>đ</b>

<b>óng (encapsulation)</b>



‰ Bao đóng : che dấu mọi chi tiết hiện thực của đối tượng, khơng
cho bên ngồ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 ngồ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 functionvà 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.


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 hướng đối tượng


Slide 22


<b>Tính th</b>

<b>ừ</b>

<b>a k</b>

<b>ế</b>

<b>(inheritance)</b>



‰ 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 {…}


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 23


<b>Ví d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>th</b>

<b>ừ</b>

<b>a k</b>

<b>ế</b>

<b>và override — VC++</b>



<b>class</b>Geometry { <i>// abstract base class</i>


<b>public</b>:


Geometry( );


<b>virtual void</b>Draw( Window *pWnd ) = 0; <i>// abstract operation</i>


<b>protected</b>:


<b>int</b> xPos, yPos;
COLORREF color;
};



<b>class</b>Group : <b>public</b>Geometry {
<b>public</b>:


Group( );
~Group( );


<b>virtual void</b>Draw( Window *pWnd ); <i>// override</i>


<b>private</b>:


Geometry **ppGeo; <i>// pointer container</i>


<b>int</b> geoCount;
};


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 hướng đối tượng


Slide 24


<b>Tính bao g</b>

<b>ộ</b>

<b>p (aggregation)</b>



ƒ 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.


O<sub>1</sub> O2


O<sub>3</sub>


Góc nhìn ngữnghĩa <sub>Góc nhìn hi</sub><sub>ệ</sub><sub>n th</sub><sub>ự</sub><sub>c</sub>


O<sub>1</sub>


O<sub>2</sub>


O<sub>3</sub>


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 25


<b>Ví d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>bao g</b>

<b>ộ</b>

<b>p - VC++</b>



<b>class</b>Geometry { <i>// abstract base class</i>


<b>public</b>:


Geometry( );
~Geometry( );



<b>virtual void</b>Draw( Window *pWnd ) = 0; <i>// abstract operation</i>


<b>protected</b>:


<b>int</b> xPos, yPos;
<b>double</b> xScale, yScale;
COLORREF color;
};


<b>class</b>Group : <b>public</b>Geometry {
<b>public</b>:


Group( );
~Group( );


<b>virtual void</b>Draw( Window *pWnd ); <i>// override</i>


<b>private</b>:


Geometry **ppGeo; <i>// =</i>Geometry* ppGeo[n];


<b>int</b> geoCount;
};


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 hướng đối tượng



Slide 26


<b>Thơng </b>

<b>đ</b>

<b>i</b>

<b>ệ</b>

<b>p (Message)</b>



‰ 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.Draw (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.


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 27


<b>Tính </b>

<b>đ</b>

<b>a x</b>

<b>ạ</b>

<b>(Polymorphism)</b>



‰ 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 T1
...


p1 = New C1; // tạo đối tượng C1, gán tham khảo vào biến p1


p1.meth1(...); // gởi thông điệp nhờtác vụmeth1 thực thi


...


p1 = New C2; // tạo đối tượng C2, gán tham khảo vào biến p1


p1.meth1(...); // gởi thông điệp nhờtác vụmeth1 thực thi


Lệnh gởi thông điệp p1.meth1(...);ở 2 vịtrí khác nhau kích hoạt
2 tác vụkhác nhau của 2 class khác nhau.


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 hướng đối tượng


Slide 28


<b>Ki</b>

<b>ể</b>

<b>m tra ki</b>

<b>ể</b>

<b>u (type check)</b>




‰ 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ốOUThay 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ốINcủ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ốINOUTphải trùng với kiểu của đối số tương ứng
trong B.


Ö quan hệso trùnghay quan hệcon/cha (sub/super) làtrường hợp
đặc biệtcủa quan hệtương thích tổng quát.


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 29


<b>Tính t</b>

<b>ổ</b>

<b>ng qt hóa (Generalization)</b>




‰ Có 2 ngữnghĩa khác nhau của tính tổng qt 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.


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 hướng đối tượng


Slide 30


<b>Tính th</b>

<b>ườ</b>

<b>ng trú (persistence)</b>



‰ 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ạikhi cịn ít nhất 1 tham khảo đến nó
trong hệthống.


ƒ Đối tượng phải bịxóakhi 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).


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 31


<b>T</b>

<b>ổ</b>

<b>ng k</b>

<b>ế</b>

<b>t</b>



‰ 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 qt 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ệ'conformity'.


ƒ 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ó.


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 hướng đối tượng


Slide 32
<i><b>Ch</b><b>ươ</b><b>ng 3</b></i>


<b>C</b>

<b>Ơ</b>

<b> CH</b>

<b>Ế</b>

<b>D</b>

<b>Ị</b>

<b>CH MÃ H</b>

<b>ƯỚ</b>

<b>NG </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG</b>



<b>SANG MÃ MÁY</b>



Chương 3: Cơ chếdịch mã OOP sang mã máy


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng



Slide 33


‰ 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.


<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>v</b>

<b>ấ</b>

<b>n</b>

<b>đề</b>

<b>d</b>

<b>ị</b>

<b>ch OOP</b>



Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 34


‰ 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.


<b>D</b>

<b>ị</b>

<b>ch 1 abstract type</b>



</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 35


‰ 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.


<b>D</b>

<b>ị</b>

<b>ch 1 class</b>



Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 36
‰ class →cấu trúc record


class C1 : C0 {
double d;
int i ;
...
public :


int proc4(int i);


void proc5 (double d);
...


};


<b>D</b>

<b>ị</b>

<b>ch thu</b>

<b>ộ</b>

<b>c tính d</b>

<b>ữ</b>

<b>li</b>

<b>ệ</b>

<b>u</b>



typedef struct {


// import các field từcấu trúc
//được sinh ra từC0


// 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)() ;


} C1;


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 37


<b>D</b>

<b>ị</b>

<b>ch thu</b>

<b>ộ</b>

<b>c tính d</b>

<b>ữ</b>

<b>li</b>

<b>ệ</b>

<b>u (tt)</b>



‰ 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).


Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 38


<b>D</b>

<b>ị</b>

<b>ch thu</b>

<b>ộ</b>

<b>c tính d</b>

<b>ữ</b>

<b>li</b>

<b>ệ</b>

<b>u (tt)</b>



‰ 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 o1; 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; mov bx, C1_o1
mov [bx+8], 5


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 39


class C1 : C0 {
double d;


int i ;
...
public :


void proc2(); //override
int proc4(int i, double k);
void proc5 (double d);
...


};


<b>T</b>

<b>ạ</b>

<b>o b</b>

<b>ả</b>

<b>ng</b>

<b>đị</b>

<b>a ch</b>

<b>ỉ</b>

<b>các tác v</b>

<b>ụ</b>



0 "proc1" C0_proc1
1 "proc2" C1_proc2


2 "proc3" C0_proc3


3 "proc4" C1_proc4
4 "proc5" C1_proc5


5 .... ...


fname faddr


pvftbl


Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 40


<b>T</b>

<b>ạ</b>

<b>o b</b>

<b>ả</b>

<b>ng</b>

<b>đị</b>

<b>a ch</b>

<b>ỉ</b>

<b>các tác v</b>

<b>ụ</b>

<b>(tt)</b>



‰ 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.


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 41


int C1::proc1(int i,double k) {
C2 o2;



C2 *p2;
C1::i = i;
d = k;


C1::proc5(d);
o2.proc2(i,d);
p2 = New(C2);
p2->proc2(i,d);
....


};


<b>D</b>

<b>ị</b>

<b>ch 1 method</b>



int C1_proc1(C1* p, int i, double d) {
C2 o2; 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; i ++)


if (strcmp ("proc2", p2->
pvftbl[i].fname)==0) break;


(*p2->pvftbl[i].faddr)(p2,i,d);


};


<b>1</b>
<b>2</b>


<b>3</b>


Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 42


<b>D</b>

<b>ị</b>

<b>ch 1 method (tt)</b>



‰ 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.


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 43


<b>T</b>

<b>ố</b>

<b>i</b>

<b>ư</b>

<b>u hóa code t</b>

<b>ạ</b>

<b>o ra</b>



‰ Có 2 vấn đềlớn trong q 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ả.


Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng


Slide 44


<b>T</b>

<b>ố</b>

<b>i </b>

<b>ư</b>

<b>u hóa code t</b>

<b>ạ</b>

<b>o ra (tt)</b>



‰ 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 vì 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.



</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 45


<b>T</b>

<b>ố</b>

<b>i</b>

<b>ư</b>

<b>u hóa code t</b>

<b>ạ</b>

<b>o ra (tt)</b>



‰ 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".


Chương 3: Cơ chếdịch mã OOP 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 hướng đối tượng



Slide 46
<i><b>Ch</b><b>ươ</b><b>ng 4</b></i>


<b>T</b>

<b>Ổ</b>

<b>NG QUÁT V</b>

<b>Ề</b>

<b>M</b>

<b>Ứ</b>

<b>C </b>

<b>ĐỘ</b>

<b>H</b>

<b>Ỗ</b>

<b>TR</b>

<b>Ợ</b>



<b>OOP C</b>

<b>Ủ</b>

<b>A VC++ & JAVA</b>



Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 47


<b>4.1 Ngôn ng</b>

<b>ữ</b>

<b>Visual C++</b>


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”.


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 trình hướng đối tượng


Slide 48


<b>Ch</b>

<b>ỉ</b>

<b>h</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>class, không h</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>abstract type</b>



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 o1 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.



</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 49


<b>Đ</b>

<b>a th</b>

<b>ừ</b>

<b>a k</b>

<b>ế</b>



Đ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.


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


a. <sub>b.</sub>


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng



Slide 50


<b>Đ</b>

<b>a th</b>

<b>ừ</b>

<b>a k</b>

<b>ế</b>


ƒ Phát biểu :


class NguoiCa : publicNguoi, publicCa {...};


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 qn dữliệu.
ƒ Cịn phát biểu :


class NguoiCa : public virtualNguoi, 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 qn dữliệu.


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 51


<b>Class tr</b>

<b>ừ</b>

<b>u t</b>

<b>ượ</b>

<b>ng (Abstract class)</b>




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).


<b>class</b>Geometry { <i>// abstract class</i>


<b>public</b>:


Geometry( );
~Geometry( );


<b>virtual void</b>Draw( Window *pWnd ) = 0; <i>// pure virtual function</i>


<b>protected</b>:


<b>int</b> xPos, yPos;


<b>double</b> xScale, yScale;
COLORREF color;


};


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 trình hướng đối tượng


Slide 52


<b>T</b>

<b>ầ</b>

<b>m v</b>

<b>ự</b>

<b>c truy xu</b>

<b>ấ</b>

<b>t thành viên c</b>

<b>ủ</b>

<b>a class</b>



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 :


<b>private</b>: thành phần bịche dấu hồn toàn.


<b>protected</b>: chỉche dấu bên ngoài nhưng cho con, cháu, chắt,…
truy xuất.


<b>public</b>: 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 {…}


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng



Slide 53


<b>H</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>tính </b>

<b>đ</b>

<b>a x</b>

<b>ạ</b>

<b>có ch</b>

<b>ọ</b>

<b>n l</b>

<b>ọ</b>

<b>c</b>



Đị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 function' 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


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 trình hướng đối tượng


Slide 54



<b>Các</b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng </b>

<b>đề</b>

<b>u t</b>

<b>ạ</b>

<b>m th</b>

<b>ờ</b>

<b>i</b>



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à pointercụ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.


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 55


<b>Skeleton</b>

<b>đị</b>

<b>nh ngh</b>

<b>ĩ</b>

<b>a class</b>



<b>class</b>Geometry : Object { // == class Geometry : public Object {


<b>public</b>:


Geometry( );
~Geometry( );


<b>virtual void</b>Draw( Window *pWnd ); <i>// virtual method</i>


BOOL IsDisplayed(void);
....


<b>protected</b>:


COLORREF color;


....
<b>private :</b>


<b>int</b> xPos, yPos;


<b>double</b> xScale, yScale;
...


};


<b>class</b>Point : Geometry {};
<b>class</b>Line : Geometry { .... };
<b>class</b>Polygon : Geometry {....};
<b>class</b>Rectangle : Geometry {....};
....



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 trình hướng đối tượng


Slide 56


<b>C</b>

<b>ấ</b>

<b>u trúc 1 ch</b>

<b>ươ</b>

<b>ng trình Dialog based </b>

<b>đơ</b>

<b>n gi</b>

<b>ả</b>

<b>n</b>



InitInstance()


DoModal()


<b>CProgramApp</b>



<b>CProgramDlg</b>



</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 57


<b>C</b>

<b>ấ</b>

<b>u trúc 1 ch</b>

<b>ươ</b>

<b>ng trình SDI </b>

<b>đơ</b>

<b>n gi</b>

<b>ả</b>

<b>n</b>



InitInstance()



<b>CProgramApp</b>



<b>CSingleDocTemplate</b>


<b>CMainFrame</b>


<b>CProgramView</b> <b><sub>CProgramDoc</sub></b>


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 trình hướng đối tượng


Slide 58


<b>C</b>

<b>ấ</b>

<b>u trúc 1 ch</b>

<b>ươ</b>

<b>ng trình MDI </b>

<b>đơ</b>

<b>n gi</b>

<b>ả</b>

<b>n</b>



InitInstance()


<b>CProgramApp</b>



<b>CMultiDocTemplate</b>


<b>CChildFrame</b>


<b>CProgramView</b> <b><sub>CProgramDoc</sub></b>


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM



Mơn : Lập trình hướng đối tượng


Slide 59


<b>4.2 Ngôn ng</b>

<b>ữ</b>

<b>Java</b>


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.


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 trình hướng đối tượng


Slide 60


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 qn 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).


<b>H</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>Class và Interface</b>



</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 61


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 tồn).


<b>class</b>C1 <b>extends</b>RootClass {...}


C1 o1; // o1 chứa tham khảo đến đối tượng C1


o1 = 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 ln 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.


<b>T</b>

<b>ạ</b>

<b>o & xóa </b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng</b>



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 trình hướng đối tượng


Slide 62


<b>H</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>abstract class</b>



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.


<b>class</b>abstract Geometry { <i>// abstract class</i>


<b>protected int</b> xPos, yPos;



<b>protected double</b> xScale, yScale;


<b>protected </b>COLORREF color;
...


<b>public </b>abstract Draw(Graphics g); <i>// abstract function</i>
<i>...</i>


};


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 function'.


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 63


<b>T</b>

<b>ầ</b>

<b>m v</b>

<b>ự</b>

<b>c truy xu</b>

<b>ấ</b>

<b>t các thành ph</b>

<b>ầ</b>

<b>n</b>



4. Tầm vực truy xuất các thành phần trong đối tượng :
<b>private</b>: thành phần bịche dấu hoàn toàn.


<b>protected</b>: 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.


<b>public</b>: cho phép tất cảmọi nơi truy xuất.



<b>friendly</b>: 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.


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 trình hướng đối tượng


Slide 64


5. Packagelàđơ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à lưu trong cùng 1 package.


<b>H</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>package</b>



</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 65


<b>H</b>

<b>ỗ</b>

<b>tr</b>

<b>ợ</b>

<b>đầ</b>

<b>y </b>

<b>đủ</b>

<b>tính </b>

<b>đ</b>

<b>a x</b>

<b>ạ</b>



6. Tất cảcác tác vụmà có thểđược gọi từbên ngồ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


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 trình hướng đối tượng


Slide 66


<b>Các</b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng </b>

<b>đề</b>

<b>u 't</b>

<b>ạ</b>

<b>m th</b>

<b>ờ</b>

<b>i'</b>



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 finaltrong 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.


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 67



<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>ch</b>

<b>ươ</b>

<b>ng trình Java</b>



import java.net.*;
public class getnet {


public static void main(String args[]) {
try {


if(args.length!=1) {


System.out.println("Usage: java AddrLookupApp <HostName>");
return;


}


InetAddress host = InetAddress.getByName(args[0]);
String hostName = host.getHostName();


System.out.println ("Host name : "+hostName);


System.out.println ("IP address:"+host.getHostAddress());
}


catch (UnknownHostException e) {...}
}


}


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 trình hướng đối tượng


Slide 68


<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b> ch</b>

<b>ươ</b>

<b>ng trình Java</b>



<b>12.34.25</b> <b>AlarmClock</b>


<b>GUIClock</b>


wakeup()
<<chứa>>


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 69


<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>các class Java</b>



<b>public class</b>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 () {


for (int i = 0; i < MAX_CAPACITY; i++)
sleepFor[i] = UNUSED;


}


//còn tiếp ởslide kế


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 trình hướng đối tượng


Slide 70


//tác vụđếm dùm khách hàng s thời gian time (ms)


public synchronized boolean <b>letMeSleepFor</b>(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ế


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 71


private synchronized int <b>findNextSlot</b>() {
for (int i = 0; i < MAX_CAPACITY; i++) {


if (sleepFor[i] == UNUSED)
return i;



}


return NOROOM;
}


private synchronized void <b>wakeUpSleeper</b>(int sleeperIndex) {
sleepers[sleeperIndex].wakeUp();


sleepers[sleeperIndex] = null;
sleepFor[sleeperIndex] = UNUSED;
}


//còn tiếp ởslide kế


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>các class Java</b>



Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 72
<b>private class AlarmThread</b>extends Thread {


int mySleeper;


<b>AlarmThread</b>(int sleeperIndex) {


super();


mySleeper = sleeperIndex;
}


public void <b>run</b>() {
try {


sleep(sleepFor[mySleeper]);
} catch (InterruptedException e) {}
wakeUpSleeper(mySleeper);
}


}
}


//hết phần đặc tảclass AlarmClock


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 73


<b>public interface Sleeper</b>{
public void wakeUp();



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;


<b>public class GUIClock</b>extends<b>Applet</b>implements <b>Sleeper</b>{
private AlarmClock clock;


public void init() {


clock = new AlarmClock();
}


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>các class Java</b>



Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 74


public void <b>start</b>() {



clock.letMeSleepFor(this, 1000);
}


public void <b>paint</b>(Graphics g) {


Calendar cal = Calendar.getInstance();
Date date = cal.getTime();


DateFormat dateFormatter = DateFormat.getTimeInstance();
g.drawString(dateFormatter.format(date), 5, 10);


}


public void<b>wakeUp</b>() {
repaint();


clock.letMeSleepFor(this, 1000);
}


}


Chương 4 : Tổng quát vềmức độhỗtrợOOP của VC++ & Java


</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 75



<b>MƠN K</b>

<b>Ỹ</b>

<b>THU</b>

<b>Ậ</b>

<b>T L</b>

<b>Ậ</b>

<b>P TRÌNH</b>



<i><b>Ch</b><b>ươ</b><b>ng 5</b></i>


<b>ĐẶ</b>

<b>C T</b>

<b>Ả</b>

<b>CLASS & CÁC TÍNH CH</b>

<b>Ấ</b>

<b>T C</b>

<b>Ơ</b>

<b> B</b>

<b>Ả</b>

<b>N </b>



<b>C</b>

<b>Ủ</b>

<b>A </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG TRONG VC++</b>



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 trình hướng đối tượng


Slide 76


Chương 5 :Đặc tảclass & các tính chất cơ bản của đối tượng trong VC++


Thông tin chi tiết trong bài thực hành số6.


</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 77


<b>MƠN K</b>

<b>Ỹ</b>

<b>THU</b>

<b>Ậ</b>

<b>T L</b>

<b>Ậ</b>

<b>P TRÌNH</b>




<i><b>Ch</b><b>ươ</b><b>ng 6</b></i>


<b>ĐẶ</b>

<b>C T</b>

<b>Ả</b>

<b>CLASS & CÁC TÍNH CH</b>

<b>Ấ</b>

<b>T C</b>

<b>Ơ</b>

<b> B</b>

<b>Ả</b>

<b>N </b>



<b>C</b>

<b>Ủ</b>

<b>A </b>

<b>ĐỐ</b>

<b>I T</b>

<b>ƯỢ</b>

<b>NG TRONG JAVA</b>



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 hướng đối tượng


Slide 78


Thông tin chi tiết trong bài thực hành số7.


<b>Đặ</b>

<b>c t</b>

<b>ả</b>

<b>interface (abstract type) trong Java</b>



</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 79


<b>MƠN K</b>

<b>Ỹ</b>

<b>THU</b>

<b>Ậ</b>

<b>T L</b>

<b>Ậ</b>

<b>P TRÌNH</b>



<i><b>Ch</b><b>ươ</b><b>ng 7</b></i>



<b>G</b>

<b>Ọ</b>

<b>I HÀM, G</b>

<b>Ở</b>

<b>I THÔNG </b>

<b>Đ</b>

<b>I</b>

<b>Ệ</b>

<b>P</b>


<b>& </b>

<b>Đ</b>

<b>A X</b>

<b>Ạ</b>

<b>TRONG VC++</b>



Chương 7 : Gọi hàm, gởi thông điệp & đa xạtrong VC++


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 80


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 ngồ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 :
function1(...);


::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.



<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>g</b>

<b>ọ</b>

<b>i hàm trong VC++</b>



</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 81


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 function1() 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
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.


<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>g</b>

<b>ọ</b>

<b>i hàm trong VC++</b>



Chương 7 : Gọi hàm, gởi thông điệp & đa xạtrong VC++


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM



Mơn : Lập trình hướng đối tượng


Slide 82


‰ 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
ln 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 u cầu của người lập trình tại từng thời
điểm/vịtrí chạy nó.


<b>T</b>

<b>ổ</b>

<b>ng qt v</b>

<b>ề</b>

<b>g</b>

<b>ọ</b>

<b>i hàm trong VC++</b>



</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng



Slide 83


Trong thân của 1 tác vụ, xét lệnh sau :
function1(...);


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++.


<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>g</b>

<b>ọ</b>

<b>i hàm trong VC++</b>



Chương 7 : Gọi hàm, gởi thông điệp & đa xạtrong VC++


Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng



Slide 84
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->function1(...); như sau :


Kiểm tra xem function1 có phải làtác vụvirtualcủa class MyClass không?
ƒ Nếu function1 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 function1 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 function1 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 fucntion1
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.


<b>X</b>

<b>ử</b>

<b>lý l</b>

<b>ệ</b>

<b>nh g</b>

<b>ở</b>

<b>i thông </b>

<b>đ</b>

<b>i</b>

<b>ệ</b>

<b>p trong VC++</b>



</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng



Slide 85


Giới thiệu bài thực hành số8.


<b>Thí d</b>

<b>ụ</b>

<b>c</b>

<b>ủ</b>

<b>ng c</b>

<b>ố</b>

<b>n</b>

<b>ộ</b>

<b>i dung ch</b>

<b>ươ</b>

<b>ng 7</b>



Chương 7 : Gọi hàm, gởi thông điệp & đa xạtrong VC++


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 86


<b>MƠN K</b>

<b>Ỹ</b>

<b>THU</b>

<b>Ậ</b>

<b>T L</b>

<b>Ậ</b>

<b>P TRÌNH</b>



<i><b>Ch</b><b>ươ</b><b>ng 8</b></i>


<b>G</b>

<b>Ọ</b>

<b>I HÀM, G</b>

<b>Ở</b>

<b>I THƠNG </b>

<b>Đ</b>

<b>I</b>

<b>Ệ</b>

<b>P</b>


<b>& </b>

<b>Đ</b>

<b>A X</b>

<b>Ạ</b>

<b>TRONG JAVA</b>



</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 87


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
MyInterface 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 đó.


<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>g</b>

<b>ở</b>

<b>i thông </b>

<b>đ</b>

<b>i</b>

<b>ệ</b>

<b>p trong Java</b>



Chương 8 : Gọi hàm, gởi thông điệp & đa xạtrong Java


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 88


Trong thân của 1 tác vụ, xét lệnh sau :
function1(...);


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 Java.


<b>T</b>

<b>ổ</b>

<b>ng quát v</b>

<b>ề</b>

<b>g</b>

<b>ở</b>

<b>i thông </b>

<b>đ</b>

<b>i</b>

<b>ệ</b>

<b>p trong Java</b>



</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 89
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.function1(...);là kiểm tra xem function1
có phải làtác vụprivatecủa class MyClass không?


ƒ Nếu function1 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 function1
của class FuncClass (class chứa hàm function1), 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 function1 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
fucntion1 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.


<b>X</b>

<b>ử</b>

<b>lý l</b>

<b>ệ</b>

<b>nh g</b>

<b>ở</b>

<b>i thông </b>

<b>đ</b>

<b>i</b>

<b>ệ</b>

<b>p trong Java</b>



Chương 8 : Gọi hàm, gởi thông điệp & đa xạtrong Java


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 90


Giới thiệu bài thực hành số9.


<b>Thí d</b>

<b>ụ</b>

<b>c</b>

<b>ủ</b>

<b>ng c</b>

<b>ố</b>

<b>n</b>

<b>ộ</b>

<b>i dung ch</b>

<b>ươ</b>

<b>ng 8</b>



</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 91


<b>MƠN K</b>

<b>Ỹ</b>

<b>THU</b>

<b>Ậ</b>

<b>T L</b>

<b>Ậ</b>

<b>P TRÌNH</b>




<i><b>Ch</b><b>ươ</b><b>ng 9</b></i>


<b>T</b>

<b>Ổ</b>

<b>NG QT HĨA TRONG XÂY D</b>

<b>Ự</b>

<b>NG</b>



<b>HÀM & CLASS</b>



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 trình hướng đối tượng


Slide 92


<b>T nh t</b>

<b>̉</b>

<b>ng qua</b>

<b></b>

<b>t ho</b>

<b></b>

<b>a (Generalization)</b>



‰ 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 hố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…


</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 93


<b>T nh t</b>

<b>̉</b>

<b>ng qua</b>

<b></b>

<b>t ho</b>

<b></b>

<b>a (tt)</b>



‰ 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.


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 trình hướng đối tượng



Slide 94


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 IntSwap() sau đây :


void IntSwap(int& a, int& b ) {
int c = a;


a = b; b = c;
}


chỉcho phép swap 2 số nguyên, nhưng template MySwap() sau :
template <class T> 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ỳ.


<b>Function template</b>



</div>
<span class='text_page_counter'>(48)</span><div class='page_container' data-page=48>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 95
ƒ 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<int>(i,j); //tạo hàm MySwap (int&, int&) và gọi nó với
(i,j)


<b>Function template (tt)</b>



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 trình hướng đối tượng


Slide 96
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 cItems;


public:


void IntStack( void ) : cItems( 100 ) {};
void push( const int item );


int pop( void );
};


void IntStack::push( const int item ) {


if ( cItems > 0 ) StackBuffer[--cItems] = item;
else throw "Stack overflow error.";


return;
}


<b>Class template</b>



Chương 9 : Tổng quát hóa trong xây dựng hàm & class


int IntStack::pop ( void ) {
if ( cItems < 100)


return StackBuffer[cItems++];
else



</div>
<span class='text_page_counter'>(49)</span><div class='page_container' data-page=49>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 97


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.


<b>Class template</b>



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 trình hướng đối tượng


Slide 98


<b>Cú pháp khai báo 1 class template :</b>


template-declaration :



<b>template <</b>template-argument-list <b>></b>declaration
template-argument-list :


template-argument


template-argument-list <b>,</b>template-argument
template-argument :


type-argument
argument-declaration
type-argument :


<b>class</b>identifier


<b>typename</b>identifier
declaration :


là đặc tảclass bình thường nhưng có nhiều vịtrí có dùng các tham số


template.


<b>Class template</b>



</div>
<span class='text_page_counter'>(50)</span><div class='page_container' data-page=50>

Khoa Cơng nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 99



template <class T, int i>class MyStack {
T StackBuffer[i];


int cItems;
public:


void MyStack( void ) : cItems( i ) {};
void push( const T item );


T pop( void );
};


template <class T, int i> void MyStack< T, i >::push( const T item ) {
if( cItems > 0 )


StackBuffer[--cItems] = item;
else


throw "Stack overflow error.";
return;


}


<b>Class template (tt)</b>



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 trình hướng đối tượng


Slide 100


template <class T, int i> T MyStack< T, i >::pop( void ) {
if( cItems < i )


return StackBuffer[cItems++];
else


throw "Stack underflow error.";
}


Cho phép đặc tảcác class miêu tảcác stack gồm nhiều dữliệu bất kỳ


nào đó, thí dụ:


MyStack<int,20>intstack; // biến quản lý stack có tối đa 20 sốnguyên.


MyStack<CString,40>strstack; // biến quản lý stack có tối đa 40 chuỗi.


MyStack<double,100>dblstack; // biến quản lý stack có tối đa 100 số


thực.


Chương 9 : Tổng quát hóa trong xây dựng hàm & class


</div>
<span class='text_page_counter'>(51)</span><div class='page_container' data-page=51>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM



Mơn : Lập trình hướng đối tượng


Slide 101
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.


Chương 9 : Tổng quát hóa trong xây dựng hàm & class


<b>Class template (tt)</b>



Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 102
Đọ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_SERIALtrong phát biểu đặc tả class.
4. Định nghĩa hàm constructor không tham số.


5. Dùng macro IMPLEMENT_SERIALtrong hiện thực class.

<b>Đị</b>

<b>nh ngh</b>

<b>ĩ</b>

<b>a class "serializable"</b>



</div>
<span class='text_page_counter'>(52)</span><div class='page_container' data-page=52>

Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 103


//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ố
MyClass();


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& ar ) { ...}


Chương 9 : Tổng quát hóa trong xây dựng hàm & class


<b>Đị</b>

<b>nh ngh</b>

<b>ĩ</b>

<b>a class "serializable"</b>



Khoa Công nghệ Thơng tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 104
void MyClass::Serialize (CArchive& ar ) {


//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( ar );


//3. Serialize đối tượng con được tạo động và các thuộc tính cổ điển



if ( ar.IsStoring() ) { //ởchế độghi đối tượng
ar << pba1; ar << pba;


// Store other members
ar << b1; ar << b2;


} else { //ởchế độđọc đối tượng


ar >> pba1; ar >> pba; // Polymorphic reconstruction of persistent object
//load other members


ar >> b1; ar >> b2;


}
}


Chương 9 : Tổng quát hóa trong xây dựng hàm & class


</div>
<span class='text_page_counter'>(53)</span><div class='page_container' data-page=53>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Mơn : Lập trình hướng đối tượng


Slide 105


Để ghi 1 đối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ :
1. Định nghĩa đối tượng CFile miêu tảfile chứa thông tin.


2. Định nghĩa đối tượng CArchive ổchếđộ"store".


3. Gọi tác vụSerialize khi cần ghi đối tượng.
4. Đóng đối tượng CArchive


5. Đóng file


//1. Định nghĩa đối tượng CFile


CFile theFile;


theFile.Open("c:\\persist.bin", CFile::modeCreate | 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();


<b>Ghi </b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng</b>




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 trình hướng đối tượng


Slide 106


Để đọc lại 1 đối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ :
1. Định nghĩa đối tượng CFile miêu tảfile chứa thông tin.


2. Định nghĩa đối tượng CArchive ổchếđộ"load".
3. Gọi tác vụSerialize khi cần ghi đối tượng.
4. Đóng đối tượng CArchive


5. Đó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);


//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();


<b>Đọ</b>

<b>c l</b>

<b>ạ</b>

<b>i </b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng</b>



</div>
<span class='text_page_counter'>(54)</span><div class='page_container' data-page=54>

Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM


Môn : Lập trình hướng đối tượng


Slide 107


<b>Thí d</b>

<b>ụ</b>

<b>v</b>

<b>ề</b>

<b>đọ</b>

<b>c/ghi </b>

<b>đố</b>

<b>i t</b>

<b>ượ</b>

<b>ng</b>



Chương 9 : Tổng quát hóa trong xây dựng hàm & class


intB1 = 2
dblB2 = 2.345
ba


pba
pba1



intA1 = 1
dblA2 = 1.234
pab


intA1 = 3
dblA2 = 3.456
pab


intA1 = 4
dblA2 = 4.567
pab


đối tượng class B


</div>

<!--links-->

×