Bài giảng Lập trình hướng đối tượng - Trừu tượng và đóng gói dữ liệu

Khái niệm quan trọng
trong hướng đối tượng

Trừu tượng và phân loại:
phân nhóm sự vật theo
thuộc tính và hành vi, chỉ quan tâm đến những đặc điểm quan trọng, bỏ qua các chi tiết không liên quan.

Một lớp đối tượng là một nhóm đối tượng có cùng tập hợp thuộc tính và hành vi

kiểu dữ liệu cơ bản int hoặc char

kiểu Date (ngày tháng)

Trong C++, các lớp đối tượng được tạo bằng kiểu dữ liệu class ( hoặc struct)

 

ppt32 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 2202 | Lượt tải: 1download
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Trừu tượng và đóng gói dữ liệu, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Trừu tượngvà Đóng gói dữ liệu Lập trình hướng đối tượng Tài liệu đọc Eckel, Bruce. Thinking in C++, 2nd Ed. Vol.1. Chapter 4: Data Abstraction Start at p. 238 (What’s an Object?) Chapter 5: Hiding the Implementation Dietel. C++ How to Program, 4th Ed. Chapter 6: Classes and Data Abstraction From 6.1 to 6.8 Trừu tượng hoáAbstraction Khái niệm quan trọng trong hướng đối tượng Trừu tượng và phân loại: phân nhóm sự vật theo thuộc tính và hành vi, chỉ quan tâm đến những đặc điểm quan trọng, bỏ qua các chi tiết không liên quan. Một lớp đối tượng là một nhóm đối tượng có cùng tập hợp thuộc tính và hành vi kiểu dữ liệu cơ bản int hoặc char kiểu Date (ngày tháng) Trong C++, các lớp đối tượng được tạo bằng kiểu dữ liệu class ( hoặc struct) Khai báo một lớp trong C++ Khai báo một lớp mới (quy ước: tên lớp viết hoa các chữ cái đầu từ) class Car { // Declare the class Car here }; bổ sung các thuộc tính của lớp (các thành viên hoặc thành viên dữ liệu) quyết định kiểu cho các thành viên ( int, char,... hoặc một lớp khác) class Car { int vin; string make; string model; string color; }; Đóng gói – Encapsulation Tư duy con người: lược bớt chi tiết để đơn giản hoá cuộc sống Đóng gói: hoạt động bên trong của một đối tượng có thể được che khỏi thế giới bên ngoài. Hướng đối tượng: đóng gói chi tiết về cách lưu trữ các thuộc tính đóng gói chi tiết về cách thực hiện các hành vi Ví dụ: Số tài khoản được ngân hàng lưu trữ, người gửi tiền không quan tâm ngân hàng lưu trữ số tài khoản như thế nào (mã hoá trong máy tính hay ghi trong sổ sách) miễn là có thể rút tiền khi cần một người có hành vi “đến chỗ làm”, ông chủ không cần quan tâm anh ta đến chỗ làm bằng phương tiên gì....miễn là anh ta đến đúng giờ Đóng gói Trong lập trình hướng đối tượng: che dấu chi tiết về cài đặt của một đối tượng khỏi thế giới bên ngoài. Chi tiết về các thành viên của một đối tượng cần được đóng gói bên trong đối tượng, để cách duy nhất truy nhập đến chúng là qua các hành vi của đối tượng Tương tự, chi tiết về cách thực hiện các hành vi của một đối tượng cũng nên được đóng gói để bên ngoài không biết chi tiết. Tại sao đóng gói đối tượng? Đóng gói bắt chước thế giới thực nếu tôi muốn anh đứng dậy ( thay đổi thuộc tính “vị trí”) khả năng lớn là tôi sẽ đề nghị anh đứng dậy thay vì đến kéo anh dậy. điều này làm đơn giản hoá cuộc sống, ta thường không quan tâm đến chi tiết. Trong lập trình hướng đối tượng, lợi ích của việc đóng gói: khi che dấu chi tiết cài đặt, người dùng bên ngoài không phải bận tâm đến chuyện cái gì được làm như thế nào điều này đem lại lợi ích đáng kể trong việc bảo trì phần mềm – do người dùng không bao giờ biết chi tiết bên trong đối tượng, ta có thể thay đổi các chi tiết đó mà họ không cần biết (miễn là giao diện với bên ngoài không đổi) Đóng gói trong C++ Khái niệm đóng gói có sẵn trong C++ class: ta có thể hạn chế quyền truy nhập đến các thành viên của đối tượng Sử dụng một bộ từ khoáđể mô tả quyền truy nhập: private public protected friend class Car { private: int vin; string make; public: string model; string color; } Đóng gói trong C++ giới thiệu private và public, hai từ khóa còn lại sẽ nói đến sau private: nếu một thành viên của một lớp được khai báo là private, nó chỉ được truy nhập đến từ bên trong lớp đó Mặc định: mọi thành viên của class là private, do đó nhấn mạnh khái niệm đóng gói của lập trình hướng đối tượng. public: Các thành viên được khai báo là public có thể được truy nhập từ bên ngoài đối tượng là mặc định đối với các thành viên của struct Đóng gói trong C++ Ví dụ class MyClass { private: int x; public: int y; void print() { cout #include #include “car.h” using namespace std; ... Định nghĩa các phương thức Khi định nghĩa một phương thức, ta cần sử dụng toán tử phạm vi để trình biên dịch hiểu đó là phương thức của một lớp cụ thể chứ không phải một hàm thông thường khác Ví dụ, định nghĩa phương thức drive của lớp Car được viết như sau // car.cpp ... void Car::drive(int speed, int distance) { 	//method definition } Tên phương thức Tên lớp Toán tử phạm vi Định nghĩa các phương thức Vậy cấu trúc của file nguồn lớp Car có thể như sau: // car.cpp #include #include #include “car.h” using namespace std; void Car::drive(int speed, int distance) {…} void Car::stop() {…} void Car::turnLeft() {…} Phạm vi và phương thức Cũng như các hàm thông thường có một phạm vi (scope), các phương thức cũng vậy đối tượng khai báo (dưới dạng biến tự động) bên trong thân một phương thức có phạm vi là phương thức đó, nó sẽ bị thu hồi khi phương thức kết thúc void Foo::bar() { int x; ... } x ra khỏi phạm vi tại đây Phạm vi và phương thức Các thành viên dữ liệu của một lớp có phạm vi lớp có thể coi phạm vi này ở trên phạm vi phương thức “một bậc” tất cả các thể hiện của một lớp đều nằm trong phạm vi lớp của lớp đó Do vậy, phương thức của một lớp có thể truy nhập thành viên bất kỳ của lớp đó void Foo::bar() { x = 5; ... } Foo::x class Foo { public: void bar(); private: int x; }; Phạm vi và phương thức Tuy nhiên, theo quy tắc thông thường của C++, nếu một tên được dùng tại một phạm vi thấp hơn thì nó “che” tất cả các tên trùng với nó ở các phạm vi cao hơn Do đó, cần cẩn trọng để không sử dụng nhầm void Foo::bar() { int x; x = 5; ... } biến x địa phương class Foo { public: void bar(); private: int x; }; Con trỏ this Một phương thức làm thế nào để biết được nó đang hoạt động trên thể hiện nào của lớp? Mỗi thể hiện của lớp đều có một phạm vi tự động chỉ tới chính thể hiện đó Xét lời gọi phương thức sau Khi lời gọi trên được thực hiện, một con trỏ tới thể hiện f được truyền dưới dạng tham số ẩn cho phương thức bar() cùng với các tham số bình thường khác Con trỏ này cho phương thức biết nó cần làm việc với thể hiện nào. Đó là con trỏ this Foo f; f.bar(); Con trỏ this Phương thức sử dụng con trỏ này để tự động truy nhập tới thành viên bất kỳ mà nó cần vậy trong thực tế, phiên bảnđược hiểu là void Foo::bar() { x = 5; ... } void Foo::bar() { this->x = 5; ... } Con trỏ this Tuy không bắt buộc sử dụng tường minh con trỏ this, ta có thể dùng nó để giải quyết vấn đề tên trùng và phạm vihoặc void Foo::bar() { int x x = 5;	// local x this->x = 6;	// this instance’s x } void Foo::bar(int x) { this->x = x; } Con trỏ this Con trỏ this được các phương thức tự động sử dụng, nên việc ta có sử dụng nó một cách tường minh hay bỏ qua không ảnh hưởng đến tốc độ chạy chương trình Nhiều lập trình viên sử dụng this một cách tường minh mỗi khi truy nhập các thành viên dữ liệu để đảm bảo không có rắc rối về phạm vi ngoài ra, còn để tự nhắc rằng mình đang truy nhập thành viên Lựa chọn có dùng hay không là tuỳ ở mỗi người 

File đính kèm:

  • pptBài giảng Lập trình hướng đối tượng - Trừu tượng và đóng gói dữ liệu.ppt