gọi hàm Serialize trên từng đối tượng con được chứa vật lý. ba.Serialize( ar );[r]
Trang 1Khoa 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
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
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
Đối tượng : 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
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.
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 2Khoa Công nghệ Thông tin
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.
Phương pháp phân tích từ-trên-xuống
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Trang 3Khoa 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
Phương pháp phân tích từ-trên-xuống (tt)
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)
chia thành nhiều công
việc nhỏ hơn, đơn giản để
giải quyết hơn.
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).
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Trang 4Khoa Công nghệ Thông tin
Cấu trúc 1 chương trình hướng cấu trúc
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.
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”.
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Cấu trúc 1 chương trình hướng cấu trúc
Trang 5Khoa 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
Cấu trúc 1 chương trình hướng 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 10
Mối quan hệ client/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);
//đặ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) {
static int B_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
Trang 6Khoa 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
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);
//đặ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) {
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
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 7Khoa 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
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.
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
Cấu trúc chương trình OOP
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 8Khoa 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 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
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Cấu trúc chương trình OOP
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
Đố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
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 9Khoa 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
Kiểu trừu tượng (Abstract type)
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
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 '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
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 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 {…}
Trang 10Khoa 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
Class (Implementation)
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
Ví dụ về định nghĩa class trongVC++
class CMiniChatClientDlg : public CDialog {
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnConnect();
Trang 11Khoa 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
Tính bao đó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 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
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 {…}
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 12Khoa Công nghệ Thông tin
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
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
Trang 13Khoa Công nghệ Thông tin
int xPos, yPos;
double xScale, yScale;
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
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.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
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 14Khoa 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
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 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
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ố 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
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 15Khoa 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
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
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
Tính thườ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ạ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)
Chương 2 : Các khái niệm chính của lập trình hướng đối tượng
Trang 16Khoa 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
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
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
Chương 3: Cơ chế dịch mã OOP sang mã máy
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 17Khoa 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
Tổng quát về vấn đề dịch OOP
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
Trang 18Khoa Công nghệ Thông tin
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
Dịch 1 class
Chương 3: Cơ chế dịch mã OOP sang mã máy
Khoa Công nghệ Thông tin
int proc4(int i);
void proc5 (double d);
};
Dịch thuộc tính dữ liệu
typedef struct {// import các field từ cấu trúc// được sinh ra từ C0
// các field tương ứng với C1double 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ịchvoid (*pvfaddr)() ;
} C1;
Chương 3: Cơ chế dịch mã OOP sang mã máy
Trang 19Khoa 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
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)
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
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 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
Trang 20Khoa Công nghệ Thông tin
void proc2(); //override
int proc4(int i, double k);
void proc5 (double d);
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
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
Chương 3: Cơ chế dịch mã OOP sang mã máy
Trang 21Khoa Công nghệ Thông tin
C2_proc2(&o2, i,d);
// gởi thông điệp : kiểm tra, load,// cập nhật bảng địa chỉ methodfor (i = 0; i <C2METHCNT; i ++)
3
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
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
Chương 3: Cơ chế dịch mã OOP sang mã máy
Trang 22Khoa 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
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ả
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
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 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
Chương 3: Cơ chế dịch mã OOP sang mã máy
Trang 23Khoa 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
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"
Chương 3: Cơ chế dịch mã OOP sang mã máy
Khoa Công nghệ Thông tin
OOP CỦA VC++ & JAVA
Chương 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 24Khoa 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
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”
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
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 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
Chương 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java
Trang 25Khoa 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
Đ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.
Chương 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java
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 quán 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 quán dữ liệu
Chương 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java
Trang 26Khoa 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
Class trừu tượ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).
class Geometry { // abstract class
int xPos, yPos;
double 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
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 {…}
Chương 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java
Trang 27Khoa 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
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 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
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
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à 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