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

giáo trình lập trình oop - đh bách khoa

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

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
Môn : Lập trình hướng ₫ối tượng
Slide 1
Đố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
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


Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 3
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
Phương pháp phân tích từ-trên-xuống
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 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.
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Phương pháp phân tích từ-trên-xuống (tt)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 5
Công việc cần
giải quyết (A)
Công việc
A
1
Công việc
A
2
Công việc
A
n
Công việc
A
11
Công việc
A
12
Công việc
A
1n
Công việc
A
n1

Công việc
A
n2
Công việc
A
nn


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ó.
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 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 module
char strName[256]; // biến toàn cục
o toàn cục : bất kỳ lệnh nào trong chương trình cũng có thể truy xuất ₫ược
biến toàn cục.
 Trong một ngữ cảnh (cùng 1 function, cùng 1 module, hay cấp toàn cục), không
thể dùng hai biến cùng tên (C phân biệt chữ HOA và chữ thường).
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Cấu trúc 1 chương trình hướng cấu trúc
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 7
Chương trình = cấu trúc dữ liệu + giải thuật
entry 'start'
global data
module
(package)
local data
of module
local data
of function
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Cấu trúc 1 chương trình hướng cấu trúc
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 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
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 9
 Xét Turbo Pascal, 1 ứng dụng gồm 1 module chương trình và
nhiều module dịch vụ ₫ược gọi là Unit. Để sử dụng các thành phần
trong 1 module nào ₫ó, ta phải dùng lệnh Use.
 Xét C, 1 ứng dụng gồm nhiều module ngang hàng, mỗi module là
1 file gồm nhiều hàm chức năng. Điểm nhập ứng dụng là hàm
main(). Module C cũng có thể là file thư viện liên kết tĩnh (*.lib) hay
₫ộng (*.dll). Để sử dụng các thành phần trong 1 module nào ₫ó, ta
phải dùng lệnh #include.

Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Mối quan hệ client/server giữa các module
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 10
//₫ặc tả interface của module B : server
extern int B_intA;
typedef struct { } B_Type1;
#define B_MAXLEN 1024
int B_func1(char c, char* d);
//₫ặc tả interface của module A : client
#include B.h
extern int A_intA;
typedef struct { } A_Type1;
#define A_PI 3.14159
int A_func1(int a, double b);
#include B.h
//hiện thực của module B
int B_intA;
static int B_intB;
int B_func1(int a, double b) {

B_func2(a);

}
static void B_func2(int a) {
}
#include A.h
//hiện thực của module A

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

B_intA = B_MAXLEN;
A_func2(a);
B_func1(a,b);
}
static void A_func2(int a) {
}
Chương 1: Ôn lại các tính chất của lập trình cấu trúc
Hai module sử dụng tài nguyên của nhau
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 11
//₫ặc tả interface của module B
#define _BH
#ifndef _AH
#include A.h
#endif
extern int B_intA;
typedef struct { } B_Type1;
#define B_PI 3.14159
int B_func1(char c, char* d);
//₫ặc tả interface của module A
#define _AH
#ifndef _BH
#include B.h

#endif
extern int A_intA;
typedef struct { } A_Type1;
#define A_PI 3.14159
int A_func1(int a, double b);
#include B.h
//hiện thực của module B
int B_intA;
static int A_intB;
int B_func1(int a, double b) {

B_func2(a);

}
static void B_func2(int a) {
}
#include A.h
//hiện thực của module A
int A_intA;
static int A_intB;
int A_func1(int a, double b) {

A_func2(a);

}
static void A_func2(int a) {
}
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

Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 12
Chương 2
CÁC KHÁI NIỆM CHÍNH
CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Nội dung
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 13
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ú.
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Cấu trúc chương trình OOP
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 14
Chương trình = tập các ₫ối tượng tương tác nhau
Đối tượng
(object)

local data
of object
local data
of operation
entry
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Cấu trúc chương trình OOP
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 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
Đối tượng (Object)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 16
 Đối tượng 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
Kiểu trừu tượng (Abstract type)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 17
 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.
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Kiểu trừu tượng trong Java
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 18
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
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Class (Implementation)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 19
~ 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.
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Ví dụ về ₫ịnh nghĩa class trongVC++
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 20
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?
};

Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Tính bao ₫óng (encapsulation)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 21
 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
Tính thừa kế (inheritance)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 22
 Tính thừa kế 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
Ví dụ về thừa kế và override — VC++
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 23
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;
};
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Tính bao gộp (aggregation)
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM
Môn : Lập trình hướng ₫ối tượng
Slide 24
 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
O
1
O
2
O
3
O
1
O
2
O
3
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng
Ví dụ về bao gộp - VC++
Khoa Công nghệ Thông tin
Trường ĐH Bách Khoa Tp.HCM

Môn : Lập trình hướng ₫ối tượng
Slide 25
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;
};
Chương 2 : Các khái niệm chính của lập trình hướng ₫ối tượng

×