107
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 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

MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

  • Upload
    claus

  • View
    59

  • Download
    0

Embed Size (px)

DESCRIPTION

MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG. Đối tượng : SV đại học chính quy ngành CNTT. Tài liệu tham khảo : Tập slide bài giảng & thực hành của môn học này. The C++ Programming Language (special 3rd edition), Bjarne Stroustrup, 2000. 3 CD MSDN trong Microsoft Visual Studio. - PowerPoint PPT Presentation

Citation preview

Page 1: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 2: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 3: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 3

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 các tính chất của lập trình cấu trúc

Page 4: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 5: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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)

Công việcA1

Công việcA2

Công việcAn

Công việcA11

Công việcA12

Công việcA1n

Công việcAn1

Công việcAn2

Công việcAnn

...

... ... ... ...

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

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

Page 6: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 6

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 modulechar 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

Page 7: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 datamodule (package)

local data of module

local data of function

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

Page 8: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 9: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 10: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.hextern int A_intA;typedef struct {...} A_Type1;#define A_PI 3.14159int A_func1(int a, double b);

//đặc tả interface của module B : serverextern int B_intA;typedef struct {...} B_Type1;#define B_MAXLEN 1024int B_func1(char c, char* d);

#include A.h//hiện thực của module Aint 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 Bint B_intA;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

Page 11: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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#endifextern int A_intA;typedef struct {...} A_Type1;#define A_PI 3.14159int A_func1(int a, double b);

//đặc tả interface của module B#define _BH#ifndef _AH#include A.h#endifextern int B_intA;typedef struct {...} B_Type1;#define B_PI 3.14159int B_func1(char c, char* d);

#include A.h//hiện thực của module Aint 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 Bint 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

Page 12: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 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

Page 13: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ượng2.2 Đối tượng, thuộc tính, tác vụ.2.3 Abstract type và class.2.4 Tính bao đóng.2.5 Tính thừa kế & cơ chế 'override'.2.6 Tính bao gộp.2.7 Thông điệp, tính đa xạ và kiểm tra kiểu.2.8 Tính tổng quát hóa.2.9 Tính thường trú.

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

Page 14: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

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

Page 15: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 16: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 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)

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

Page 17: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ên tá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ăng của tác vụ (thường ở dạng chú thích).

Ta dùng tên của abstract type (chứ không phải class) để đặc tả kiểu cho biến, thuộc tính, tham số hình thức.

User không cần quan tâm đến class (hiện thực cụ thể) của đối tượng.

Page 18: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 trong JavaJava 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 DigitalClockObject = new AnalogClock(); //biến object giữ tham khảo đến 1 đối tượng AnalogClock

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

Page 19: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Page 20: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 constructorprotected:

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?

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

Page 21: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 function và sự hiện thực của chúng.

Java, VC++ cung cấp các từ khóa private, protected, public để xác định tầm vực truy xuất từng thành phần của class.

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

Page 22: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 23: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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++class Geometry { // abstract base classpublic:

Geometry( );virtual void Draw( Window *pWnd ) = 0; // abstract operation

protected:int xPos, yPos;COLORREF color;

};class Group : public Geometry {public:

Group( );~Group( );virtual void Draw( Window *pWnd ); // override

private:Geometry**ppGeo; // pointer containerint geoCount;

};

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

Page 24: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

O1O2

O3

Góc nhìn ngữ nghĩa Góc nhìn hiện thực

O1

O2

O3

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

Page 25: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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++

class Geometry { // abstract base classpublic:

Geometry( );~Geometry( );virtual void Draw( Window *pWnd ) = 0; // abstract operation

protected:int xPos, yPos;double xScale, yScale;COLORREF color;

};

class Group : public Geometry {public:

Group( );~Group( );virtual void Draw( Window *pWnd ); // override

private:Geometry **ppGeo; // =Geometry* ppGeo[n];int geoCount;

};

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

Page 26: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 27: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 p1p1.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 p1p1.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

Page 28: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ố OUT hay giá trị return của tác vụ trong A phải

tương thích với kiểu của đối số tương ứng trong B. kiểu đối số IN của tác vụ trong B phải tương thích với kiểu

của đối số tương ứng trong A. kiểu đối số INOUT phải trùng với kiểu của đối số tương ứng

trong B. quan hệ so trùng hay quan hệ con/cha (sub/super) là trường

hợp đặc biệt của quan hệ tương thích tổng quát.

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

Page 29: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 30: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ại khi còn ít nhất 1 tham khảo đến nó

trong hệ thống. Đối tượng phải bị xóa khi không còn tham khảo nào đến nó,

vì tại thời điểm này đối tượng là rác. Việc xác định chính xác 1 đối tượng có phải là rác hay không là 1 việc phức tạp, code ứng dụng không được phép thực hiện, đây là công việc của hệ thống thông qua module 'garbage collection'.

thường trú không phải là vĩnh hằng. Mức độ có thể là 1 session của máy ảo (JVM) hay lâu dài (thông qua đĩa cứng, CDROM).

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

Page 31: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 được đặc tả bằng 1 class.

Các đối tượng độc lập và tương tác lẫn nhau bằng cách gởi thông điệp.

Giữa các class/đối tượng có thể tồn tại quan hệ bao gộp, thừa kế, tổng quát hóa.

Tính đa xạ : kết quả của sự kiểm tra kiểu chặt dựa vào mối quan hệ '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

Page 32: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ƯỢNGSANG MÃ MÁY

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

MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Page 33: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 34: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Dịch 1 abstract type

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

Page 35: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Dịch 1 class

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

Page 36: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ệutypedef 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

Page 37: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 38: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

cách định địa chỉ chỉ số :

- o1.i = 5; mov bx, C1_o1mov [bx+8], 5

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

Page 39: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

1 "proc2" C1_proc2

2 "proc3" C0_proc3

3 "proc4" C1_proc4

4 "proc5" C1_proc5

5 .... ...

fname faddrpvftbl

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

Page 40: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 41: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 1 methodint C1_proc1(C1* p, int i, double d) {C2 o2; C2 *p2;

// truy xuất thuộc tínhp->C1_i = i; p->C1_d = d;// gọi hàmC1_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ỉ methodfor (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

Page 42: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 43: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 44: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 45: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 46: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 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

Page 47: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Page 48: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 typeChỉ 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ượngC1* 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

Page 49: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

a. b.

Page 50: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 : public Nguoi, public Ca {...};

sẽ tạo ra các đối tượng NguoiCa có cấu trúc dữ liệu theo hình a. trong slide trước các thuộc tính trong class Sinhvat được nhân bản và tồn tại 2 lần ở 2 vị trí khác nhau trong đối tượng NguoiCa dư thừa dữ liệu và mất tính nhất quán dữ liệu.

Còn phát biểu : class NguoiCa : public virtual Nguoi, public virtual Ca {...};

sẽ tạo ra các đối tượng NguoiCa có cấu trúc dữ liệu theo hình b. trong slide trước các thuộc tính trong class Sinhvat chỉ tồn tại 1 lần trong đối tượng NguoiCa khắc phục được sự dư thừa dữ liệu và không mất tính nhất quán dữ liệu.

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

Page 51: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 classpublic:

Geometry( );~Geometry( );virtual void Draw( Window *pWnd ) = 0; // pure virtual function

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

Page 52: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 classTầ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

Page 53: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

đị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

Page 54: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ờiCác đối tượng chỉ tồn tại tạm thời trong không gian process.Tham khảo đến đối tượng thực chất là pointer cục bộ trong không gian làm việc của process.Chương trình phải tự viết code cho hoạt động save/restore đối tượng nếu muốn lưu giữ/dùng lại đối tượng.VC++ hỗ trợ hoạt động save/restore đối tượng nhờ khả năng 'Serialization'.Có quyền 'override' bất cứ method của bất kỳ function nào của class cha.Cho phép định nghĩa các hàm 'overloaded' : cùng tên nhưng 'signature' khác nhau.

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

Page 55: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 55

Skeleton định nghĩa classclass Geometry : Object { // == class Geometry : public Object {public:

Geometry( );~Geometry( );virtual void Draw( Window *pWnd ); // virtual methodBOOL IsDisplayed(void);....

protected:COLORREF color;....

private :int xPos, yPos;double xScale, yScale;...

};class Point : Geometry {};class Line : Geometry { .... };class Polygon : Geometry {....};class Rectangle : Geometry {....};....

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

Page 56: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 56

Cấu trúc 1 chương trình Dialog based đơn giản

InitInstance()

DoModal()

CProgramApp

CProgramDlg

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

Page 57: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 57

Cấu trúc 1 chương trình SDI đơn giản

InitInstance()

CProgramApp

CSingleDocTemplate

CMainFrame

CProgramView

CProgramDoc

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

Page 58: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 58

Cấu trúc 1 chương trình MDI đơn giản

InitInstance()

CProgramApp

CMultiDocTemplate

CChildFrame

CProgramView

CProgramDoc

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

Page 59: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

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ợ package6. Đa xạ đầy đủ.7. Chỉ hỗ trợ đối tượng tạm trong từng session JVM8. 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

Page 60: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 quán và thói quen, người lập trình chủ yếu vẫn dùng class để định nghĩa kiểu cho các biến, thuộc tính. Tuy nhiên dù dùng tên interface hay tên class định nghĩa biến đối tượng thì biến này vẫn chỉ chứa tham khảo đến đối tượng, còn đối tượng được tạo ra trong không gian quản lý của máy ảo JVM (chứ không phải trong không gian ứng dụng).

Hỗ trợ Class và Interface

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

Page 61: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 toàn).class C1 extends RootClass {...}C1 o1;// o1 chứa tham khảo đến đối tượng C1o1 = New C1; //tạo đối tượng mới và gán tham khảo vào biến đối tượngViệc dùng tên interface đặc tả kiểu cho biến, thuộc tính luôn có lợi hơn việc dùng tên class. Thí dụ về ứng dụng hiển thị đồng hồ thời gian thực trong chương này sẽ cho ta thấy rõ điều này.

2. Đơn thừa kế trong định nghĩa interface và định nghĩa class mối quan hệ thừa kế giữa các interface/class khá đơn giản, dễ hiện thực.

Tạo & xóa đối tượng

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

Page 62: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 62

Hỗ trợ abstract class3. Tiếp tục hỗ trợ khái niệm "abstract class" để định nghĩa class chỉ

chứa thông tin interface và không cho phép 'instanciate' đối tượng. Người lập trình chỉ có thể dùng class 'abstract class' để đặc tả kiểu cho các biến hoặc để thừa kế trong việc định nghĩa class con.class abstract Geometry { // abstract classprotected int xPos, yPos;protected double xScale, yScale;protected COLORREF color;...public abstract Draw(Graphics g); // abstract function...};Abstract class có thể chứa đầy đủ các hiện thực bên trong, nhưng thường chỉ chứa các 'abstract function'.

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

Page 63: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 các thành phần

4. Tầm vực truy xuất các thành phần trong đối tượng :private : thành phần bị che dấu hoàn toàn.protected : che dấu bên ngoài nhưng cho phép các đối tượng con, cháu, chắt... truy xuất.public : cho phép tất cả mọi nơi truy xuất.friendly : cho phép mọi phần tử trong cùng package truy xuất. Đây là tầm vực mặc định và không có từ khóa tầm vực tường minh.

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

Page 64: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 64

5. Package là đơn vị đóng gói các class và cũng là đơn vị quản lý tầm vực của java, mỗi package chứa nhiều class (ở dạng mã trung gian – mã bytecode).package graphics;public class Circle extends Graphic implements Draggable {

. . .

}Tất cả mọi phần tử được định nghĩa trong 1 file mã nguồn đều thuộc 1 package, tên package này được đặc tả trong phát biểu package, phát biểu này phải nằm ở đầu file mã nguồn. Nếu không có thì các class trong file mã nguồn sẽ được chứa trong package mặc định (không có tên).Nhiều file source có thể được dịch và lưu trong cùng 1 package.

Hỗ trợ package

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

Page 65: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 ngoài (public, protected, friendly) đều được quản lý trong 1 danh sách "public function table“ của đối tượng.

Địa chỉ function 1

Địa chỉ function 2

Địa chỉ function 3

Địa chỉ function i

Địa chỉ function n

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

Page 66: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ại tạm thời trong 1 session chạy JVM.

Coe của ứng dụng phải tạo ra đối tượng nếu muốn dùng nó, nhưng không cần phải xóa đối tượng. Đối tượng sẽ tồn tại 1 khi còn tham khảo đến nó trong không gian của 1 session JVM. Module Garbage Collection trong JVM sẽ chịu trách nhiệm phát hiện đối tượng ‘rác’ và xóa nó ra khỏi bộ nhớ JVM.

8. Có quyền 'override' bất kỳ function nào của class cha. Class cha có thể quyết định không cho các class con override tác vụ của mình bằng cách dùng từ khóa final trong lệnh định nghĩa tác vụ đó.

9. Cho phép định nghĩa các hàm 'overloaded' : cùng tên nhưng 'signature' khác nhau.

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

Page 67: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 Javaimport 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

Page 68: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.25AlarmClock

GUIClock

wakeup()

<<chứa>>

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

Page 69: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 class AlarmClock { private static final int MAX_CAPACITY = 10; private static final int UNUSED = -1; private static final int NOROOM = -1; private Sleeper[] sleepers = new Sleeper[MAX_CAPACITY]; private long[] sleepFor = new long[MAX_CAPACITY]; public AlarmClock () {

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

Page 70: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java

Thí dụ về các class Java

Page 71: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java

Thí dụ về các class Java

Page 72: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 72

private class AlarmThread extends 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 4 : Tổng quát về mức độ hỗ trợ OOP của VC++ & Java

Thí dụ về các class Java

Page 73: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 GUIClock extends Applet implements Sleeper { 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

Thí dụ về các class Java

Page 74: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 void wakeUp() { repaint(); clock.letMeSleepFor(this, 1000); }}

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

Thí dụ về các class Java

Page 75: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 5 :Đặc tả class & các tính chất cơ bản của đối tượng trong VC++

Page 76: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Đặc tả class trong VC++

Page 77: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 6 :Đặc tả class & các tính chất cơ bản của đối tượng trong Java

Page 78: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Đặc tả interface (abstract type) trong Java

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

Page 79: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 7 : Gọi hàm, gởi thông điệp & đa xạ trong VC++

Page 80: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 ngoài cùng (không thuộc class nào). Hàm trong 1 class đối tượng nào đó, ta tạm dùng thuật ngữ "tác

vụ" để nói về loại hàm này.Trong thân của 1 hàm cổ điển, xét lệnh sau :

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.

Tổng quát về gọi hàm trong VC++

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

Page 81: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Tổng quát về gọi hàm trong VC++

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

Page 82: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 luôn là lời gọi hàm function1(..) của class MyClass. Không có đa xạ trong trường hợp này. Ngữ nghĩa của lời gọi hàm như trên có thể đúng/không đúng với yêu cầu của người lập trình tại từng thời điểm/vị trí chạy nó.

Tổng quát về gọi hàm trong VC++

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

Page 83: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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++.

Tổng quát về gọi hàm trong VC++

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

Page 84: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ụ virtual củ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.

Xử lý lệnh gởi thông điệp trong VC++

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

Page 85: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Thí dụ củng cố nội dung chương 7

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

Page 86: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

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

Page 87: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ếnTrong Java, các lệnh thực thi đều phải nằm trong thân của 1 tác vụ nào đó của 1 class nào đó.

Tổng quát về gởi thông điệp trong Java

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

Page 88: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Tổng quát về gởi thông điệp trong Java

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

Page 89: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ụ private củ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.

Xử lý lệnh gởi thông điệp trong Java

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

Page 90: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Thí dụ củng cố nội dung chương 8

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

Page 91: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ỰNGHÀM & CLASS

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

Page 92: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 92

Tñnh töíng quaát hoáa (Generalization) Như ta đã biết, xây dựng một ứng dụng theo hướng đối tượng là

xây dựng các class có đối tượng được dùng để phục vụ ứng dụng đó. Công việc chính của xây dựng 1 class là xây dựng những method cấu thành interface của class đó. Có thể có nhiều method trong các class khác nhau dùng cùng một giải thuật (đoạn lệnh thực thi) nhưng tác động trên những dữ liệu có số lượng và cấu trúc (kiểu) khác nhau. Tương tự có thể có nhiều class khác nhau cung cấp cùng một interface giống nhau nhưng tác động trên những dữ liệu có số lượng và cấu trúc khác nhau.

Thí dụ ta cần method hoán vị 2 số nguyên, method hoán vị 2 chuỗi, method hoán vị 2 dãy,… Ta cần class quản lý danh sách n số nguyên, class quản lý m chuỗi, class quản lý k dãy…

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

Page 93: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

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

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

Slide 93

Tñnh töíng quaát hoáa (tt) Hàm tổng quát hóa (function template) cho phép ta đặc tả 1 tập

các hàm mà dùng chung đoạn lệnh thực thi nhưng tác động trên những dữ liệu thuộc kiểu hay class khác nhau và/hoặc với số lượng khác nhau.

Class tổng quát hóa (class template) cho phép ta đặc tả 1 tập các class có tính chất và giao diện giống nhau nhưng tác động trên những dữ liệu thuộc kiểu hay class khác nhau và/hoặc với số lượng khác nhau. Class tổng quát hóa cho phép sản sinh tự động các class bình thường, các class bình thường tự nó chỉ có thể tạo ra đối tượng.

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

Page 94: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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ỳ.

Function template

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

Page 95: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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); //OkMySwap (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)

Function template (tt)

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

Page 96: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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;}

Class template

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 throw "Stack underflow error.";}

Page 97: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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.

Class template

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

Page 98: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 1 class template :template-declaration :

template < template-argument-list > declarationtemplate-argument-list :

template-argumenttemplate-argument-list , template-argument

template-argument :type-argumentargument-declaration

type-argument :class identifiertypename 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.

Class template

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

Page 99: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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;}

Class template (tt)

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

Page 100: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Class template (tt)

Page 101: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Class template (tt)

Page 102: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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_SERIAL trong phát biểu đặc tả class. 4. Định nghĩa hàm constructor không tham số.5. Dùng macro IMPLEMENT_SERIAL trong hiện thực class.

Định nghĩa class "serializable"

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

Page 103: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 CObjectclass 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_SERIALIMPLEMENT_SERIAL(MyClass, CObject, 1 ) //2. Override hàm Serializevoid MyClass::Serialize( CArchive& ar ) { ...}

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

Định nghĩa class "serializable"

Page 104: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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

Định nghĩa hàm Serialize

Page 105: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 CArchive5. Đóng file//1. Định nghĩa đối tượng CFileCFile theFile;theFile.Open("c:\\persist.bin", CFile::modeCreate | CFile::modeWrite);//2. Định nghĩa đối tượng CArchiveCArchive archive(&theFile, CArchive::store);MyClass obj;//3. Gọi tác vụ Serialize để ghi đối tượngobj.Serialize(archive);//4. Gọi tác vụ Close để đóng đối tượng archivearchive.Close();//5. Gọi tác vụ Close để đóng đối tượng filetheFile.Close();

Ghi đối tượng

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

Page 106: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 CArchive5. Đóng file//1. Định nghĩa đối tượng CFileCFile theFile;theFile.Open("c:\\persist.bin", CFile::modeRead);//2. Định nghĩa đối tượng CArchiveCArchive archive(&theFile, CArchive::load);MyClass obj;//3. Gọi tác vụ Serialize để đọc lại đối tượngobj.Serialize(archive);//4. Gọi tác vụ Close để đóng đối tượng archivearchive.Close();//5. Gọi tác vụ Close để đóng đối tượng filetheFile.Close();

Đọc lại đối tượng

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

Page 107: MÔN LẬP TRÌNH H ƯỚNG ĐỐI TƯỢNG

Khoa Công nghệ Thông tinTrườ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 9 : Tổng quát hóa trong xây dựng hàm & class

intB1 = 2dblB2 = 2.345ba

pbapba1

intA1 = 1dblA2 = 1.234pab

intA1 = 3dblA2 = 3.456pab

intA1 = 4dblA2 = 4.567pab

đối tượng class Bđối tượng class A