© 2004, HOÀNG MINH SƠN Chương Kỹ thuật lập trình Phần III: Lập trình hướng ₫ối tượng Chương 5: Lớp ₫ối tượng 0101010101010101100001 0101010101010101100001 StateController 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 start() 1100101100100010000010 1100101100100010000010 stop() 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 1010011000110010010010+ B*u; 1010011000110010010010 y = A*x 1100101100100010000010+ d*u; 1100101100100010000010 x = C*x LQGController 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 start() 1010011000110010010010 stop() 1010011000110010010010 1100101100100010000010 1100101100100010000010 9/15/2006 Nội dung chương © 2004, HỒNG MINH SƠN 5.1 5.2 5.3 5.4 5.5 Khái niệm Từ cấu trúc sang lớp Biến thành viên Hàm thành viên Kiểm soát truy nhập Chương 5: Lớp đối tượng © 2005 - HMS 5.1 Khái niệm Đối tượng gì? Thực thể phần mềm Mơ hình/₫ại diện ₫ối tượng vật lý: — — — — Tank, Heater, Furnace Motor, Pump, Valve Sensor, Thermometer, Flowmeter Control Loop, Control System © 2004, HỒNG MINH SƠN Hoặc ₫ối tượng logic ("conceptual object): — Trend, Report, Button, Window — Matrix, Vector, Polynomial Chương 5: Lớp đối tượng © 2005 - HMS Một ₫ối tượng có Hành vi sủa, cắn, chạy chạy gặp nguy hiểm Các thuộc tính (attributes) Trạng thái (state) • Dữ liệu • Quan hệ © 2004, HỒNG MINH SƠN Hành vi (behavior) • Các phép tốn • Đặc tính phản ứng Căn cước (identity) Ngữ nghĩa/trách nhiệm (semantic/responsibilities) Chương 5: Lớp đối tượng Trạng thái tư sức khỏe Thuộc tính Căn cước Tên: Rex ID: 007 màu lông: vàng giống: Berge Ngữ nghĩa Chó giữ nhà © 2005 - HMS Lớp gì? Một lớp thực thi ₫ối tượng có chung — — — — Ngữ nghĩa Thuộc tính Quan hệ Hành vi Lớp = Đóng gói [Cấu trúc liệu + hàm thao tác] © 2004, HOÀNG MINH SƠN — Lớp vector, lớp ma trận (dữ liệu phần tử + phép truy nhập phép tốn bản) — Lớp hình chữ nhật (các liệu tọa ₫ộ + phép vẽ, xóa, ) — Lớp mơ hình hàm truyền (các hệ số ₫a thức tử/mẫu, phép toán xác ₫ịnh tính ổn ₫ịnh, xác ₫ịnh ₫iểm cực, ) Các liệu lớp => biến thành viên Các hàm lớp => hàm thành viên Các biến lớp => ₫ối tượng, thể nghiệm Chương 5: Lớp đối tượng © 2005 - HMS Lập trình hướng ₫ối tượng (object-oriented programming, OOP) Trừu tượng hóa (abstraction): giúp ₫ơn giản hóa vấn ₫ề, dễ sử dụng lại Đóng gói liệu/che dấu thơng tin (data encapsulation/ information hiding): nâng cao giá trị sử dụng lại ₫ộ tin cậy phần mềm Dẫn xuất/thừa kế (subtyping/inheritance): giúp dễ sử dụng lại mã phần mềm thiết kế © 2004, HỒNG MINH SƠN Đa hình/₫a xạ (polymorphism): giúp phản ánh trung thực giới thực nâng cao tính linh hoạt phần mềm Phương pháp luận hướng ₫ối tượng cho phép tư mức trừu tượng cao gần với giới thực! Chương 5: Lớp đối tượng © 2005 - HMS 5.2 Từ cấu trúc sang lớp © 2004, HỒNG MINH SƠN struct Time { int hour; // gio int min; // phut int sec; // giay }; void addHour(Time& t, int h) { t.hour += h; } void addMin(Time& t, int m) { t.min += m; if (t.min > 59) { t.hour += t.min/60; t.min %= 60; } else if (t.min < 0) { t.hour += (t.min/60 - 1); t.min = (t.min % 60) + 60; } } Chương 5: Lớp đối tượng void addSec(Time& t, int s) { t.sec += s; if (t.sec > 59) { addMin(t, t.sec/60); t.sec %= 60; } else if (t.sec < 0) { addMin(t, t.sec/60 - 1); t.sec = (t.sec % 60) + 60; } } void main() { Time t = {1, 0, 0}; addMin(t,60); addMin(t,-5); addSec(t,25); } © 2005 - HMS Một số vấn ₫ề cấu trúc Truy nhập liệu trực tiếp, khơng có kiểm sốt dẫn ₫ến khơng an tồn Time t1 = {1, 61, -3}; Time t2; int h = t2.hour; int m = 50; t2.min = m + 15; // ??! // Uncertain values // ??! // ??! Không phân biệt “chi tiết bên trong” “giao diện bên ngoài”, thay ₫ổi nhỏ chi tiết bên bắt người sử dụng phải thay ₫ổi mã sử dụng theo! © 2004, HỒNG MINH SƠN Ví dụ: cấu trúc Time ₫ược sửa lại tên biến thành viên: struct Time { int h, m, s; }; Đoạn mã cũ không biên dịch ₫ược: Time t; t.hour = 5; Chương 5: Lớp đối tượng © 2005 - HMS Đóng gói hay "lớp hóa" class Time { int hour; // gio int min; // phut int sec; // giay public: Time() {hour=min=sec=0;} Biến thành viên (member variable) Hàm tạo (constructor) © 2004, HỒNG MINH SƠN void setTime(int h, int m, int s) { hour = h; = sec = 0; addSec(s); addMin(m); } int getHour() { return hour; } int getMin() { return min; } int getSec() { return sec; } Hàm thành viên (member functions) void addHour(int h) { hour += h; } Chương 5: Lớp đối tượng © 2005 - HMS © 2004, HOÀNG MINH SƠN void addMin(int m) { += m; if (min > 59) { hour += min/60; %= 60; } else if (min < 0) { hour += (min/60 - 1); = (min % 60) + 60; } } void addSec(int s) { sec += s; if (sec > 59) { addMin(sec/60); sec %= 60; } else if (sec < 0) { addMin(sec/60 - 1); sec = (sec % 60) + 60; } } void main() { Time t; t.addHour(1); t.addMin(60); t.addMin(-5); t.addSec(25); t.hour = 1; // error t.min = 65; // error t.sec = -3; // error t.setTime(1, 65, -3); int h = t.getHour(); int m = t.getMin(); int s = t.getSec(); } }; Chương 5: Lớp đối tượng © 2005 - HMS 10 5.3 Biến thành viên Khai báo biến thành viên lớp tương tự cấu trúc class Time { int hour, min, sec; }; Mặc ₫ịnh, biến thành viên lớp không truy nhập ₫ược từ bên ngồi (biến riêng), ₫ương nhiên khơng khởi tạo ₫ược theo cách cổ ₫iển: © 2004, HỒNG MINH SƠN Time t = {1, 0, 0}; t.hour = 2; // error! // error! Có thể làm cho biến thành viên truy nhập ₫ược từ bên ngồi (biến cơng cộng), nhiên có lý cần làm thế: class Point { public: int x,y; }; Chương 5: Lớp đối tượng © 2005 - HMS 11 Kiểm sốt việc truy nhập biến riêng thông qua hàm thành viên Cách ₫ể khởi tạo giá trị cho biến thành viên sử dụng hàm tạo: class Time { public: Time() {hour=min=sec=0;} }; Time t; // t.hour = t.min = t.sec = 0; © 2004, HỒNG MINH SƠN Một số biến thành viên có vai trò lưu trữ trạng thái bên ₫ối tượng, khơng nên cho truy nhập từ bên ngồi (ngay gián tiếp qua hàm) class PID { double Kp, Ti, Td; double I; // controller parameters // internal state }; Chương 5: Lớp đối tượng © 2005 - HMS 12 5.4 Hàm thành viên Định nghĩa lớp struct Time { int hour, min, sec }; void addHour(Time& t, int h) { t.hour += h; } class Time { int hour,min,sec; public: void addHour(int h) { hour += h; } }; Gọi hàm với biến cấu trúc Gọi hàm thành viên ĐT Time t; addHour(t,5); Time t; t.addHour(5); © 2004, HỒNG MINH SƠN Định nghĩa cấu trúc & hàm Ở ₫ây có khác cách viết, chưa có khác Chương 5: Lớp đối tượng © 2005 - HMS 13 Khai báo ₫ịnh nghĩa hàm thành viên Thông thường, lớp hàm thành viên ₫ược khai báo tệp tin ₫ầu (*.h) Ví dụ tệp có tên “mytime.h”: class Time { int hour,min,sec; public: void addHour(int h); void addMin(int m); void addSec(int s); }; © 2004, HỒNG MINH SƠN Các hàm thường ₫ược ₫ịnh nghĩa tệp tin nguồn (*.cpp): #include “mytime.h” void Time::addHour(int h) { hour += h; } Chương 5: Lớp đối tượng © 2005 - HMS 14 Có thể ₫ịnh nghĩa hàm thành viên tệp tin ₫ầu dạng hàm inline (chỉ nên áp dụng với hàm ₫ơn giản), ví dụ: inline void Time::addHour(int h) { hour += h;} Một hàm thành viên ₫ược ₫ịnh nghĩa phần khai báo lớp => mặc ₫ịnh trở thành hàm inline, ví dụ class Time { int hour,min,sec; public: void addHour(int h) { hour += h; } }; © 2004, HỒNG MINH SƠN Khi ₫ịnh nghĩa hàm thành viên, sử dụng biến thành viên gọi hàm thành viên khác mà khơng cần (thậm chí khơng thể ₫ược) ₫ưa tên biến ₫ối tượng, ví dụ: void Time::addSec(int s) { addMin(sec/60); } Chương 5: Lớp đối tượng © 2005 - HMS 15 Bản chất hàm thành viên? class Time { int hour,min,sec; public: Time() { hour=min=sec=0; } void addHour(int h) { this->hour += h;// trỏ this ₫ịa } // ₫ối tượng gọi hàm thành viên }; © 2004, HỒNG MINH SƠN void main() { Time t1,t2; t1.addHour(5); t2 = t1; t2.addHour(5); } Chương 5: Lớp đối tượng // // // // Tự ₫ộng gọi hàm tạo Time() cho t1 t2 Có thể hiểu addHour(&t1,5); OK Có thể hiểu addHour(&t2,5); © 2005 - HMS 16 5.5 Kiểm sốt truy nhập public: Các thành viên cơng cộng, sử dụng ₫ược từ bên ngồi private: Các thành viên riêng, truy nhập ₫ược từ bên ngoài, lớp dẫn xuất (sẽ ₫ề cập sau) class Time { private: int hour,min,sec; }; © 2004, HOÀNG MINH SƠN Mặc ₫ịnh, ₫ã khai báo class thành viên private protected: Các thành viên ₫ược bảo vệ, truy nhập ₫ược từ bên ngoài, truy nhập ₫ược lớp dẫn xuất (sẽ ₫ề cập sau) Chương 5: Lớp đối tượng © 2005 - HMS 17 5.6 Con trỏ ₫ối tượng © 2004, HOÀNG MINH SƠN #include "mytime.h" void main() { Time t; // t.addHour(5); Time *pt = &t; // pt->addSec(70); pt = new Time; // pt->addMin(25); delete pt; pt = new Time[5]; // for (int i=0; i < 5; pt[i].addSec(10); delete [] pt; } Chương 5: Lớp đối tượng call constructor Time() pt is identical to this pointer call constructor Time() call constructor times ++ i) © 2005 - HMS 18 Bài tập nhà Dựa cấu trúc Vector hàm liên quan ₫ã thực chương 4, xây dựng lớp ₫ối tượng Vector với hàm thành viên cần thiết Khai báo lớp thực lưu trữ thông tin lớp sinh viên gồm thành phần thuộc tính sau: — Số hiệu sinh viên : Kiểu số nguyên — Họ tên: Chuỗi ký tự — Năm sinh: Kiểu số ngun © 2004, HỒNG MINH SƠN Khai báo ₫ịnh nghĩa mở rộng lớp quản lý sinh viên hàm thành viên thực chức sau: — — — — Nhập họ tên sinh viên Nhập số hiệu sinh viên Nhập năm sinh Tìm hiển thị thơng tin sinh viên biết mã số Chương 5: Lớp đối tượng © 2005 - HMS 19 ... nghiệm Chương 5: Lớp đối tượng © 2005 - HMS Lập trình hướng ₫ối tượng (object-oriented programming, OOP) Trừu tượng hóa (abstraction): giúp ₫ơn giản hóa vấn ₫ề, dễ sử dụng lại Đóng gói liệu/ che... (semantic/responsibilities) Chương 5: Lớp đối tượng Trạng thái tư sức khỏe Thuộc tính Căn cước Tên: Rex ID: 007 màu lông: vàng giống: Berge Ngữ nghĩa Chó giữ nhà © 2005 - HMS Lớp gì? Một lớp thực thi ₫ối tượng có... dung chương © 2004, HỒNG MINH SƠN 5.1 5.2 5.3 5.4 5.5 Khái niệm Từ cấu trúc sang lớp Biến thành viên Hàm thành viên Kiểm soát truy nhập Chương 5: Lớp đối tượng © 2005 - HMS 5.1 Khái niệm Đối tượng