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() ...
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:
bai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_6_ngon_ngu_lap.pdf



