gọi hàm Serialize trên từng đối tượng con được chứa vật lý. ba.Serialize( ar );[r]
(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
MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Tài liệu tham khảo :
Tập slide giảng & thực hành môn học
The C++ Programming Language (special 3rd edition), Bjarne Stroustrup, 2000
CD MSDN Microsoft Visual Studio
Online-Help môi trường JBuilder
Đối tượng : SV đại học 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
Nội dung gồm 10 chương :
1 Ơn lại tính chất lập trình cấu trúc Các khái niệm lập trình OOP Cơ chếdịch mã OOP sang mã máy
4 Tổng quát vềmức độhỗtrợOOP VC++ & Java
5 Đặc tảclass & tính chất đối tượng VC++ Đặc tảclass & tính chất đối tượng Java
7 Chi tiết vềgọi hàm, gởi thông điệp & đa xạcủa VC++ Chi tiết vềgọi hàm, gởi thông điệp & đa xạcủa Java
9 Chi tiết thường trú, serialization, COM, Generalization & Template VC++
10 Chi tiết thường trú, serialization, Generalization Java
(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
MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Chương 1
ƠN LẠI CÁC TÍNH CHẤT
CỦA LẬP TRÌNH CẤU TRÚC
Chương 1: Ơn lại tính chất 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 Mỗi vật môi trường xung quanh ta cấu thành từnhiều phần tử
nhỏ hơn, phần tửnhỏ lại cấu thành từnhiều phần tử nhỏ Thí dụ, người gồm đầu, mình, tứchi Tứchi gồm tay chân
Mỗi cơng việc cần giải máy tính cấu thành từ nhiều công việc nhỏ hơn, công việc nhỏ lại cấu thành từ nhiều công việc nhỏ
hơn
Phương pháp phân tích từ-trên-xuống (top-down analysis) phương pháp thường sử dụng đểphân tích cơng việc, nội dung phương pháp cố gắng xác
định xem công việc cần giải cấu thành từnhững công việc nhỏ nào, công việc nhỏđược cấu thành từcác công việc nhỏ nào, cho
đến công việc xác định công việc thật đơn giản,
thực dễdàng
Thí dụviệc học lấy kỹ sư CNTT khoa CNTT ĐHBK TP.HCM có thểbao gồm cơng việc nhỏ học học kỳtừ1 tới 9, học học kỳi học n mơn học học kỳđó, học mơn học học m chương mơn đó,
Hình vẽcủa slide kếcho thấy trực quan phương pháp phân tích top-down
Phương pháp phân tích từ-trên-xuống
(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
Phương pháp phân tích từ-trên-xuống (tt)
Chương 1: Ơn lại tính chất lập trình cấu trúc
Cơng việc cần giải (A)
Công việc A1
Công việc A2
Công việc An
Công việc A11
Công việc A12
Công việc A1n
Công việc An1
Công việc An2
Công việc Ann
chia thành nhiều công việc nhỏhơn, đơn giản để giải hơn.
Các công việc đủnhỏ đểđược miêu tảbằng lệnh hay 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
Tầm vực truy xuất biến
Tầm vực biến tập lệnh phép truy xuất biến C C++ cho phép cấp độtầm vực sau :
o cục bộtrong function: bất kỳlệnh function có thểtruy xuất
được biến cục function void Command1_Click() {
char strGreeting[256]; // Khai báo cục
}
o cục bộtrong module: bất kỳlệnh module có thểtruy xuất
được biến cục 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 chương trình có thểtruy xuất
biến tồn cục
Trong ngữcảnh (cùng function, module, hay cấp tồn cục), khơng thểdùng hai biến tên (C phân biệt chữHOA chữ thường)
(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
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
Cấu trúc chương trình hướng cấu trúc
Chương 1: Ơn lại tính chất 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 Thành phần “giải thuật” bao gồm code viết module Trong
module, code gom nhóm thành hàm chức năng, hàm nhận dạng truy xuất thông qua tên hàm
Thành phần “dữ liệu” bao gồm biến liệu định nghĩa module Trong module, mặt tầm vực truy xuất, biến
định nghĩa cấp tầm vực :
Public: bất kỳlệnh chương trình có thểtruy xuất
Private: chỉcó lệnh module hành có thểtruy xuất
Ngồi hàm chức năng, người ta có thểđịnh nghĩa biến cục bộ, biến truy xuất cục lệnh hàm tương
ứng Ngoại lệ, sốngôn ngữ C, người ta cho phép định nghĩa biến lệnh thực thi (block — compose), biến chỉđược truy xuất cục bộbởi lệnh thân lệnh block tương ứng
Öđiểm yếu ngôn ngữ hướng cấu trúc cho phép định nghĩa biến toàn cục, biến bị lỗi, ta khó xác định nguyên nhân gây lỗi Việc mang hàm hay module ứng dụng sang ứng dụng khác sẽkhó khăn thường gây hiệu ứng “dây chuyền”
Chương 1: Ôn lại tính chất lập trình cấu trúc
(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
Xét Turbo Pascal, ứng dụng gồm module chương trình nhiều module dịch vụđược gọi Unit Đểsửdụng thành phần module đó, ta phải dùng lệnh Use
Xét C, ứng dụng gồm nhiều module ngang hàng, module file gồm nhiều hàm chức Điểm nhập ứng dụng hàm main() Module C có thểlà file thư viện liên kết tĩnh (*.lib) hay động (*.dll) Đểsửdụng thành phần module đó, ta phải dùng lệnh #include
Chương 1: Ơn lại tính chất lập trình cấu trúc
Cấu trúc 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 module
//đặc tảinterface 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 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 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 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) { }
(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
Hai module sử dụng tài nguyên của nhau
//đặc tảinterface 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 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 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 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 tính chất 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 Chương 2
CÁC KHÁI NIỆM CHÍNH
CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Chương : Các khái niệm lập trình hướng đối tượng
(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
Nội dung
2.1 Cấu trúc ứng dụng hướng đối tượng 2.2 Đối tượng, thuộc tính, tác vụ.
2.3 Abstract type class. 2.4 Tính bao đóng.
2.5 Tính thừa kế & chế'override'.
2.6 Tính bao gộp.
2.7 Thơng điệp, tính đa xạ và kiểm tra kiểu. 2.8 Tính tổng qt hóa.
2.9 Tính thường trú.
Chương : Các khái niệm 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 đối tượng tương tác
entry Đối tượng
(object)
local data of object
local data of operation
Cấu trúc chương trình OOP
(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 nhất, chứa loại thành phần : đối tượng
Các đối tượng có tính độc lập cao ⇒quản lý, kiểm sốt chương trình 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 dữliệu tồn cục chương trình ⇒điểm yếu chương trình cấu trúc khơng tồn
Chương : Các khái niệm 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 nguyên tửcấu thành ứng dụng Đối tượng bao gồm loại thành phần :
thuộc tính (dữliệu) : thuộc tính mang giá trịnhất định thời điểm
tác vụ(operation) : thực công việc
Interface (abstract type)
Implementation (class)
(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
Kiểu trừu tượng (Abstract type)
Chương : Các khái niệm 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 đểnhận dạng Interface tập hợp 'entry' mà bên giao tiếp với
đối tượng
Ta dùng signatuređểđịnh nghĩa 'entry' Signature gồm :
têntác vụ(operation, function)
danh sách tham số hình thức, tham số đặc tả thuộc tính : tên, type chiều di chuyển(IN, OUT, INOUT)
đặc tảchức năngcủa tác vụ (thường ởdạng thích)
Ta dùng tên abstract type (chứ 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ể) đố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
Kiểu trừu tượng Java
Java hỗtrợkiểu trừu tượng thông qua lệnh interface, lệnh định nghĩa abstract type nhiều đối tượng ứng dụng (có thểthuộc nhiều class khác
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 đối tượng DigitalClock
Object = new AnalogClock(); //biến object giữtham khảo đến đối tượng AnalogClock
(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
Class (Implementation)
Chương : Các khái niệm lập trình hướng đối tượng
~ Ta dùng tên nhận dạng để đặt tên cho class để nhận dạng Classđịnh nghĩa chi tiết thựcđối tượng :
định nghĩa thuộc tính liệu, thuộc tính đặc tả thơng tin tên nhận dạng, kiểu liệu, tầm vực truy xuất, Kiểu thuộc tính type cổđiển (số nguyên, thực, ký tự, chuỗi ký tự, ) hay 'abstract type', trường hợp sau thuộc tính tham khảo đến đối tượng khác Trạng thái đối tượng tập giá trị thời điểm tương ứng tất thuộc tính đối tượng Trong thời gian tồn hoạt động, trạng tái đối tượng thay đổi
'coding' tác vụ (miêu tả giải thuật chi tiết hoạt động tác vụ) 'internal function'
~ Định nghĩa tác vụtạo (create) xóa (delete) đối tượng ~ Định nghĩa tác vụ'constructor' '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 { 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? };
(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
Tính bao đóng (encapsulation)
Bao đóng : che dấu chi tiết thực đối tượng, không cho bên thấy truy xuất⇒tạo độđộc lập cao đối tượng (hay tính kết dính - cohesion đối tượng thấp)
che dấu thuộc tính dữliệu: cần cho phép bên ngồi truy xuất thuộc tính, ta tạo tác vụ get/set tương ứng để giám sát kiểm soát việc truy xuất (thuộc tính che giấu)
che dấu chi tiết thực tác vụ
che dấu internal functionvà sựhiện thực chúng Java, VC++ cung cấp từkhóa private, protected, public để
xác định tầm vực truy xuất thành phần class
Chương : Các khái niệm 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 định nghĩa type/class từ đầu mà cách kế
thừa type/class có sẵn, ta định nghĩa thêm chi tiết mà (thường ít)
Đa thừa kế hay đơn thừa kế
Thừa kếtạo mối quan hệsupertype/subtype superclass/subclass
Có thểoverride method class cha, kết quảoverride chỉtác dụng đối tượng class
Đối tượng class có thểđóng vai trò đối tượng class cha ngược lại thường không
VC++ cho phép hạn chếtầm vực truy xuất thành phần class cha :
class C : protected A, private B {…}
(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
Ví dụ về thừa kế và override — VC++
classGeometry { // abstract base class
public:
Geometry( );
virtual voidDraw( Window *pWnd ) = 0; // abstract operation
protected:
int xPos, yPos; COLORREF color; };
classGroup : publicGeometry { public:
Group( ); ~Group( );
virtual voidDraw( Window *pWnd ); // override
private:
Geometry **ppGeo; // pointer container
int geoCount; };
Chương : Các khái niệm 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)
đố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 cách đệquy đối tượng
Có góc nhìn vềtính báo gộp : ngữnghĩa & thực
O1 O2
O3
Góc nhìn ngữnghĩa Góc nhìn hiện thực
O1
O2
O3
(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
Ví dụ về bao gộp - VC++
classGeometry { // abstract base class
public:
Geometry( ); ~Geometry( );
virtual voidDraw( Window *pWnd ) = 0; // abstract operation
protected:
int xPos, yPos; double xScale, yScale; COLORREF color; };
classGroup : publicGeometry { public:
Group( ); ~Group( );
virtual voidDraw( Window *pWnd ); // override
private:
Geometry **ppGeo; // =Geometry* ppGeo[n];
int geoCount; };
Chương : Các khái niệm 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 phép gọi tác vụ đến đối tượng từ1 tham khảo
Thông điệp bao gồm 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 phương tiện giao tiếp (hay tương tác) đối tượng
(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
Tính đa xạ (Polymorphism)
Cùng lệnh gởi thông điệp đến đối tượng thông qua tham khảo ởvịtrí/thời điểm khác có thểkích hoạt việc thực thi tác vụkhác đối tượng khác
T1 p1; // C1 C2 class Java 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( );ở vịtrí khác kích hoạt tác vụkhác class khác
Chương : Các khái niệm 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 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 tác vụcủa B vàứng với tác vụcủa type B :
Tồn tác vụcùng tên A
danh sách tham sốcủa tác vụ tương ứng phải vềsố lượng tham số
kiểu đối sốOUThay giá trịreturn tác vụtrong A phải tương thích với kiểu đối số tương ứng B
kiểu đối sốINcủa tác vụtrong B phải tương thích với kiểu đối số tương ứng A
kiểu đối sốINOUTphải trùng với kiểu đối số tương ứng 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
(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
Tính tổng quát hóa (Generalization)
Có ngữnghĩa khác tính tổng qt hóa :
class tổng qt hóa cho phép sản sinh tựđộng class bình thường, class bình thường tựnó chỉcó thểtạo đối tượng Thường dùng ngữnghĩa giai đoạn lập trình ngược với tính thừa kế: supertype/superclass type/class
tổng quát hóa của Thường dùng ngữnghĩa giai đoạn phân tích/thiết kếphần mềm
Chương : Các khái niệm 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 đối tượng độc lập với thời gian sống phần tử(ứng dụng, đối tượng khác) tạo
Đối tượng phải tồn tạikhi cịn tham khảo đến hệthống
Đối tượng phải bịxóakhi khơng cịn tham khảo đến nó, thời điểm đối tượng rác Việc xác định xác đối tượng có phải rác hay khơng việc phức tạp, code ứng dụng không phép thực hiện, công việc hệ thống thông qua module 'garbage collection'
thường trú vĩnh Mức độcó thểlà session máy ảo (JVM) hay lâu dài (thông qua đĩa cứng, CDROM)
(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
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 đối tượng độc lập sống chung tương tác lẫn Các đặc điểm mơ hình hướng đối tượng :
Bao đóng : đối tượng bao gồm sốdữliệu tác vụ Các tác vụthiết lập nên hành vi đối tượng Các đối tượng loại
được đặc tảbằng class
Các đối tượng độc lập tương tác lẫn cách gởi thông
điệp
Giữa class/đối tượng có thểtồn 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ú : đối tượng tồn cịn tham khảo
đến
Chương : Các khái niệm 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 Chương 3
CƠ CHẾ DỊCH MÃ HƯỚNG ĐỐI TƯỢNG
SANG MÃ MÁY
Chương 3: Cơ chếdịch mã OOP sang mã máy
(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 tập đối tượng sống độc lập tương tác lẫn cần thiết
Các đối tượng thuộc sốloại định (n)
Mỗi loại đối tượng miêu tảbởi type & class Mã nguồn chương trình tập nđịnh nghĩa type & class Dịch chương trình OOP qui trình lặp dịch n type & n class Ta sẽmiêu tảqui trình dịch type class chương
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 type chỉdừng lại việc xây dựng ngữnghĩa type tương ứng đểphục vụviệc kiểm tra kiểu chương trình dịch, chứkhơng tạo code mã máy Chỉcần bước : duyệt từvựng, phân tích cú pháp phân tích
ngữnghĩa
Nên dùng cơng cụhỗtrợ LEX, YACC cho bước duyệt từ vựng & phân tích cú pháp
Dịch abstract type
(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 công việc chương trình dịch hướng đối tượng
Gồm cơng việc : dịch thuộc tính dữliệu dịch method (hay 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 tạo mã
Nên dùng công cụhỗtrợ LEX, YACC cho bước duyệt từ vựng & phân tích cú pháp
Dịch class
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);
};
Dịch thuộc tính dữ liệu
typedef struct {
// import field từcấu trúc //được sinh từC0
// field tươngứng với C1 double C1_d;
int C1_i;
// field dữliệu điều khiển // tựtạo chương trình dịch void (*pvfaddr)() ;
} C1;
(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
Dịch thuộc tính dữ liệu (tt)
class →1 record dữliệu cổđiển tên class →tên record
copy field dữliệu cấu trúc sinh từviệc dịch class cha Chuyển thuộc tính class thành field record,
“tuyệt đối hóa” tên thuộc tính đểtránh nhặp nhằng thêm 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 mã máy thành vùng nhớliên tục có độdài đội dài record
- khai báo biến C1 o1; C1_o1 db dup (sizeof(C1))
truy xuất 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],
(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);
};
Tạo bảngđịa chỉ các tác vụ
0 "proc1" C0_proc1 "proc2" C1_proc2
2 "proc3" C0_proc3
3 "proc4" C1_proc4 "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
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 số tác vụcủa class 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 thơng tin : 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 địa chỉcủa tác vụbịoverride
Thêm vào tác vụmới định nghĩa class hành
(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);
};
Dịch method
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);
};
1 2
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 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 : miêu tảtham khảo đến đối tượng mà hàm sẽtruy xuất 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 thêm tham sốđầu tiên gởi thôngđiệp gồm bước :
kiểm tra, tìm, loadđối tượng 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 bảng (i)
gọi gián tiếp method thông qua địa chỉphần tửthứi bảng
(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
Tối ưu hóa code tạo ra
Có vấn đềlớn q trình dịch 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 gọi gián tiếp qua địa chỉtrong bảng
số chương trình dịch tìm cách tối ưu hóa vấn đềtrên slide sau tối ưu hóa chương trình dịch 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 (tt)
C++, tất cảđối tượng tạm thời gắn chặt vào ứng dụng →bảngđịa chỉcác method đối tượng nằm sẵn không gian ứng dụng
Mỗi lần tạo đối tượng mới, biến pvftbl đối tượng gán địa chỉbảng địa chỉcác method →không cần thực bước xửlý lệnh gởi thông điệp đến đối tượng
C++ chỉdùng mối quan hệcon/cha kiểm tra kiểu →cơng việc (tìm chỉsốtác vụ) làm thời điểm dịch thay thời điểm gởi thông điệp 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ó virtual function giải theo chế đa xạ
→bảng địa chỉchỉchứa hàm virtual class, function khác dịch lời gọi hàm trực tiếp
(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
Tối ưu hóa code tạo (tt)
giá phải trảcủa việc tốiưu hóa 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 sai sẽgây lỗi chạy, mà người khó lịng quyếtđịnh xác
tínhđa xạchỉ cácđối tượng có mối quan hệ con/cha,ởđó thứtựcácđịa chỉmethod class bảngđịa chỉluôn giống thứtựcác method tươngứng class cha, nhiên class bất kỳthì khơng thể đảm bảo →kiểm tra kiểu C++ nâng cấp lên 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 Chương 4
TỔNG QUÁT VỀ MỨC ĐỘ HỖ TRỢ
OOP CỦA VC++ & JAVA
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
(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
4.1 Ngơn ngữ Visual C++ Chỉhỗtrợclass, không hỗtrợabstract type
2 Cho phépđa thừa kế& Override method thừa kế Dùng 'abstract class' đểđịnh nghĩa interface
4 Tầm vực truy xuất thành phần Đa xạcó chọn lọc nhờ'virtual function' Chỉhỗtrợcác đối tượng tạm
7 Có thểđịnh nghĩa “overloaded function”
Chương : Tổng quát vềmức độhỗtrợOOP 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 đối tượng, lệnh interface hay type đểđịnh nghĩa type đối tượng
Dùng classđểđịnh nghĩa kiểu cho biến, 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 vùng nhớchứa đối tượng
C1* p1; // biến p1 vùng nhớchứa pointer tới đối tượng
⇒
Nếu class có chứa thuộc tính đối tượng thuộc kiểu class đối tượng tương ứng sẽlà đối tượng gộp vật lý đối tượng khác Nếu class có chứa thuộc tính đối tượng thuộc kiểu class
pointer đố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
(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
Đa thừa kế
Đa thừa kế định nghĩa class, hấp dẫn cho người lập trình chi phí thực cao :
dễgây việc trùng tên thành phần nằm class cha khác thừa kếcho class ⇒phải giải vấn đềtrùng tên tránh nhặp nhằng việc truy xuất chúng class có thểchứa nhiều class cha trùng ⇒phải giải việc
duplicate thành phần class cha trùng (dư thừa tính quán) ⇒VC++ đềnghịdùng "virtual base class" đểtối
ưu hóa bộnhớđối tượng
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
a 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 50
Đa thừa kế Phát biểu :
class NguoiCa : publicNguoi, publicCa { };
sẽtạo đối tượng NguoiCa có cấu trúc dữliệu theo hình a slide trước ⇒các thuộc tính class Sinhvat nhân tồn lần ở2 vịtrí khác đối tượng NguoiCa
⇒ dư thừa dữliệu tính qn dữliệu Cịn phát biểu :
class NguoiCa : public virtualNguoi, public virtual Ca { }; sẽtạo đối tượng NguoiCa có cấu trúc dữliệu theo hình b slide trước ⇒các thuộc tính class Sinhvat chỉtồn lần đối tượng NguoiCa ⇒khắc phục dư thừa liệu khơng tính qn dữliệu
(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
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 không cho phép dùng class đểđịnh nghĩa kiễu cho biến hay thuộc tính (trừ pointer) Một “abstract class” class chứa "pure virtual funtion“, "pure virtual funtion“ virtual function
được gán =0 (nghĩa khơng có phần thực kèm theo)
classGeometry { // abstract class
public:
Geometry( ); ~Geometry( );
virtual voidDraw( Window *pWnd ) = 0; // pure virtual function
protected:
int xPos, yPos;
double xScale, yScale; COLORREF color;
};
Chương : Tổng quát vềmức độhỗtrợOOP 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 đối tượng miêu tảbởi từkhóa sau :
private: thành phần bịche dấu hoàn toàn
protected: chỉche dấu bên 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: class mà hàm có thểtruy xuất tự thành phần class hành
Friend function: function cổđiển có thểtruy xuất tựdo thành phần class hành
Có thểhạn chếtầm vực thành viên class cha thừa kế
class C : protected A, private B {…}
(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
Hỗ trợ tính đa xạ có chọn lọc
Định nghĩa 'virtual function' muốn áp dụng tính đa xạtrong lệnh gởi thơng điệp u cầu hàm thực thi
Tất cảcác 'virtual function' class quản lý danh sách "virtual function table" Danh sách field liệu nằm đối tượng tạo tựđộng chương trình dịch
địa chỉfunction
địa chỉfunction
địa chỉfunction
địa chỉfunction
địa chỉfunction
Chương : Tổng quát vềmức độhỗtrợOOP 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ạm thời không gian process
Tham khảođến đối tượng thực chất pointercục bộtrong không gian làm việc process
Chương trình phải tựviết code cho hoạt động save/restore đối tượng 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ả 'Serialization'
Có quyền'override'bất cứmethod bất kỳfunction class cha
Cho phépđịnh nghĩa hàm'overloaded': tên 'signature' khác
(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
Skeleton định nghĩa class
classGeometry : Object { // == class Geometry : public Object { public:
Geometry( ); ~Geometry( );
virtual voidDraw( Window *pWnd ); // virtual method
BOOL IsDisplayed(void);
protected:
COLORREF color;
private :
int xPos, yPos;
double xScale, yScale;
};
classPoint : Geometry {}; classLine : Geometry { }; classPolygon : Geometry { }; classRectangle : Geometry { };
Chương : Tổng quát vềmức độhỗtrợOOP 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
Cấu trúc chương trình Dialog based đơn giản
InitInstance()
DoModal()
CProgramApp
CProgramDlg
(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
Cấu trúc chương trình SDI đơn giản
InitInstance()
CProgramApp
CSingleDocTemplate CMainFrame
CProgramView CProgramDoc
Chương : Tổng quát vềmức độhỗtrợOOP 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
Cấu trúc chương trình MDI đơn giản
InitInstance()
CProgramApp
CMultiDocTemplate CChildFrame
CProgramView CProgramDoc
(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
4.2 Ngôn ngữ Java Hỗtrợđầy đủ'interface' (abstract type) class Hỗtrợđơn thừa kế
3 Có thểdùng 'abstract class' đểđịnh nghĩa interface Tầm vực truy xuất thành phần
5 Hỗtrợ package Đa xạđầy đủ
7 Chỉhỗtrợđối tượng tạm session JVM Override function thừa kế
9 Có thểđịnh nghĩa overloaded function
Chương : Tổng quát vềmức độhỗtrợOOP 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 góc nhìn : phát biểu interface định nghĩa góc nhìn sử dụng phát biểu class định nghĩa góc nhìn thực ⇒ 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, nhiên tập qn thói quen, người lập trình chủyếu dùng class để định nghĩa kiểu cho 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 biến chứa tham khảo đến đối tượng, đối tượng tạo không gian quản lý máy ảo JVM (chứ không gian ứng dụng)
Hỗ trợ Class Interface
(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 cách tường minh, khơng cần xóa đối tượng (việc nên đểcho module dọn rác JVM thực đểđảm bảo tính đắn an tồn)
classC1 extendsRootClass { }
C1 o1; // o1 chứa tham khảo đến đối tượng C1
o1 = New C1; //tạo đối tượng 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 việc dùng tên class Thí dụvề ứng dụng hiển thịđồng hồ thời gian thực chương sẽcho ta thấy rõ điều
2.Đơn thừa kế định nghĩa interface định nghĩa class⇒mối quan hệthừa kếgiữa interface/class đơn giản, dễhiện thực
Tạo & xóa đối tượng
Chương : Tổng quát vềmức độhỗtrợOOP 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
Hỗ trợ abstract class
3 Tiếp tục hỗtrợkhái niệm "abstract class" đểđịnh nghĩa class chứa thông tin interface không cho phép 'instanciate' đối tượng Người lập trình có thểdùng class 'abstract class' để đặc tảkiểu cho biến đểthừa kếtrong việc định nghĩa class
classabstract Geometry { // abstract class
protected int xPos, yPos;
protected double xScale, yScale;
protected COLORREF color;
public abstract Draw(Graphics g); // abstract function
};
Abstract class có thểchứa đầy đủcác thực bên trong, thường chứa 'abstract function'
(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
Tầm vực truy xuất thành phần
4 Tầm vực truy xuất thành phần đối tượng : private: thành phần bịche dấu hoàn toàn
protected: che dấu bên cho phép cácđối tượng con, cháu, chắt truy xuất
public: cho phép tất cảmọi nơi truy xuất
friendly: cho phép phần tử package truy xuất Đây tầm vực mặc định khơng có từkhóa tầm vực tường minh
Chương : Tổng quát vềmức độhỗtrợOOP 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 class đơn vịquản lý tầm vực java, 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 file mã nguồn thuộc package, tên package đặc tảtrong phát biểu package, phát biểu phải nằm ởđầu file mã nguồn Nếu khơng có class file mã nguồn sẽđược chứa package mặc định (khơng có tên)
Nhiều file source có thểđược dịch lưu package
Hỗ trợ package
(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
Hỗ trợ đầy đủ tính đa xạ
6 Tất cảcác tác vụmà có thểđược gọi từbên (public, protected, friendly) quản lý danh sách "public function table“ đối tượng
Địa chỉfunction
Địa chỉfunction
Địa chỉfunction
Địa chỉfunction i
Địa chỉfunction n
Chương : Tổng quát vềmức độhỗtrợOOP 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
Các đối tượng đều 'tạm thời'
7 Cácđối tượng chỉtồn tạm thời session chạy JVM Coe ứng dụng phải tạo đối tượng muốn dùng nó, khơng cần phải xóa đối tượng.Đối tượng sẽtồn cịn tham khảo đến khơng gian session JVM Module Garbage Collection JVM sẽchịu trách nhiệm phát đối tượng ‘rác’ xóa khỏi bộnhớJVM
8 Có quyền 'override' bất kỳfunction class cha Class cha có thểquyết định khơng cho class override tác vụcủa cách dùng từ khóa finaltrong lệnh định nghĩa tác vụ
9 Cho phép định nghĩa hàm 'overloaded' : tên 'signature' khác
(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
Thí dụ về chương trình Java
import java.net.*; public class getnet {
public static void main(String args[]) { try {
if(args.length!=1) {
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 : Tổng quát vềmức độhỗtrợOOP 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
Thí dụ về chương trình Java
12.34.25 AlarmClock
GUIClock
wakeup() <<chứa>>
(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
Thí dụ về các class Java
public classAlarmClock {
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 : Tổng quát vềmức độhỗtrợOOP 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 letMeSleepFor(Sleeper s, long time) {
int index = findNextSlot(); if (index == NOROOM) {
return false; } else {
sleepers[index] = s; sleepFor[index] = time;
new AlarmThread(index).start(); return true;
} }
//còn tiếp ởslide kế
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
(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 findNextSlot() { for (int i = 0; i < MAX_CAPACITY; i++) {
if (sleepFor[i] == UNUSED) return i;
}
return NOROOM; }
private synchronized void wakeUpSleeper(int sleeperIndex) { sleepers[sleeperIndex].wakeUp();
sleepers[sleeperIndex] = null; sleepFor[sleeperIndex] = UNUSED; }
//còn tiếp ởslide kế
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
Thí dụ về các class 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 72 private class AlarmThreadextends Thread {
int mySleeper;
AlarmThread(int sleeperIndex) { super();
mySleeper = sleeperIndex; }
public void run() { try {
sleep(sleepFor[mySleeper]); } catch (InterruptedException e) {} wakeUpSleeper(mySleeper); }
} }
//hết phần đặc tảclass AlarmClock
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
(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
public interface Sleeper{ 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;
public class GUIClockextendsAppletimplements Sleeper{ private AlarmClock clock;
public void init() {
clock = new AlarmClock(); }
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
Thí dụ về các class 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 74
public void start() {
clock.letMeSleepFor(this, 1000); }
public void paint(Graphics g) {
Calendar cal = Calendar.getInstance(); Date date = cal.getTime();
DateFormat dateFormatter = DateFormat.getTimeInstance(); g.drawString(dateFormatter.format(date), 5, 10);
}
public voidwakeUp() { repaint();
clock.letMeSleepFor(this, 1000); }
}
Chương : Tổng quát vềmức độhỗtrợOOP VC++ & Java
(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
MƠN KỸ THUẬT LẬP TRÌNH
Chương 5
ĐẶC TẢ CLASS & CÁC TÍNH CHẤT CƠ BẢN
CỦA ĐỐI TƯỢNG TRONG VC++
Chương :Đặc tảclass & tính chất đối tượng 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 :Đặc tảclass & tính chất đối tượng VC++
Thông tin chi tiết thực hành số6
(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
MƠN KỸ THUẬT LẬP TRÌNH
Chương 6
ĐẶC TẢ CLASS & CÁC TÍNH CHẤT CƠ BẢN
CỦA ĐỐI TƯỢNG TRONG JAVA
Chương :Đặc tảclass & tính chất đối tượng 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 thực hành số7
Đặc tả interface (abstract type) Java
(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
MƠN KỸ THUẬT LẬP TRÌNH
Chương 7
GỌI HÀM, GỞI THÔNG ĐIỆP & ĐA XẠ TRONG VC++
Chương : 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++, lệnh thực thi phải nằm thân hàm Ta phân biệt loại hàm :
Hàm cổđiển, tồn ởcấp ngồi (khơng thuộc class nào) Hàm class đối tượng đó, ta tạm dùng thuật ngữ "tác
vụ" đểnói vềloại hàm
Trong thân hàm cổđiển, xét lệnh sau : function1( );
::function1( );
Hai lệnh gọi lời gọi hàm cổ điển function1() Hàm function1() phải tồn module phần mềm module thư viện mà phần mềm sẽliên kết đến
Tổng quát về gọi hàm VC++
(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 tác vụ, xét lệnh sau : ::function1( );
Lệnh lời gọi hàm cổđiển function1() Hàm function1() phải tồn module phần mềm module thư viện mà phần mềm sẽliên kết đến
Trong thân tác vụ, xét lệnh sau : function1( );
Nếu function1() không định nghĩa class đối tượng tương ứng lệnh lời gọi hàm cổđiển function1() Hàm function1() phải tồn module phần mềm module thư viện mà phần mềm sẽliên kết đến
Tổng quát về gọi hàm VC++
Chương : 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ó cách truy xuất đối tượng khác : 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ả thân đối tượng MyClass (1 cách tường
minh, xác định không nhầm lẫn với đối tượng thuộc class khác Cú pháp gọi tác vụthông qua biến đối tượng :
obj.function1( );
lệnh dịch thành lời gọi hàm function1( ) class MyClass thời điểm dịch Do thời điểm chạy, biến obj chứa đối tượng khác lệnh obj.function1( ) ln lời gọi hàm function1( ) class MyClass Khơng có đa xạ trường hợp Ngữ nghĩa lời gọi hàm có thểđúng/khơng với u cầu người lập trình thời điểm/vịtrí chạy
Tổng quát về gọi hàm VC++
(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 tác vụ, xét lệnh sau : function1( );
Nếu function1() định nghĩa class đối tượng tương ứng lệnh sẽđược chuyển thành lệnh :
this->function1( );
trong this tên biến tham khảo đến đối tượng hành Lệnh this->function1( ); trường hợp đặc biệt lệnh : pobj->function1( );
trong pobj tên biến tham khảo đến đối tượng định nghĩa trước
Bây giờchúng ta khảo sát chi tiết vềviệc xửlý lệnh
pobj->function1( );trong VC++
Tổng quát về gọi hàm VC++
Chương : 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 định nghĩa sau :
MyClass *pobj;
Việc xửlý lệnh gởi thông điệp pobj->function1( ); sau :
Kiểm tra xem function1 có phải làtác vụvirtualcủa class MyClass khơng? Nếu function1 tác vụ virtual, lệnh gởi thông điệp dịch lời gọi hàm tường minh đến hàm function1 class MyClass (bất chấp thời điểm chạy biến pobj tham khảo đến
đối tượng thuộc class khác) Như vậy, cách giải khơng tạo tính đa xạcho lời gởi thơng điệp
Nếu function1 tác vụ virtual, lệnh gởi thông điệp dịch
đoạn mã máy thực việc tìm liên kết động tới hàm fucntion1 nhờ bảng địa hàm virtual đối tượng tham khảo biến pobj Như vậy, cách giải tạo tính đa xạ cho lời gởi thông điệp
Xử lý lệnh gởi thông điệp VC++
(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 thực hành số8
Thí dụ củng cố nội dung chương 7
Chương : 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
MƠN KỸ THUẬT LẬP TRÌNH
Chương 8
GỌI HÀM, GỞI THÔNG ĐIỆP & ĐA XẠ TRONG JAVA
(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ó cách truy xuất đối tượng : thông qua biến tham khảo đến đối tượng Biến tham khảo định nghĩa theo 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, lệnh thực thi phải nằm thân tác vụ class
Tổng quát vềgởi thông điệp Java
Chương : 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 tác vụ, xét lệnh sau : function1( );
Nếu function1() định nghĩa class đối tượng tương ứng lệnh sẽđược chuyển thành lệnh :
this.function1( );
trong this tên biến tham khảo đến đối tượng hành Lệnh this.function1( ); trường hợp đặc biệt lệnh : pobj.function1( );
trong pobj tên biến tham khảo đến đối tượng định nghĩa trước
Bây giờchúng ta khảo sát chi tiết vềviệc xửlý lệnh
pobj.function1( );trong Java
Tổng quát vềgởi thông điệp Java
(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 định nghĩa 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 tác vụ private, lệnh gởi thông điệp chỉđược xử lý pobj = this Máy sẽdịch lời gọi hàm tường minh đến hàm function1 class FuncClass (class chứa hàm function1), bất chấp thời
điểm chạy biến this tham khảo đến đối tượng thuộc class khác Như vậy, cách giải khơng tạo 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 dịch đoạn mã máy thực việc tìm liên kết động tới hàm fucntion1 nhờ bảng địa chỉcác tác vụ đối tượng tham khảo biến pobj Như vậy, cách giải tạo tính đa xạ cho lời gởi thông điệp
Xử lý lệnh gởi thông điệp Java
Chương : 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 thực hành số9
Thí dụ củng cố nội dung chương 8
(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
MƠN KỸ THUẬT LẬP TRÌNH
Chương 9
TỔNG QUÁT HÓA TRONG XÂY DỰNG
HÀM & CLASS
Chương : Tổng quát hóa 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
T nh t ̉ng quat hoa (Generalization)
Như ta biết, xây dựng ứng dụng theo hướng đối tượng xây dựng class có đối tượng dùng đểphục vụ ứng dụng Cơng việc xây dựng class xây dựng method cấu thành interface class Có thể có nhiều method class khác dùng giải thuật (đoạn lệnh thực thi) tác động liệu có số lượng cấu trúc (kiểu) khác Tương tự có nhiều class khác cung cấp interface giống tác động dữliệu có số lượng cấu trúc khác Thí dụ ta cần method hoán vị số nguyên, method hoán vị
chuỗi, method hoán vị 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…
(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
T nh t ̉ng quat hoa (tt)
Hàm tổng quát hóa (function template) cho phép ta đặc tả tập hàm mà dùng chung đoạn lệnh thực thi tác động liệu thuộc kiểu hay class khác và/hoặc với số lượng khác
Class tổng quát hóa (class template) cho phép ta đặc tả tập class có tính chất giao diện giống tác động dữliệu thuộc kiểu hay class khác và/hoặc với số lượng khác Class tổng quát hóa cho phép sản sinh tựđộng class bình thường, class bình thường tự chỉcó thểtạo đối tượng
Chương : Tổng quát hóa 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 hàm mà dùng chung đoạn lệnh thực thi tác động liệu thuộc kiểu hay class khác Thí dụhàm IntSwap() sau :
void IntSwap(int& a, int& b ) { int c = a;
a = b; b = c; }
chỉcho phép swap số nguyên, template MySwap() sau : template <class T> void MySwap( T& a, T& b ) {
T c (a); a = b; b = c; }
định nghĩa họcác hàm swap dữliệu có kiểu
Function template
(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 cả: int i, j;
char k;
MySwap(i, j); //Ok
MySwap (i, k); //Sai khác kiểu
Ta đặc tảtham sốrõ ràng gọi hàm “template function”, thí dụ:
MySwap<int>(i,j); //tạo hàm MySwap (int&, int&) gọi với (i,j)
Function template (tt)
Chương : Tổng quát hóa 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ả tập class mà dùng chung interface cấu trúc dữliệu tác động liệu thuộc kiểu hay class khác Thí dụ class IntStack sau :
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 > ) StackBuffer[ cItems] = item; else throw "Stack overflow error.";
return; }
Class template
Chương : Tổng quát hóa xây dựng hàm & class
int IntStack::pop ( void ) { if ( cItems < 100)
return StackBuffer[cItems++]; else
(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 tả slide trước tạo đối tượng stack chứa số nguyên Nếu muốn stack chứa sốthực, ta phải định nghĩa class khác (gần giống với class IntStack) Tương tự, muốn stack chứa chuỗi, ta lại phải định nghĩa class khác (gần giống với class IntStack)
Class template cho phép ta khắc phục phiền hà
Class template
Chương : Tổng quát hóa 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
Cú pháp khai báo class template :
template-declaration :
template <template-argument-list >declaration template-argument-list :
template-argument
template-argument-list ,template-argument template-argument :
type-argument argument-declaration type-argument :
classidentifier
typenameidentifier declaration :
là đặc tảclass bình thường có nhiều vịtrí có dùng tham số
template
Class template
(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 > )
StackBuffer[ cItems] = item; else
throw "Stack overflow error."; return;
}
Class template (tt)
Chương : Tổng quát hóa 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
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 : Tổng quát hóa xây dựng hàm & class
(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 đểbiết chi tiết, cụthểcủa template MFC dùng phổbiến CArray CList
Chương : Tổng quát hóa xây dựng hàm & class
Class template (tt)
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 liệu biến thuộc kiểu cổ điển (int, double, char[], ) rấr dễ nội dung biến không chứa tham khảo đến thành phần khác Ngược lại, việc đọc/ghi nội dung đối tượng thường khó khăn đối tượng chứa nhiều tham khảo đến đối tượng khác đối tượng tham khảo vịng lẫn Để hỗtrợphần việc đọc/ghi nội dung đối tượng, VC++ đềnghịkỹthuật "Serialization"
Đểđịnh nghĩa class "serializable", ta cần thực tác vụ:
1 định nghĩa class 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 Định nghĩa hàm constructor không tham số
5 Dùng macro IMPLEMENT_SERIALtrong thực class Định nghĩa class "serializable"
(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, )
//2 Override hàm Serialize
void MyClass::Serialize( CArchive& ar ) { }
Chương : Tổng quát hóa xây dựng hàm & class
Định nghĩa class "serializable"
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 class cha
CObject::Serialize(ar);
//2 gọi hàm Serialize đối tượng chứa vật lý
ba.Serialize( ar );
//3 Serialize đối tượng tạo động 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 : Tổng quát hóa xây dựng hàm & class
(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 đối tượng thuộc class "serializable", ta cần thực tác vụ : Đị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" Gọi tác vụSerialize cần ghi đối tượng Đó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();
Ghi đối tượng
Chương : Tổng quát hóa 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 đối tượng thuộc class "serializable", ta cần thực tác vụ : Đị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" Gọi tác vụSerialize cần ghi đối tượng Đó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();
Đọc lại đối tượng
(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
Thí dụ về đọc/ghi đối tượng
Chương : Tổng quát hóa xây dựng hàm & class
intB1 = dblB2 = 2.345 ba
pba pba1
intA1 = dblA2 = 1.234 pab
intA1 = dblA2 = 3.456 pab
intA1 = dblA2 = 4.567 pab
đối tượng class B