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 trình bày về khái niệm về trừu tượng hóa, trừu tượng hóa dữ liệu, sự dóng gói, tính thừa kế, một số ngôn ngữ lập trình hướng đối tượng.
Trang 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
Trang 2N ộ i dung chính c ủ a ch ươ ng
Trang 3S ự phát tri ể n k ỹ thu ậ t l ậ p trình
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ệ
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
Trang 4Vì v ậ y
Chi phí phát triển
Chi phí bảo trì
Giảm chi phí và thời gian phát triển
Nâng cao chất lượng
Trang 5ðể s ử d ụ ng l ạ i code (mã ngu ồ n)
Không yêu cầu thay ñổi khi sử dụng trong chương trình mới
Trang 6Gi ả i pháp: LT h ướ ng ñố i t ượ ng
class MyDate {
private int year, mon, day;
public int getDay() { }
public boolean setDay(int) { }
}
Trang 8T ạ i sao ti ế p c ậ n h ướ ng ñố i t ượ ng
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 toá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
Trang 9ðặ c ñ i ể m c ủ a OOP
xuất từ các hàm bên ngoài
Trang 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
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
Trang 11Tr ừ u t ượ ng hóa
cần thiết của vấn ñề
(và trong khoa học máy tính)
hóa tiến trình bằng chương trình con
ñể hỗ trợ trừu tượng hóa dữ liệu
Trang 13Các k ỹ thu ậ t tr ừ u t ượ ng
đóng gói (encapsulation)
Trang 14Tr ừ u t ượ ng hóa d ữ li ệ u
ñị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 ngoài, cho nên các hành ñộng có thể ñược cung cấp trong
phần ñịnh nghĩa kiểu
Trang 15Che d ấ u thông tin
Trang 16Ngôn ng ữ C++
67
viên
là hàm thành viên
thức, nhưng mỗi thực thể thì có dữ liệu riêng
Trang 18~stack () {delete [] stackPtr;};
void push (int num) {…};
void pop () {…};
int top () {…};
int empty () {…};
Trang 19Tươ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;
Trang 20Ngô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 () {…};
}
Trang 21Ngôn ng ữ C#
Dựa trên C++ và Java
Bổ sung hai quyền truy cập, internal và protected
internal
Toà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ế
Trang 22Ngôn ng ữ C# (tt)
cung cấp phương thức getter và setter
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
dữ liệu riêng (private)
Trang 23Ngôn ng ữ C#: Property
public class Weather {
public int DegreeDays { //** DegreeDays is a property
get {return degreeDays;}
set {degreeDays = value;}
Weather w = new Weather();
int degreeDaysToday, oldDegreeDays;
w.DegreeDays = degreeDaysToday;
oldDegreeDays = w.DegreeDays;
Trang 24S ự ñ ó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
Trang 25Class Matrix{ //** The class definition
friend Vector multiply(const Matrix&,const Vector&);
Trang 26C# 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
Trang 28Contact* Recent (void);
Contact* Find (const char *name);
Trang 29Hà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
Trang 30G ọ i hàm xây d ự ng
Trang 31Thà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
class Foo { public:
// cac thanh vien chung
Trang 32protected
protected private
public
public
_ _
Trang 33Window (Rect &);
~Window (void); //
Menu object
OptionList data members
Window data members
class OptionList { public:
OptionList (int n);
~OptionList ();
//
};
Trang 34Ư u khuy ế t ự i ể m c ủ a ự a th ừ a k ế
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
Trang 36Th ừ a k ế trong Java
Trang 37Th ừ 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++; }