Bài giảng môn Lập trình hướng đối tượng

pdf 108 trang hapham 3170
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng môn Lập trình hướng đối tượng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_mon_lap_trinh_huong_doi_tuong.pdf

Nội dung text: Bài giảng môn Lập trình hướng đối tượng

  1. BÀI GIẢNG: MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
  2. MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Đối tượng : SV ₫ại học chính quy ngành CNTT Tài liệu tham khảo : ƒ Tập slide bài giảng & thực hành của mơn học này. ƒ The C++ Programming Language (special 3rd edition), Bjarne Stroustrup, 2000. ƒ 3 CD MSDN trong Microsoft Visual Studio. ƒ Online-Help của mơi trường JBuilder Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Trường ĐH Bách Khoa Tp.HCM Slide 1
  3. MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Nội dung chính gồm 10 chương : 1. Ơn lại các tính chất của lập trình cấu trúc. 2. Các khái niệm chính của lập trình OOP. 3. Cơ chế dịch mã OOP sang mã máy. 4. Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java. 5. Đặc tả class & các tính chất cơ bản của ₫ối tượng trong VC++. 6. Đặc tả class & các tính chất cơ bản của ₫ối tượng trong Java. 7. Chi tiết về gọi hàm, gởi thơng ₫iệp & ₫a xạ của VC++. 8. Chi tiết về gọi hàm, gởi thơng ₫iệp & ₫a xạ của Java. 9. Chi tiết về thường trú, serialization, COM, Generalization & Template của VC++. 10. Chi tiết về thường trú, serialization, Generalization của Java. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Trường ĐH Bách Khoa Tp.HCM Slide 2
  4. 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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 3
  5. Phương pháp phân tích từ-trên-xuống Mỗi sự vật trong mơi trường xung quanh ta ₫ều ₫ược cấu thành từ nhiều phần tử nhỏ hơn, mỗi phần tử nhỏ lại ₫ược cấu thành từ nhiều phần tử nhỏ hơn nữa. Thí dụ, con người gồm ₫ầu, mình, tứ chi. Tứ chi gồm 2 tay và 2 chân Mỗi cơng việc cần giải quyết bằng máy tính cũng ₫ược cấu thành từ nhiều cơng việc nhỏ hơn, mỗi cơng việc nhỏ hơn lại ₫ược cấu thành từ nhiều cơng việc nhỏ hơn nữa Phương pháp phân tích từ-trên-xuống (top-down analysis) là phương pháp thường sử dụng ₫ể phân tích cơng việc, nội dung của phương pháp này là cố gắng xác ₫ịnh xem cơng việc cần giải quyết ₫ược cấu thành từ những cơng việc nhỏ nào, mỗi cơng việc nhỏ ₫ược cấu thành từ các cơng việc nhỏ hơn nào, cứ như vậy cho ₫ến khi những cơng việc xác ₫ịnh ₫ược là những cơng việc thật ₫ơn giản, cĩ thể thực hiện dễ dàng. Thí dụ việc học lấy bằng kỹ sư CNTT khoa CNTT ĐHBK TP.HCM cĩ thể bao gồm 9 cơng việc nhỏ hơn là học từng học kỳ từ 1 tới 9, học học kỳ i là học n mơn học của học kỳ ₫ĩ, học 1 mơn học là học m chương của mơn ₫ĩ, Hình vẽ của slide kế cho thấy trực quan của phương pháp phân tích top-down. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 4
  6. Phương pháp phân tích từ-trên-xuống (tt) chia thành nhiều cơng Cơng việc cần việc nhỏ hơn, ₫ơn giản ₫ể giải quyết (A) giải quyết hơn. Cơng việc Cơng việc Cơng việc A1 A2 An Cơng việc Cơng việc Cơng việc Cơng việc Cơng việc Cơng việc A11 A12 A1n An1 An2 Ann 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ĩ. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 5
  7. Tầm vực truy xuất biến ƒ Tầm vực của một biến là tập các lệnh ₫ược phép truy xuất biến ₫ĩ. ƒ C và C++ cho phép 3 cấp ₫ộ tầm vực sau : o cục bộ trong function : bất kỳ lệnh nào trong function ₫ều cĩ thể truy xuất ₫ược biến cục bộ trong function ₫ĩ. void Command1_Click() { char strGreeting[256]; // Khai báo cục bộ } o cục bộ trong module : bất kỳ lệnh nào trong module ₫ều cĩ thể truy xuất ₫ược biến cục bộ trong module ₫ĩ. static char strAddr[256]; // biến cục bộ trong module char strName[256]; // biến tồn cục o tồ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 tồn cục. ƒ Trong một ngữ cảnh (cùng 1 function, cùng 1 module, hay cấp tồn cục), khơng thể dùng hai biến cùng tên (C phân biệt chữ HOA và chữ thường). Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 6
  8. Cấu trúc 1 chương trình hướng cấu trúc Chương trình = cấu trúc dữ liệu + giải thuật module global data (package) local data entry 'start' of module local data of function Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 7
  9. Cấu trúc 1 chương trình hướng cấu trúc ‰ Thành phần “giải thuật” bao gồm code ₫ược viết trong các module. Trong từng module, code ₫ược gom nhĩm thành những hàm chức năng, mỗi hàm ₫ược nhận dạng và truy xuất thơng qua tên hàm. ‰ Thành phần “dữ liệu” bao gồm các biến dữ liệu ₫ược ₫ịnh nghĩa trong các module. Trong từng module, về mặt tầm vực truy xuất, các biến cĩ thể ₫ược ₫ịnh nghĩa 1 trong 2 cấp tầm vực : ƒ Public : bất kỳ lệnh nào của chương trình ₫ều cĩ thể truy xuất ₫ược. ƒ Private : chỉ cĩ các lệnh trong module hiện hành mới cĩ thể truy xuất. ƒ Ngồi ra trong từng hàm chức năng, người ta cĩ thể ₫ịnh nghĩa các biến cục bộ, các biến này chỉ ₫ược truy xuất cục bộ bởi các lệnh trong hàm tương ứng. Ngoại lệ, trong 1 số ngơn ngữ như C, người ta cho phép ₫ịnh nghĩa biến trong lệnh thực thi (block — compose), biến này chỉ ₫ược truy xuất cục bộ bởi các lệnh trong thân của lệnh block tương ứng. Ư ₫iểm yếu nhất trong ngơn ngữ hướng cấu trúc là cho phép ₫ịnh nghĩa biến tồ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”. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 8
  10. Cấu trúc 1 chương trình hướng cấu trúc ‰ Xét Turbo Pascal, 1 ứng dụng gồm 1 module chương trình và nhiều module dịch vụ ₫ược gọi là Unit. Để sử dụng các thành phần trong 1 module nào ₫ĩ, ta phải dùng lệnh Use. ‰ Xét C, 1 ứng dụng gồm nhiều module ngang hàng, mỗi module là 1 file gồm nhiều hàm chức năng. Điểm nhập ứng dụng là hàm main(). Module C cũng cĩ thể là file thư viện liên kết tĩnh (*.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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 9
  11. Mối quan hệ client/server giữa các module //₫ặc tả interface của module A : client //₫ặc tả interface của module B : server #include B.h extern int B_intA; extern int A_intA; typedef struct { } B_Type1; typedef struct { } A_Type1; #define B_MAXLEN 1024 #define A_PI 3.14159 int B_func1(char c, char* d); int A_func1(int a, double b); #include B.h #include A.h //hiện thực của module B //hiện thực của module A int B_intA; int A_intA; static int B_intB; static int A_intB; int B_func1(int a, double b) { int A_func1(int a, double b) { B_Type1 var; B_func2(a); B_intA = B_MAXLEN; } A_func2(a); static void B_func2(int a) { B_func1(a,b); } } static void A_func2(int a) { } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 10
  12. Hai module sử dụng tài nguyên của nhau //₫ặc tả interface của module A //₫ặc tả interface của module B #define _AH #define _BH #ifndef _BH #ifndef _AH #include B.h #include A.h #endif #endif extern int A_intA; extern int B_intA; typedef struct { } A_Type1; typedef struct { } B_Type1; #define A_PI 3.14159 #define B_PI 3.14159 int A_func1(int a, double b); int B_func1(char c, char* d); #include A.h #include B.h //hiện thực của module A //hiện thực của module B int A_intA; int B_intA; static int A_intB; static int A_intB; int A_func1(int a, double b) { int B_func1(int a, double b) { A_func2(a); B_func2(a); } } static void A_func2(int a) { static void B_func2(int a) { } } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 1: Ơn lại các tính chất của lập trình cấu trúc Trường ĐH Bách Khoa Tp.HCM Slide 11
  13. MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Chương 2 CÁC KHÁI NIỆM CHÍNH CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 12
  14. Nội dung 2.1 Cấu trúc của 1 ứng dụng hướng ₫ối tượng 2.2 Đối tượng, thuộc tính, tác vụ. 2.3 Abstract type và class. 2.4 Tính bao ₫ĩng. 2.5 Tính thừa kế & cơ chế 'override'. 2.6 Tính bao gộp. 2.7 Thơng ₫iệp, tính ₫a xạ và kiểm tra kiểu. 2.8 Tính tổng quát hĩa. 2.9 Tính thường trú. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 13
  15. Cấu trúc chương trình OOP Chương trình = tập các ₫ối tượng tương tác nhau Đối tượng (object) local data entry of object local data of operation Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 14
  16. Cấu trúc chương trình OOP ‰ Cấu trúc chương trình hướng ₫ối tượng rất thuần nhất, chỉ chứa 1 loại thành phần : ₫ối tượng. ‰ Các ₫ối tượng cĩ tính ₫ộc lập rất cao ⇒ quản lý, kiểm sốt chương trình rất dễ (cho dù chương trình cĩ thể rất lớn) ⇒ dễ nâng cấp, bảo trì. ‰ Khơng thể tạo ra dữ liệu tồn cục của chương trình ⇒ ₫iểm yếu nhất của chương trình cấu trúc khơng tồn tại nữa. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 15
  17. Đố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 ₫ĩ. Implementation (class) Interface (abstract type) Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 16
  18. Kiểu trừu tượng (Abstract type) ƒ Abstract type (type) ₫ịnh nghĩa interface sử dụng ₫ối tượng. Ta dùng tên nhận dạng ₫ể ₫ặt tên cho kiểu và ₫ể nhận dạng nĩ. ƒ Interface là tập hợp các 'entry' mà bên ngồi cĩ thể giao tiếp với ₫ối tượng. ƒ Ta dùng signature ₫ể ₫ịnh nghĩa mỗi 'entry'. Signature gồm : ƒ tê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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 17
  19. Kiểu trừu tượng trong Java Java hỗ trợ kiểu trừu tượng thơng qua lệnh interface, lệnh này ₫ịnh nghĩa abstract type của nhiều ₫ối tượng của ứng dụng (cĩ thể thuộc nhiều class khác nhau. public interface Sleeper { public void wakeUp(); public long ONE_SECOND = 1000; // in milliseconds public long ONE_MINUTE = 60000; // in milliseconds } public class DigitalClock extends Applet implements Sleeper { } public class AnalogClock extends Applet implements Sleeper { } Sleeper object; Object = new DigitalClock(); //biến object giữ tham khảo ₫ến 1 ₫ối tượng DigitalClock Object = new AnalogClock(); //biến object giữ tham khảo ₫ến 1 ₫ối tượng AnalogClock Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 18
  20. Class (Implementation) ~ Ta dùng tên nhận dạng ₫ể ₫ặt tên cho class và ₫ể nhận dạng nĩ. Class ₫ịnh nghĩa chi tiếthiệnthực ₫ốitượng : ƒ ₫ịnh nghĩacácthuộ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ủatấtcả thuộctínhcủ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ĩacáctác vụ tạo (create) và xĩa (delete) ₫ốitượng. ~ Định nghĩacáctác vụ 'constructor' và 'destructor'. ~ User khơng cần quan tâm ₫ếnclass của ₫ốitượng. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 19
  21. 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? }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 20
  22. 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 ngồi thấy và truy xuất ⇒ tạo ₫ộ ₫ộc lập cao giữa các ₫ối tượng (hay tính kết dính - cohesion giữa các ₫ối tượng rất thấp). ƒ che dấu các thuộc tính dữ liệu : nếu cần cho phép bên ngồi truy xuất 1 thuộc tính, ta tạo 2 tác vụ get/set tương ứng ₫ể giám sát và kiểm số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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 21
  23. Tính thừa kế (inheritance) ‰ Tính thừa kế cho phép giảm nhẹ cơng sức ₫ịnh nghĩa type/class : ta cĩ thể₫ịnh nghĩa các type/class khơng phải từ₫ầu mà bằng cách kế thừa type/class cĩ sẵn, ta chỉ₫ịnh nghĩa thêm các chi tiết mới mà thơi (thường khá ít). ƒ Đa thừa kế hay ₫ơn thừa kế. ƒ Thừa kế tạo ra mối quan hệ supertype/subtype và superclass/subclass. ƒ Cĩ thể override các method của class cha, kết quả override chỉ tác dụng trên ₫ối tượng của class con. ƒ Đối tượng của class con cĩ thể ₫ĩng vai trị của ₫ối tượng class cha nhưng ngược lại thường khơng ₫ược. ‰ VC++ cho phép hạn chế tầm vực truy xuất các thành phần của class cha : class C : protected A, private B { } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 22
  24. Ví dụ về thừa kế và override — VC++ class Geometry { // abstract base class public: Geometry( ); virtual void Draw( Window *pWnd ) = 0; // abstract operation protected: int xPos, yPos; COLORREF color; }; class Group : public Geometry { public: Group( ); ~Group( ); virtual void Draw( Window *pWnd ); // override private: Geometry ppGeo; // pointer container int geoCount; }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 23
  25. Tính bao gộp (aggregation) ƒ 1 ₫ối tượng cĩ thể chứa nhiều ₫ối tượng khác ⇒ tạo nên mối quan hệ bao gộp 1 cách ₫ệ quy giữa các ₫ối tượng. ƒ Cĩ 2 gĩc nhìn về tính báo gộp: ngữ nghĩa & hiện thực. Gĩc nhìn ngữ nghĩa Gĩc nhìn hiện thực O2 O O1 2 O1 O3 O3 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 24
  26. Ví dụ về bao gộp - VC++ class Geometry { // abstract base class public: Geometry( ); ~Geometry( ); virtual void Draw( Window *pWnd ) = 0; // abstract operation protected: int xPos, yPos; double xScale, yScale; COLORREF color; }; class Group : public Geometry { public: Group( ); ~Group( ); virtual void Draw( Window *pWnd ); // override private: Geometry ppGeo; // =Geometry* ppGeo[n]; int geoCount; }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 25
  27. 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 26
  28. Tính ₫a xạ (Polymorphism) ‰ Cùng 1 lệnh gởi thơng ₫iệp ₫ến ₫ối tượng thơng qua cùng 1 tham khảo nhưng ở vị trí/thời ₫iểm khác nhau cĩ thể kích hoạt việc thực thi tác vụ khác nhau của các ₫ối tượng khác nhau. T1 p1; // C1 và C2 là 2 class Java hiện thực T1 p1 = New C1; // tạo ₫ối tượng C1, gán tham khảo vào biến p1 p1.meth1( ); // gởi thơng ₫iệp nhờ tác vụ meth1 thực thi p1 = New C2; // tạo ₫ối tượng C2, gán tham khảo vào biến p1 p1.meth1( ); // gởi thơng ₫iệp nhờ tác vụ meth1 thực thi Lệnh gởi thơng ₫iệp p1.meth1( ); ở 2 vị trí khác nhau kích hoạt 2 tác vụ khác nhau của 2 class khác nhau. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 27
  29. Kiểm tra kiểu (type check) ‰ Chặt và dùng mối quan hệ 'conformity' (tương thích tổng quát). Type A tương thích với type B ⇔ A chứa mọi tác vụ của B và ứng với từng tác vụ của type B : ƒ Tồn tại 1 tác vụ cùng tên trong A. ƒ danh sách tham số của 2 tác vụ tương ứng phải bằng nhau về số lượng tham số. ƒ kiểu ₫ối số OUT hay giá trị return của tác vụ trong A phải tương thích với kiểu của ₫ối số tương ứng trong B. ƒ kiểu ₫ối số IN của tác vụ trong B phải tương thích với kiểu của ₫ối số tương ứng trong A. ƒ kiểu ₫ối số INOUT phải trùng với kiểu của ₫ối số tương ứng trong B. Ư quan hệ so trùng hay quan hệ con/cha (sub/super) là trường hợp ₫ặc biệt của quan hệ tương thích tổng quát. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 28
  30. 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 29
  31. 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). Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 30
  32. 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ĩ. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng Trường ĐH Bách Khoa Tp.HCM Slide 31
  33. MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Chương 3 CƠ CHẾ DỊCH MÃ HƯỚNG ĐỐI TƯỢNG SANG MÃ MÁY Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 32
  34. Tổng quát về vấn ₫ề dịch OOP ‰ Chương trình là tập các ₫ối tượng sống ₫ộc lập và tương tác lẫn nhau khi cần thiết. ‰ Các ₫ối tượng thuộc 1 số loại nhất ₫ịnh (n) ‰ Mỗi loại ₫ối tượng ₫ược miêu tả bởi 1 type & 1 class ‰ Mã nguồn chươngtrìnhlà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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 33
  35. Dịch 1 abstract type ‰ Abstract type chỉ chứa thơng tin trừu tượng (interface), khơng miêu tả sự hiện thực → Kết quả việc dịch 1 type chỉ dừng lại ở việc xây dựng cây ngữ nghĩa của type tương ứng ₫ể phục vụ việc kiểm tra kiểu của chương trình dịch, chứ khơng tạo code mã máy. ‰ Chỉ cần 3 bước : duyệttừ 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 34
  36. Dịch 1 class ‰ Dịch class là cơng việc chính của chương trình dịch hướng ₫ối tượng. ‰ Gồm 2 cơng việc chính : dịch thuộc tính dữ liệu và dịch các method (hay các internal function). ‰ Cần ₫ầy ₫ủ các bước : duyệt từ vựng, phân tích cú pháp, phân tích ngữ nghĩa và tạo mã. ‰ Nên dùng cơng cụ hỗ trợ như LEX, YACC cho 2 bước duyệt từ vựng & phân tích cú pháp. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 35
  37. Dịch thuộctínhdữ liệu typedef struct { ‰ class → cấu trúc record class C1 : C0 { // import các field từ cấutrúc double d; // ₫ượcsinh ra từ C0 int i ; // các field tương ứng với C1 public : double C1_d; int proc4(int i); int C1_i; void proc5 (double d); // các field dữ liệu ₫iều khiển }; // tự tạo bởi chương trình dịch void (*pvfaddr)() ; } C1; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 36
  38. Dịch thuộctínhdữ 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). Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 37
  39. Dịch thuộctínhdữ 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ộctínhdữ liệu trở thành việc truy xuất ơ nhớ dùng cách ₫ịnh ₫ịa chỉ chỉ số : - o1.i = 5; mov bx, C1_o1 mov [bx+8], 5 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 38
  40. Tạobảng ₫ịa chỉ các tác vụ pvftbl fname faddr class C1 : C0 { 0 "proc1" C0_proc1 double d; int i ; 1 "proc2" C1_proc2 public : 2 "proc3" C0_proc3 void proc2(); //override int proc4(int i, double k); 3 "proc4" C1_proc4 void proc5 (double d); 4 "proc5" C1_proc5 }; 5 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 39
  41. Tạobảng ₫ịachỉ các tác vụ (tt) ‰ Tạo bảng ₫ịa chỉ gồm C1METHCNT phầntử (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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 40
  42. Dịch 1 method int C1_proc1(C1* p, int i, double d) { int C1::proc1(int i,double k) { C2 o2; C2 *p2; C2 o2; // truy xuấtthuộctính C2 *p2; p->C1_i = i; p->C1_d = d; C1::i = i; // gọihàm d = k; C1_proc5(p,d); C1::proc5(d); C2_proc2(&o2, i,d); o2.proc2(i,d); // gởi thơng ₫iệp:kiểm tra, load, p2 = New(C2); 1 // cập nhậtbảng ₫ịachỉ method p2->proc2(i,d); for (i = 0; i }; pvftbl[i].fname)==0) break; 3 (*p2->pvftbl[i].faddr)(p2,i,d); }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 41
  43. 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ộctí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ồicập nhật bảng ₫ịa chỉ các method của ₫ốitượng. ƒ tìm chỉ số của method cầngọi trong bảng (i). ƒ gọigiántiếp method thơng qua ₫ịachỉ phầntử thứ i trong bảng. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 42
  44. 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ậtbảng ₫ịa chỉ các tác vụ,tìmchỉ số method cần gọi và gọi gián tiếp qua ₫ịa chỉ trong bảng. ‰ 1số 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ả. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 43
  45. 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 44
  46. Tối ưu hĩa code tạo ra (tt) ‰ cái giá phảitrả củaviệctối ưu hĩa trong C++ : ƒ ngườilậptrìnhphảitự quyết ₫ịnh tác vụ nào cầnxử lý theo cơ chế₫axạ,tác vụ nào khơng ? Nếusự quyết ₫ịnh này sai thì sẽ gây lỗikhi chạy, mà là người thì khĩ lịng quyết ₫ịnh chính xác. ƒ tính ₫axạ chỉ₫úng giữacác₫ối tượng cĩ mối quan hệ con/cha, ở ₫ĩthứ tự các ₫ịa chỉ method củamọi class con trong bảng ₫ịachỉ luơn giống thứ tự các method tương ứng của class cha, tuy nhiên giữa 2 class bấtkỳ thì khơng thể ₫ảmbảo → kiểmtra kiểu trong C++ khơng thể nâng cấplên bằng cách dùng mối quan hệ "conformity". Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 3: Cơ chế dịch mã OOP sang mã máy Trường ĐH Bách Khoa Tp.HCM Slide 45
  47. MƠN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Chương 4 TỔNG QUÁT VỀ MỨC ĐỘ HỖ TRỢ OOP CỦA VC++ & JAVA Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 46
  48. 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”. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 47
  49. Chỉ hỗ trợ class, khơng hỗ trợ abstract type Chỉ cung cấp lệnh “class” ₫ể ₫ặc tả sự hiện thực của ₫ối tượng, khơng cĩ lệnh interface hay type ₫ể ₫ịnh nghĩa type của ₫ối tượng. Dùng class ₫ể ₫ịnh nghĩa kiểu cho các biến, các thuộc tính. Cần phân biệt cách ₫ịnh nghĩa kiểu cho biến : C1 o1; // biến o1 là vùng nhớ chứa ₫ối tượng C1* p1; // biến p1 là vùng nhớ chứa pointer tới ₫ối tượng ⇒ ƒ Nếu 1 class cĩ chứa thuộc tính ₫ối tượng thuộc kiểu class thì ₫ối tượng tương ứng sẽ là ₫ối tượng gộp vật lý ₫ối tượng khác. ƒ Nếu 1 class cĩ chứa thuộc tính ₫ối tượng thuộc kiểu class pointer thì ₫ối tượng tương ứng sẽ là ₫ối tượng gộp chứa tham khảo (pointer) ₫ến ₫ối tượng khác. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 48
  50. Đ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. ƒ 1class 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. a. b. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 49
  51. Đ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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 50
  52. Class trừu tượng (Abstract class) VC++ hỗ trợ khái niệm "abstract class" ₫ể ₫ịnh nghĩa class chỉ chứa thơng tin interface nhưng khơng cho phép dùng class này ₫ể ₫ịnh nghĩa kiễu cho biến hay thuộc tính (trừ pointer). Một “abstract class” là 1 class chứa ít nhất 1 "pure virtual funtion“, một "pure virtual funtion“ là 1 virtual function ₫ược gán =0 (nghĩa là khơng cĩ phần hiện thực kèm theo). class Geometry { // abstract class public: Geometry( ); ~Geometry( ); virtual void Draw( Window *pWnd ) = 0; // pure virtual function protected: int xPos, yPos; double xScale, yScale; COLORREF color; }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 51
  53. Tầm vực truy xuất thành viên của class Tầm vực truy xuất thành viên trong ₫ối tượng ₫ược miêu tả bởi 1 trong 3 từ khĩa sau : private : thành phần bị che dấu hồn tồn. protected : chỉ che dấu bên ngồ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 { } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 52
  54. 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. ₫ịachỉ function 1 ₫ịa chỉ function 2 ₫ịa chỉ function 3 ₫ịa chỉ function 4 ₫ịa chỉ function 5 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 53
  55. Các ₫ối tượng ₫ều tạm thời Các ₫ối tượng chỉ tồn tại tạm thời trong khơng gian process. Tham khảo ₫ến ₫ối tượng thực chất là pointer cục bộ trong khơng gian làm việc của process. Chương trình phải tự viết code cho hoạt ₫ộng save/restore ₫ối tượng nếu muốn lưu giữ/dùng lại ₫ối tượng. VC++ hỗ trợ hoạt ₫ộng save/restore ₫ối tượng nhờ khả năng 'Serialization'. Cĩ quyền 'override' bất cứ method của bất kỳ function nào của class cha. Cho phép ₫ịnh nghĩa các hàm 'overloaded' : cùng tên nhưng 'signature' khác nhau. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 54
  56. Skeleton ₫ịnh nghĩa class class Geometry : Object { // == class Geometry : public Object { public: Geometry( ); ~Geometry( ); virtual void Draw( Window *pWnd ); // virtual method BOOL IsDisplayed(void); protected: COLORREF color; private : int xPos, yPos; double xScale, yScale; }; class Point : Geometry {}; class Line : Geometry { }; class Polygon : Geometry { }; class Rectangle : Geometry { }; Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 55
  57. Cấutrúc1 chương trình Dialog based ₫ơn giản InitInstance() DoModal() CProgramDlg CProgramApp Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 56
  58. Cấu trúc 1 chương trình SDI ₫ơn giản InitInstance() CMainFrame CProgramView CProgramDoc CSingleDocTemplate CProgramApp Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 57
  59. Cấu trúc 1 chương trình MDI ₫ơn giản InitInstance() CChildFrame CProgramView CProgramDoc CMultiDocTemplate CProgramApp Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 58
  60. 4.2 Ngơn ngữ Java 1. Hỗ trợ ₫ầy ₫ủ 'interface' (abstract type) và class. 2. Hỗ trợ ₫ơn thừa kế. 3. Cĩ thể dùng 'abstract class' ₫ể ₫ịnh nghĩa interface. 4. Tầm vực truy xuất các thành phần. 5. Hỗ trợ package 6. Đa xạ ₫ầy ₫ủ. 7. Chỉ hỗ trợ ₫ối tượng tạm trong từng session JVM 8. Override function khi thừa kế. 9. Cĩ thể ₫ịnh nghĩa overloaded function. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 59
  61. Hỗ trợ Class và Interface 1. Java hỗ trợ việc ₫ịnh nghĩa ₫ối tượng theo cả 2 gĩc nhìn : phát biểu interface ₫ịnh nghĩa gĩc nhìn sử dụng và phát biểu class ₫ịnh nghĩa gĩc nhìn hiện thực ⇒ về nguyên tắc người lập trình nên dùng tên interface ₫ể ₫ịnh nghĩa biến ₫ối tượng, tuy nhiên do tập quán và thĩi quen, người lập trình chủ yếuvẫ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). Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 60
  62. Tạo & xĩa ₫ối tượng Phải gọi hàm tạo ₫ối tượng 1 cách tường minh, nhưng khơng cần xĩa ₫ối tượng (việc này nên ₫ể cho module dọn rác của JVM thực hiện ₫ể ₫ảm bảo tính ₫úng ₫ắn và an tồn). class C1 extends RootClass { } C1 o1; // o1 chứa tham khảo ₫ến ₫ối tượng C1 o1 = New C1; //tạo ₫ối tượng mới và gán tham khảo vào biến ₫ối tượng Việc dùng tên interface ₫ặc tả kiểu cho biến, thuộc tính 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 61
  63. Hỗ trợ abstract class 3. Tiếp tục hỗ trợ khái niệm "abstract class" ₫ể ₫ịnh nghĩa class chỉ chứa thơng tin interface và khơng cho phép 'instanciate' ₫ối tượng. Người lập trình chỉ cĩ thể dùng class 'abstract class' ₫ể ₫ặc tả kiểu cho các biến hoặc ₫ể thừa kế trong việc ₫ịnh nghĩa class con. class abstract Geometry { // abstract class protected int xPos, yPos; protected double xScale, yScale; protected COLORREF color; public abstract Draw(Graphics g); // abstract function }; Abstract class cĩ thể chứa ₫ầy ₫ủ các hiện thực bên trong, nhưng thường chỉ chứa các 'abstract function'. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 62
  64. Tầmvự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 ₫ốitượng : private : thành phầnbị che dấu hồn tồn. protected : che dấu bên ngồi nhưng cho phép các ₫ốitượng con, cháu, chắt truy xuất. public : cho phép tấtcả mọinơi truy xuất. friendly : cho phép mọiphầntử 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 63
  65. Hỗ trợ package 5. Package là ₫ơn vị ₫ĩng gĩi các class và cũng là ₫ơn vị quản lý tầm vực của java, mỗi package chứa nhiều class (ở dạng mã trung gian — mã bytecode). package graphics; public class Circle extends Graphic implements Draggable { . . . } Tất cả mọi phần tử ₫ược ₫ịnh nghĩa trong 1 file mã nguồn ₫ều thuộc 1 package, tên package này ₫ược ₫ặc tả trong phát biểu package, phát biểu này phải nằm ở ₫ầu file mã nguồn. Nếu khơng cĩ thì các class trong file mã nguồn sẽ ₫ược chứa trong package mặc ₫ịnh (khơng cĩ tên). Nhiều file source cĩ thể ₫ược dịch và lưu trong cùng 1 package. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 64
  66. 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 ngồi (public, protected, friendly) ₫ều ₫ược quản lý trong 1 danh sách "public function table“ của ₫ối tượng. Địa chỉ function 1 Địa chỉ function 2 Địa chỉ function 3 Địa chỉ function i Địa chỉ function n Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 65
  67. Các ₫ối tượng ₫ều 'tạmthời' 7. Các ₫ối tượng chỉ tồn tại tạm thời trong 1 session chạyJVM. 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 66
  68. 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 "); 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) { } } } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 67
  69. Thí dụ về chương trình Java GUIClock > AlarmClock 12.34.25 wakeup() Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 68
  70. 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ế Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 69
  71. Thí dụ về các class Java //tác vụ ₫ếm dùm khách hàng s thời gian time (ms) public synchronized boolean letMeSleepFor(Sleeper s, long time) { int index = findNextSlot(); if (index == NOROOM) { return false; } else { sleepers[index] = s; sleepFor[index] = time; new AlarmThread(index).start(); return true; } } //cịn tiếp ở slide kế Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 70
  72. Thí dụ về các class Java private synchronized int findNextSlot() { for (int i = 0; i < MAX_CAPACITY; i++) { if (sleepFor[i] == UNUSED) return i; } return NOROOM; } private synchronized void wakeUpSleeper(int sleeperIndex) { sleepers[sleeperIndex].wakeUp(); sleepers[sleeperIndex] = null; sleepFor[sleeperIndex] = UNUSED; } //cịn tiếp ở slide kế Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 71
  73. Thí dụ về các class Java 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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 72
  74. Thí dụ về các class Java 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(); } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 73
  75. Thí dụ về các class Java 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); } } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 4 : Tổng quát về mức ₫ộ hỗ trợ OOP của VC++ & Java Trường ĐH Bách Khoa Tp.HCM Slide 74
  76. 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++ Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 5 :Đặc tả class & các tính chất cơ bản của ₫ối tượng trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 75
  77. Đặc tả class trong VC++ Thơng tin chi tiết trong bài thực hành số 6. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 5 :Đặc tả class & các tính chất cơ bản của ₫ối tượng trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 76
  78. 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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 6 :Đặc tả class & các tính chất cơ bản của ₫ối tượng trong Java Trường ĐH Bách Khoa Tp.HCM Slide 77
  79. Đặc tả interface (abstract type) trong Java Thơng tin chi tiết trong bài thực hành số 7. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 6 :Đặc tả class & các tính chất cơ bản của ₫ối tượng trong Java Trường ĐH Bách Khoa Tp.HCM Slide 78
  80. 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++ Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 79
  81. Tổng quát về gọi hàm trong VC++ Trong VC++, các lệnh thực thi ₫ều phải nằm trong thân của 1 hàm nào ₫ĩ. Ta phân biệt 2 loại hàm : ƒ Hàm cổ ₫iển, tồn tại ở cấp ngồi cùng (khơng thuộc class nào). ƒ Hàm trong 1 class ₫ối tượng nào ₫ĩ, ta tạm dùng thuật ngữ "tác vụ" ₫ể nĩi về loại hàm này. Trong thân của 1 hàm cổ ₫iển, xét lệnh sau : function1( ); ::function1( ); Hai lệnh trên ₫ược gọi là lời gọi hàm cổ ₫iển function1(). Hàm function1() phải tồn tại trong module nào ₫ĩcủa phần mềm hoặc trong module thư viện mà phần mềm sẽ liên kết ₫ến. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 80
  82. Tổng quát về gọi hàm trong VC++ Trong thân của 1 tác vụ, xét lệnh sau : ::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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 81
  83. Tổng quát về gọi hàm trong VC++ ‰ Trong VC++, cĩ 2 cách truy xuất ₫ối tượng khác nhau : ƒ thơng qua biến ₫ối tượng MyClass obj; ƒ thơng qua biến tham khảo ₫ến ₫ối tượng : MyClass *pobj; ‰ Biến obj miêu tả bản thân ₫ối tượng MyClass (1 cách tường minh, xác ₫ịnh và khơng nhầm lẫn với bất kỳ ₫ối tượng thuộc class nào khác. Cú pháp gọi tác vụ thơng qua biến ₫ối tượng là : obj.function1( ); lệnh trên luơn ₫ược dịch ra thành lời gọi hàm function1( ) của class MyClass tại thời ₫iểm dịch. Do ₫ĩtại thời ₫iểm chạy, nếu biến obj ₫ang chứa 1 ₫ối tượng khác thì lệnh obj.function1( ) vẫn luơn là lời gọi hàm function1( ) của class MyClass. Khơng cĩ ₫a xạ trong trường hợp này. Ngữ nghĩa của lời gọi hàm như trên cĩ thể ₫úng/khơng ₫úng với yêu cầu của người lập trình tại từng thời ₫iểm/vị trí chạy nĩ. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 82
  84. Tổng quát về gọi hàm trong VC++ Trong thân của 1 tác vụ, xét lệnh sau : function1( ); Nếu function1() ₫ược ₫ịnh nghĩa trong class của ₫ối tượng tương ứng thì lệnh trên sẽ ₫ược chuyển thành lệnh : this->function1( ); trong ₫ĩ this là tên biến tham khảo ₫ến ₫ối tượng hiện hành. Lệnh this->function1( ); là trường hợp ₫ặc biệt của lệnh : pobj->function1( ); trong ₫ĩ pobj là tên biến tham khảo ₫ến ₫ối tượng nào ₫ĩ ₫ã ₫ược ₫ịnh nghĩa trước ₫ĩ. Bây giờ chúng ta hãy khảo sát chi tiết về việc xử lý lệnh pobj->function1( ); trong VC++. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 83
  85. Xử lý lệnh gởi thơng ₫iệp trong VC++ Giải sử biến tham khảo pobj ₫ã ₫ược ₫ịnh nghĩa như sau : MyClass *pobj; Việc xử lý lệnh gởi thơng ₫iệp pobj->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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 84
  86. Thí dụ củng cố nội dung chương 7 Giới thiệu bài thực hành số 8. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 7 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong VC++ Trường ĐH Bách Khoa Tp.HCM Slide 85
  87. 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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 8 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong Java Trường ĐH Bách Khoa Tp.HCM Slide 86
  88. Tổng quát về gởi thơng ₫iệp trong Java Trong Java, chỉ cĩ 1 cách truy xuất ₫ối tượng duy nhất : thơng qua biến tham khảo ₫ến ₫ối tượng. Biến tham khảo ₫ược ₫ịnh nghĩa theo 1 trong 2 cách : MyClass pobj; //dùng class miêu tả kiểu cho biến MyInterface pobj; //dùng interface miêu tả kiểu cho biến Trong Java, các lệnh thực thi ₫ều phải nằm trong thân của 1 tác vụ nào ₫ĩcủa 1 class nào ₫ĩ. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 8 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong Java Trường ĐH Bách Khoa Tp.HCM Slide 87
  89. Tổng quát về gởi thơng ₫iệp trong Java Trong thân của 1 tác vụ, xét lệnh sau : 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 8 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong Java Trường ĐH Bách Khoa Tp.HCM Slide 88
  90. Xử lý lệnh gởi thơng ₫iệp trong Java Giả sử biến tham khảo pobj ₫ã ₫ược ₫ịnh nghĩa như sau : MyClass pobj; Việc xử lý lệnh gởi thơng ₫iệp pobj.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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 8 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong Java Trường ĐH Bách Khoa Tp.HCM Slide 89
  91. Thí dụ củng cố nội dung chương 8 Giới thiệu bài thực hành số 9. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 8 : Gọi hàm, gởi thơng ₫iệp & ₫a xạ trong Java Trường ĐH Bách Khoa Tp.HCM Slide 90
  92. 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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 91
  93. Tnh 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 hốn vị 2 số nguyên, method hốn vị 2 chuỗi, method hố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 Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 92
  94. Tnh 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 93
  95. Function template Function template cho phép ta ₫ặc tả 1 tập các hàm mà dùng chung ₫oạn lệnh thực thi nhưng tác ₫ộng trên những dữ liệu thuộc kiểu hay class khác nhau. Thí dụ hàm 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 void MySwap( T& a, T& b ) { T c (a); a = b; b = c; } ₫ịnh nghĩa 1 họ các hàm swap 2 dữ liệu cĩ kiểu bất kỳ. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 94
  96. Function template (tt) ƒ Ta cĩ thể gọi hàm “template function” y như gọi hàm bình thường, khơng cĩ sự khác biệt nào cả : int i, j; char k; MySwap (i, j); //Ok MySwap (i, k); //Sai vì khác kiểu. ƒ Ta cĩ thể₫ặc tả tham số rõ ràng khi gọi hàm “template function”, thí dụ : MySwap (i,j); //tạo hàm MySwap (int&, int&) và gọi nĩ với (i,j) Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 95
  97. Class template Class template cho phép ta ₫ặc tả 1 tập các class mà dùng chung interface vàcấu trúc dữ liệu nhưng tác ₫ộng trên những dữ liệu thuộc kiểu hay class khác nhau. Thí dụ class IntStack sau ₫ây : class IntStack { int StackBuffer[100]; int cItems; public: void IntStack( void ) : cItems( 100 ) {}; void push( const int item ); int pop( void ); }; int IntStack::pop ( void ) { if ( cItems 0 ) StackBuffer[ cItems] = item; else else throw "Stack overflow error."; throw "Stack underflow error."; return; } } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 96
  98. Class template 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 97
  99. Class template Cú pháp khai báo 1 class template : template-declaration : template declaration template-argument-list : template-argument template-argument-list , template-argument template-argument : type-argument argument-declaration type-argument : class identifier typename 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. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 98
  100. Class template (tt) template class MyStack { T StackBuffer[i]; int cItems; public: void MyStack( void ) : cItems( i ) {}; void push( const T item ); T pop( void ); }; template void MyStack ::push( const T item ) { if( cItems > 0 ) StackBuffer[ cItems] = item; else throw "Stack overflow error."; return; } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 99
  101. Class template (tt) template T MyStack ::pop( void ) { if( cItems intstack; // biến quản lý stack cĩ tối ₫a 20 số nguyên. MyStack strstack; // biến quản lý stack cĩ tối ₫a 40 chuỗi. MyStack dblstack; // biến quản lý stack cĩ tối ₫a 100 số thực. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 100
  102. Class template (tt) Xem phần phụ lục chương 9 ₫ể biết chi tiết, cụ thể của 2 template MFC ₫ược dùng phổ biến nhất là CArray và CList. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 101
  103. Định nghĩa class "serializable" Đọc/ghi dữ liệu của 1 biến thuộc kiểu cổ ₫iển (int, double, char[], ) rấr dễ vì nội dung của biến này khơng chứa tham khảo ₫ến các thành phần khác. Ngược lại, việc ₫ọc/ghi nội dung của 1 ₫ối tượng thường rất khĩ khăn vì ₫ối tượng cĩ thể chứa nhiều tham khảo ₫ến các ₫ối tượng khác và các ₫ối tượng cĩ thể tham khảo vịng lẫn nhau. Để hỗ trợ phần nào việc ₫ọc/ghi nội dung của ₫ối tượng, VC++ ₫ề nghị kỹ thuật "Serialization". Để ₫ịnh nghĩa 1 class "serializable", ta cần thực hiện 5 tác vụ : 1. ₫ịnh nghĩa class như là con của class CObject (gián tiếp hay trực tiếp). 2. Overriding tác vụ "Serialize". 3. Dùng macro DECLARE_SERIAL trong phát biểu ₫ặc tả class. 4. Định nghĩa hàm constructor khơng tham số. 5. Dùng macro IMPLEMENT_SERIAL trong hiện thực class. Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 102
  104. Định nghĩa class "serializable" //1. thừa kế class CObject class MyClass : public CObject { public : //3. dùng macro DECLARE_SERIAL DECLARE_SERIAL( MyClass); //4. ₫ịnh nghĩa constructor khơng tham số MyClass(); virtual void Serialize( CArchive& archive ); }; //5. dùng macro IMPLEMENT_SERIAL IMPLEMENT_SERIAL(MyClass, CObject, 1 ) //2. Override hàm Serialize void MyClass::Serialize( CArchive& ar ) { } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 103
  105. Định nghĩa hàm Serialize 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; // Polymorphic reconstruction of persistent object //load other members ar >> b1; ar >> b2; } } Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 104
  106. Ghi ₫ối tượng Để ghi 1 ₫ối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ : 1. Định nghĩa ₫ối tượng CFile miêu tả file chứa thơng tin. 2. Định nghĩa ₫ối tượng CArchive ổ chế ₫ộ "store". 3. Gọi tác vụ Serialize khi cần ghi ₫ối tượng. 4. Đĩng ₫ối tượng CArchive 5. Đĩng file //1. Định nghĩa ₫ối tượng CFile CFile theFile; theFile.Open("c:\\persist.bin", CFile::modeCreate | CFile::modeWrite); //2. Định nghĩa ₫ối tượng CArchive CArchive archive(&theFile, CArchive::store); MyClass obj; //3. Gọi tác vụ Serialize ₫ể ghi ₫ối tượng obj.Serialize(archive); //4. Gọi tác vụ Close ₫ể ₫ĩng ₫ối tượng archive archive.Close(); //5. Gọi tác vụ Close ₫ể ₫ĩng ₫ối tượng file theFile.Close(); Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 105
  107. Đọc lại ₫ối tượng Để ₫ọc lại 1 ₫ối tượng thuộc class "serializable", ta cần thực hiện 5 tác vụ : 1. Định nghĩa ₫ối tượng CFile miêu tả file chứa thơng tin. 2. Định nghĩa ₫ối tượng CArchive ổ chế ₫ộ "load". 3. Gọi tác vụ Serialize khi cần ghi ₫ối tượng. 4. Đĩng ₫ối tượng CArchive 5. Đĩng file //1. Định nghĩa ₫ối tượng CFile CFile theFile; theFile.Open("c:\\persist.bin", CFile::modeRead); //2. Định nghĩa ₫ối tượng CArchive CArchive archive(&theFile, CArchive::load); MyClass obj; //3. Gọi tác vụ Serialize ₫ể ₫ọc lại ₫ối tượng obj.Serialize(archive); //4. Gọi tác vụ Close ₫ể ₫ĩng ₫ối tượng archive archive.Close(); //5. Gọi tác vụ Close ₫ể ₫ĩng ₫ối tượng file theFile.Close(); Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 106
  108. Thí dụ về ₫ọc/ghi ₫ối tượng intB1 = 2 dblB2 = 2.345 ba intA1 = 1 intA1 = 3 dblA2 = 1.234 dblA2 = 3.456 pab pab pba pba1 intA1 = 4 dblA2 = 4.567 pab ₫ối tượng class B ₫ối tượng class A Mơn : Lập trình hướng ₫ối tượng Khoa Cơng nghệ Thơng tin Chương 9 : Tổng quát hĩa trong xây dựng hàm & class Trường ĐH Bách Khoa Tp.HCM Slide 107