Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 6: Ngôn ngữ lập trình hướng đối tượng - Nguyễn Văn Hòa

Tóm tắt Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 6: Ngôn ngữ lập trình hướng đối tượng - Nguyễn Văn Hòa: ...  Dựa trên kiểu struct của C và lớp của Simula 67  Lớp của C++ được xem như là kiểu  Dữ liệu được định nghĩa trong lớp là dữ liệu thành viên  Hàm hay phương thức được định nghĩa trong lớp là hàm thành viên  Tất cả các thực thể của lớp điều cĩ cùng phương thức, nhưng mỗi thực thể thì ... { public int DegreeDays { //** DegreeDays is a property get {return degreeDays;} set {degreeDays = value;} } private int degreeDays; ... } ... Weather w = new Weather(); int degreeDaysToday, oldDegreeDays; ... w.DegreeDays = degreeDaysToday; ... oldDegreeDays = w.DegreeDays; 24 Sự .... Chương 9 A B C 30 Hàm xây dựng và hàm hủy (tt) Chương 9 class SmartDir : public ContactDir { private: char *recent; // ten duoc tim gan nhat public: SmartDir(const int max) : ContactDir(max) { recent = 0; } SmartDir(const SmartDir& sd): ContactDir(sd) { recent = 0; } ~SmartDir() ...

pdf38 trang | Chia sẻ: havih72 | Lượt xem: 290 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 6: Ngôn ngữ lập trình hướng đối tượng - Nguyễn Văn Hòa, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1Chương 6: Ngơn ngữ lập 
trình hướng đối tượng
Giảng viên: Ph.D Nguyễn Văn Hịa
Khoa KT-CN-MT – ðH An Giang
2Nội dung chính của chương
 Giới thiệu
 Khái niệm về trừu tượng hĩa
 Trừu tượng hĩa dữ liệu
 Sự đĩng gĩi
 Tính thừa kế
 Một số ngơn ngữ lập trình hướng đối tượng
3Sự phát triển kỹ thuật lập trình
 Mục tiêu của kỹ sư phần mềm
 Tạo ra sản phẩm tốt bằng một cách cĩ hiệu quả
 Nắm bắt được cơng nghệ
 Phần mềm ngày càng lớn
 Hệ điều hành (Unix, Windows) : hàng chục triệu dịng 
lệnh
 Người dùng ngày càng địi hỏi nhiều chức năng
 Phần mềm luơn cần được sữa đổi
4Vì vậy
 Cần kiểm sốt chi phí
 Chi phí phát triển
 Chi phí bảo trì
 Giải pháp chính là sử dụng lại code
 Giảm chi phí và thời gian phát triển
 Nâng cao chất lượng
5ðể sử dụng lại code (mã nguồn)
 Mã nguồn cần dễ hiểu
 Mã nguồn phải chính xác
 Cĩ giao diện (inteface) rõ ràng
 Khơng yêu cầu thay đổi khi sử dụng trong chương 
trình mới
6Giải pháp: LT hướng đối tượng
 Che dấu dữ liệu (che dấu cấu trúc)
 Truy cập dữ liệu thơng qua giao diện xác định
class MyDate {
private int year, mon, day;
public int getDay() {...}
public boolean setDay(int) {...}
...
}
7Khái niệm
 Lập trình hướng đối tượng (OOP- Object-
Oriented Programming)
 Một cách tư duy mới, tiếp cận hướng đối tượng để giải 
quyết vấn đề bằng máy tính
 Một phương pháp thiết kế và phát triển phần mềm dựa 
trên kiến trúc lớp và đối tượng
 Qui trình tiến hĩa của OOP
 Lập trình tuyến tính
 Lập trình cấu trúc (lập trình thủ tục)
 Trừu tượng hĩa dữ liệu
 Lập trình hướng đối tượng
8Tại sao tiếp cận hướng đối tượng
 Loại bỏ những thiếu sĩt của tiếp cận theo thủ tục
 Trong OOP
 Dữ liệu được xem như một phần tử chính yếu và được 
bảo vệ
 Hàm gắn kết với dữ liệu, thao tác trên dữ liệu
 Phân tách bài tốn thành nhiều thực thể (đối tượng) 
xây dựng dữ liệu + hàm cho các đối tượng này
 Tăng cường khả năng sử dụng lại
9ðặc điểm của OOP
 Nhấn mạnh trên dữ liệu hơn là thủ tục
 Các chương trình được chia thành các đối tượng
 Dữ liệu được che giấu và khơng thể được truy 
xuất từ các hàm bên ngồi
 Các đối tượng cĩ thể giao tiếp với nhau thơng qua 
các hàm
 Dữ liệu hay các hàm mới cĩ thể được thêm vào 
khi cần
 Theo tiếp cận từ dưới lên
10
Ưu điểm của OOP
 So với các tiếp cận cổ điển thì OOP cĩ 
những thuận lợi sau:
 OOP cung cấp một cấu trúc module rõ ràng
 Giao diện được định nghĩa tốt
 Những chi tiết cài đặt được ẩn
 OOP giúp lập trình viên duy trì mã và sửa đổi mã tồn 
tại dễ dàng (các đối tượng được tạo ra với những khác 
nhau nhỏ so với những đối tượng tồn tại).
 OOP cung cấp một framework tốt với các thư viện mã 
mà các thành phần cĩ thể được chọn và sửa đổi bởi lập 
trình viên. 
11
Trừu tượng hĩa
 Trừu tượng hĩa là chỉ biểu diễn những đặc điểm 
cần thiết của vấn đề
 Trừu tượng hĩa là nền tảng cơ bản trong lập trình 
(và trong khoa học máy tính)
 Gần như tồn bộ các NNLT đều hỗ trợ trừu tượng 
hĩa tiến trình bằng chương trình con
 Từ 1980s, gần như các NNLT đều được thiết kế 
để hỗ trợ trừu tượng hĩa dữ liệu
12
Ưu điểm của việc trừu tượng hĩa
 Tập trung vào các vấn đề cần quan tâm
 Xác định những đặc tính thiết yếu và những hành 
động cần thiết
 Giảm thiểu những chi tiết khơng cần thiết
13
Các kỹ thuật trừu tượng
 ðĩng gĩi (encapsulation)
 Che dấu thơng tin (information hiding)
 Thừa kế (inheritance)
14
Trừu tượng hĩa dữ liệu
 Kiểu dữ liệu trừu tượng là kiểu do người dùng 
định nghĩa thỏa mãn 2 điều kiện sau:
 Khai báo kiểu và các hành động đối với đối tượng của 
kiểu → cung cấp một giao diện của kiểu
 Kiểu của đối tượng thì được giấu đi đối với bên ngồi, 
cho nên các hành động cĩ thể được cung cấp trong 
phần định nghĩa kiểu
 VD : các số dấu chấm động
15
Che dấu thơng tin
16
Ngơn ngữ C++
 Dựa trên kiểu struct của C và lớp của Simula
67
 Lớp của C++ được xem như là kiểu
 Dữ liệu được định nghĩa trong lớp là dữ liệu thành 
viên
 Hàm hay phương thức được định nghĩa trong lớp 
là hàm thành viên
 Tất cả các thực thể của lớp điều cĩ cùng phương 
thức, nhưng mỗi thực thể thì cĩ dữ liệu riêng
 Thực thể của lớp cĩ thể là tĩnh hoặc động
17
Ngơn ngữ C++ (tt)
 Dấu thơng tin: 3 loại quyền truy xuất đến các 
thành viên trong lớp 
 Thành viên riêng (Private): truy xuất bởi các thành 
viên trong lớp
 Thành viên chung (Public): truy xuất bởi tất cả các 
thành viên sử dụng lớp
 Thành viên bảo vệ (Protected): truy xuất bởi các thành 
viên của lớp dẫn xuất
18
class stack {
private:
int *stackPtr, maxLen, topPtr;
public:
stack() { // a constructor
stackPtr = new int [100];
maxLen = 99;
topPtr = -1;
};
~stack () {delete [] stackPtr;};
void push (int num) {};
void pop () {};
int top () {};
int empty () {};
}
Ngơn ngữ C++ (tt)
19
 Tương tự C++, chỉ trừ:
 Tất cả các kiểu do người dùng định nghĩa đều là 
lớp (Java khơng cĩ structs, union)
 Tất cả các đối tượng được cấp phát vùng nhớ từ 
Heap và được truy cập bằng tham chiếu biến
 Từng hàm và biến trong lớp đều cĩ gán quyền truy 
cập (private or public) khi khai báo
 Java cĩ cơ chế phạm vi thứ hai, phạm vi của gĩi 
(package scope), VD
 import com.acme.utils.AcmeIO; 
 import com.acme.utils.*; 
Ngơn ngữ Java
20
Ngơn ngữ Java
class StackClass {
private int [] *stackRef;
private int [] maxLen, topIndex;
public StackClass() { // a constructor
stackRef = new int [100];
maxLen = 99;
topPtr = -1;
};
public void push (int num) {};
public void pop () {};
public int top () {};
public boolean empty () {};
}
21
Ngơn ngữ C#
 Dựa trên C++ và Java
 Bổ sung hai quyền truy cập, internal và protected 
internal
 Tồn bộ các thực thể lớp đều là Heap dynamic
 Hàm xây dựng mặc định đều cĩ sẵn trong các lớp
 Khởi tao giá trị mặc định 0 cho int và false cho boolean
 Vì garbage collection được dùng trong hầu 
hết các heap objects nên hàm hủy ít khi được dùng
 struct là hình thức đơn giản của class nên khơng hỗ 
trợ thừa kế
22
Ngơn ngữ C# (tt)
 Giải pháp để truy xuất đến dữ liệu thành viên: 
cung cấp phương thức getter và setter
 C# cung cấp property, như trong Delphi, như 
là cách cài đặt phương thức getters và setters 
mà khơng yêu cầu phương thức gọi hàm tường 
minh
 Property cung cấp truy xuất khơng tường minh 
dữ liệu riêng (private) 
23
Ngơn ngữ C#: Property
public class Weather {
public int DegreeDays { //** DegreeDays is a property
get {return degreeDays;} 
set {degreeDays = value;}
}
private int degreeDays;
...
}
...
Weather w = new Weather();
int degreeDaysToday, oldDegreeDays;
...
w.DegreeDays = degreeDaysToday;
...
oldDegreeDays = w.DegreeDays;
24
Sự đĩng gối trong C / C++
 C
 Khơng hỗ trợ trù tượng hĩa dữ liệu
 Tập tin chứa một hoặc nhiều chương trình con cĩ thể 
được biên dịch một cách độc lập
 Giao diện (interface) được dặt trong header file (.h)
 Header file được chèn vào codeSource bằng 
#include
 C++
 Giống như C
 Dùng hàm friend để truy xuất đến các thành viên 
riêng của lớp bạn
25
Sự đĩng gối trong C / C++ (tt)
Class Matrix //** A class declaration
Class Vector{
friend Vector multiply(const Matrix&,const Vector&);
...
};
Class Matrix{ //** The class definition
friend Vector multiply(const Matrix&,const Vector&);
...
};
//**The function that uses both Matrix and Vector class 
Vector multiply(const Matrix&,const Vector&){
...
}
26
C# Assemblies
 Tập hợp các files vào trong một thư viện liên kết động 
DLL (dynamic link library) hoặc file thực thi
(executable)
 Mỗi file cĩ một module được biên dịch độc lập
 Một DLL là tập hợp các lớp và phương thức được liên 
kết một chương trình thực thi
 C# cĩ cơ chế thay đổi quyền truy xuất, internal; một 
thành viên internal của lớp thì được truy xuất bởi tất 
cả các lớp trong assembly mà nĩ xuất hiện
27
Tính thừa kế
 Kế thừa từ các lớp cĩ từ trước.
 Ích lợi: cĩ thể tận dụng lại
 Các thuộc tính chung
 Các hàm cĩ thao tác tương tự
LỚP CHA
(Super class)
LỚP CON
(Sub class)
Lớp cơ sở
(Base class)
Lớp dẫn xuất
(Derived class)
STUDENT
CIT_STUDENT
28
Ví dụ minh họa (tt)
Chương 9
class SmartDir : public ContactDir {
private:
char *recent; // ten duoc tim gan nhat 
public:
SmartDir(const int max) : ContactDir(max) 
{ recent = 0; }
Contact* Recent (void);
Contact* Find (const char *name);
// . 
};
Contact* SmartDir::Recent (void) {
return recent == 0 ? 0 : 
ContactDir::Find(recent);
}
Contact* SmartDir::Find (const char *name) {
Contact *c = ContactDir::Find(name);
if (c != 0) 
recent = (char*) c->Name();
return c;
}
Ký hiệu
Thừa kế
ContactDir Contact
n
SmartDir
29
Hàm xây dựng và hàm hủy
 Trong thừa kế, khi khởi tạo đối tượng:
 Hàm xây dựng của lớp cha sẽ được gọi trước
 Sau đĩ mới là hàm xây dựng của lớp con.
 Trong thừa kế, khi hủy bỏ đối tượng:
 Hàm hủy của lớp con sẽ được gọi trước
 Sau đĩ mới là hàm hủy của lớp cha.
Chương 9
A
B
C
30
Hàm xây dựng và hàm hủy (tt)
Chương 9
class SmartDir : public ContactDir {
private:
char *recent; // ten duoc tim gan nhat 
public:
SmartDir(const int max) : ContactDir(max) 
{ recent = 0; }
SmartDir(const SmartDir& sd): ContactDir(sd)
{ recent = 0; }
~SmartDir() {
delete recent; 
}
// . 
};
Gọi hàm 
xây dựng 
của lớp cha
Thu hồi vùng nhớ
của con trỏ thành viên 
của lớp con nếu đã
cấp vùng nhớ trong 
hàm xây dựng.
31
Thành viên lớp được bảo vệ
 Thừa kế:
 Cĩ tất cả các dữ liệu và hàm thành viên.
 Khơng được truy xuất đến thành viên private.
 Thuộc tính truy cập protected:
 Cho phép lớp con truy xuất.
Chương 9
class ContactDir {
//...
protected:
int Lookup (const char *name);
Contact **contacts; // ds cac doi tac
int dirSize; // kich thuoc hien tai
int maxSize; // kich thuoc toi da
}; 
class Foo {
public:
// cac thanh vien chung...
private:
// cac thanh vien rieng...
protected:
// cac thanh vien duoc bao ve...
public:
// cac thanh vien chung nua...
protected:
// cac thanh vien duoc bao ve nua...
};
32
Chương 9
class A {
private:
int x;
void Fx (void);
public:
int y;
void Fy (void);
protected:
int z;
void Fz (void);
};
class B : A { // Thừa kế dạng private
.
};
class C : private A { // A là lớp cơ sở riêng của B
};
class D : public A { // A là lớp cơ sở chung của C
};
class E : protected A { // A: lớp cơ sở đc bo v
.
};
protectedprivateprotectedprotected
protectedprivatepublicpublic
___private
Thừa kế protectedThừa kế privateThừa kế publicLớp cơ sở
Lớp cơ sở riêng, chung và được bảo vệ
33
ða thừa kế (C++)
Chương 9
OptionList Window
Menu
class Window {
public:
Window (Rect &);
~Window (void);
//...
};
class Menu
: public OptionList, public Window {
public:
Menu (int n, Rect &bounds);
~Menu (void);
//...
};
Menu::Menu (int n, Rect &bounds) :
OptionList(n), Window(bounds)
{ /* ... */ }
OptionList object
OptionList
data members
Window object
Window
data members
Menu object
OptionList
data members
Window
data members
Menu
data members
class OptionList {
public:
OptionList (int n);
~OptionList ();
//...
};
34
Ưu khuyết điểm của đa thừa kế
 Khuyết điểm
 Tạo sự phức tạp trong NN và trong cài đặt (sự mơ hồ: 
sự phức tạp của các quan hệ thừa kế)
 ðơi khi khơng hiệu quả - chi phí liên kết động tăng lên 
với đa thừa kế
 Ưu điểm
 Trong vài trường hợp đa thừa kế rất tiện lợi
35
Sự mơ hồ trong đa thừa kế
Chương 9
class OptionList {
public:
// 
void Highlight (int part); 
};
class Window {
public:
// 
void Highlight (int part); 
};
class Menu : public OptionList, 
public Window
{ . };
void main() { 
Menu m1(.);
m1.Highlight(10);
.
}
Gọi hàm 
của lớp 
nào ?
void main() { 
Menu m1(.);
m1.OptionList::Highlight(10);
m1.Window::Highlight(20);
.
}
Chỉ rõ hàm 
của lớp nào
xử lý
Hàm cùng tên
36
Thừa kế trong Java
 Java chỉ hỗ trợ thừa kế đơn
public class Circle extends Point {//TK từ Point}
 Nhưng sử dụng interface,giống như đa thừa 
kế
public interface interfaceName { final 
constantType
constantName = constantValue; ... 
returnValueType methodName( arguments ); ... 
}
public interface interfaceName extends 
superinterfaceName, ... { 
interface body...
}
37
Thừa kế trong Java (tt)
public interface Human { 
final String GENDER_MALE = "MALE"; 
final String GENDER_FEMALE = "FEMALE"; 
void move(); void talk(); 
}
public abstract class Person implements Human { 
protected int age = 0; 
protected String firstname = "firstname"; 
protected String lastname = "lastname"; 
protected String gender = Human.GENDER_MALE; 
protected int progress = 0; 
public void move() { this.progress++; } 
}
38
Một số NNLThướng đối tượng
 Smalltalk
 C++
 Java
 C#
 Ada 95
 Javascript

File đính kèm:

  • pdfbai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_6_ngon_ngu_lap.pdf