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