Kĩ thuật lập trình - Chương 7: Quan hệ lớp

pdf 23 trang vanle 2400
Bạn đang xem 20 trang mẫu của tài liệu "Kĩ thuật lập trình - Chương 7: Quan hệ lớp", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfki_thuat_lap_trinh_chuong_7_quan_he_lop.pdf

Nội dung text: Kĩ thuật lập trình - Chương 7: Quan hệ lớp

  1. Kỹ thuật lập trình ng 1 ươ 010101010101010110000101010101010101011000010101010101010101100001 Chương 7: QuanStateController h010101010010101010010101010101001010101001010101010100101010100101ệ lớp start() 101001100011001001001010100110001100100100101010011000110010010010 Ch stop() 110010110010001000001011001011001000100000101100101100100010000010 010101010101010110000101010101010101011000010101010101010101100001 010101010010101010010101010101001010101001010101010100101010100101 N Ơ 101001100011001001001010100110001100100100101010011000110010010010y = A*x + B*u; 110010110010001000001011001011001000100000101100101100100010000010x = C*x + d*u; LQGController010101010101010110000101010101010101011000010101010101010101100001 start() 010101010010101010010101010101001010101001010101010100101010100101 stop() 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 10/12/2005 2004, HOÀNG MINH S ©
  2. Nộidung chương 7 7.1 Quan hệ lớp 7.2 Dẫnxuấtvàthừakế 7.3 Hàm ảo và nguyên lý ₫ahình/₫axạ 7.4 Ví dụ thư việnkhốichứcnăng N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 2 © 2005 - HMS ©
  3. 7.1 Phân loạiquanhệ lớp ƒ Ví dụ minh họa: Các lớp biểu diễn các hình vẽ trong một chương trình ₫ồ họa —Rectangle Textbox — Square — Ellipse — Circle —Line — Polygon — Polyline —Textbox N Ơ —Group Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 3 © 2005 - HMS ©
  4. Biểu ₫ồ lớp (Unified Modeling Language) Quan hệ dẫnxuất N Ơ Quan hệ chứa Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 4 © 2005 - HMS ©
  5. Các dạng quan hệ lớp (meta model) Class relationship Generalization Association Dependency Aggregation N Ơ Composition Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 5 © 2005 - HMS ©
  6. 7.2 Dẫnxuấtvàthừakế ƒ Ví dụ xây dựng các lớp: Rectangle, Square và Textbox (sử dụng lớp Point) Lớpcơ sở Lớpdẫnxuất N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 6 © 2005 - HMS ©
  7. Thựchiện trong C++: Lớp Point class Point { int X,Y; public: Point() : X(0), Y(0) {} Point(int x, int y): X(x), Y(y) {} int x() const { return X; } int y() const { return Y; } void move(int dx, int dy) { X += dx; Y += dy; } void operator*=(int r) { X *= r; Y *= r; N Ơ } }; Point operator-(const Point& P1, const Point& P2) { return Point(P2.x()-P1.x(),P2.y()-P1.y()); } Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 7 © 2005 - HMS ©
  8. Thựchiện trong C++: LớpRectangle #include #include #include "Point.h" typedef int Color; class Rectangle { Point TL, BR; Color LineColor, FillColor; int LineSize; public: Point getTL() const { return TL; } Point getBR() const { return BR; } void setTL(const Point& tl) { TL = tl; } N Ơ void setBR(const Point& br) { BR = br; } Color getLineColor() const { return LineColor; } void setLineColor(Color c) { LineColor = c; } int getLineSize() const { return LineSize; } void setLineSize(int s) { LineSize = s; } Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 8 © 2005 - HMS ©
  9. Rectangle(int x1=0, int x2=10, int y1=10, int y2=10) : TL(x1,y1), BR(x2,y2), LineColor(256),FillColor(0) {} Point& tl, const Point& br, Color lc, Color fc) : TL(tl), BR(br), LineColor(lc), FillColor(fc) {} void draw() { std::cout 0 ? a : - a; } }; Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 9 © 2005 - HMS ©
  10. Thựchiện trong C++: LớpSquare #include "Rectangle.h" class Square : public Rectangle { public: Square(int x1=1, int y1=0, int a=10) : Rectangle(x1,y1,x1+a,y1+a) {} void resize(int r) { Rectangle::resize(r,r); } }; N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 10 © 2005 - HMS ©
  11. Thựchiện trong C++: Lớp Textbox #include "Rectangle.h" enum AlignType { Left, Right, Center}; class TextBox : public Rectangle { std::string Text; AlignType Align; public: TextBox(const string& text = "Text") : Text(text), Align (Left) {} TextBox(const Point& tl, const Point& br, Color lc, Color fc, const string& text): Rectangle(tl,br,lc,fc), Text(text), Align(Left) {} void draw() { N Ơ Rectangle::draw(); std::cout << Text << '\n'; } }; Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 11 © 2005 - HMS ©
  12. Chương trình minh họa #include "Rectangle.h" #include "Square.h" #include "TextBox.h" #include void main() { Rectangle rect(0,0,50,100); Square square(0,0,50); TextBox text("Hello"); std::cout << "\t Rect area: " << rect.area(); square.draw(); N Ơ std::cout << "\t Square area: " << square.area(); text.draw(); std::cout << "\t Textbox area: " << text.area(); Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 12 © 2005 - HMS ©
  13. getch(); std::cout << "\n\nNow they are moved "; rect.move(10,20); square.move(10,20); text.move(10,20); getch(); std::cout << "\n\nNow they are resized "; rect.resize(2,2); square.resize(2); text.resize(2,2); getch(); } N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 13 © 2005 - HMS ©
  14. Truy nhập thành viên ƒ Cáchàmthànhviêncủalớpdẫnxuấtcóthể truy nhậpthành viên "protected" ₫ịnh nghĩa ở lớpcơ sở, nhưng cũng không thể truy nhập các thành viên "private" ₫ịnh nghĩa ở lớpcơ sở Phảnvídụ: Rectangle rect(0,0,50,100); Square square(0,0,50); square.TL = 10; ƒ Lớpdẫnxuất ₫ược"thừakế" cấutrúcdữ liệu và các phép toán ₫ã ₫ược ₫ịnh nghĩatronglớpcơ sở, nhưng không nhấtthiếtcó quyềnsử dụng trựctiếp, mà phải qua các phép toán (các hàm công cộng hoặc hàm public) N ƒƠ Quyềntruynhậpcủa các thành viên "public" và "protected" ở lớpdẫnxuất ₫ượcgiữ nguyên trong lớpcơ sở Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 14 © 2005 - HMS ©
  15. 7.3 Hàm ảovàcơ chế₫ahình/₫axạ ƒ Trong quá trình liên kết, lời gọi các hàm và hàm thành viên thông thường ₫ược chuyển thành các lệnh nhảy tới ₫ịa chỉ cụ thể của mã thực hiện hàm => "liên kết tĩnh" ƒ Vấn ₫ề thực tế: —Các ₫ối tượng ₫a dạng, mặc dù giao diện giống nhau (phép toán giống nhau), nhưng cách thực hiện khác nhau => thực thi như thế nào? —Một chương trình ứng dụng chứa nhiều kiểu ₫ối tượng (₫ối tượng thuộc các lớp khác nhau, có thể có cùng kiểu cơ sở) => quản lý các ₫ối tượng như thế nào, trong một danh sách hay nhiều danh sách khác nhau? N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 15 © 2005 - HMS ©
  16. Vấn ₫ề củacơ chế "liên kếttĩnh" ƒ Xem lạichương trình trước, hàm Rectangle::draw ₫ềuin ratên "Rectangle" => chưahợplýnêncần ₫ược ₫ịnh nghĩalại ở các lớp dẫnxuất std::cout << "\nSquare:\t[" << getTL() << getBR() << ']'; } void TextBox::draw() { std::cout << "\nTextbox:\t[" << getTL() << getBR() << ' ' << Text << ']'; } N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 16 © 2005 - HMS ©
  17. Chương trình minh họa1 void main() { Rectangle rect(0,0,50,100); Square square(0,0,50); TextBox text("Hello"); rect.draw(); square.draw(); text.draw(); getch(); std::cout << "\n\nNow they are moved "; rect.move(10,20); square.move(10,20); text.move(10,20); getch(); std::cout << "\n\nNow they are resized "; N Ơ rect.resize(2,2); square.resize(2); text.resize(2,2); getch(); } Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 17 © 2005 - HMS ©
  18. Kếtquả: Như ý muốn? Rectangle: [(0,0)(50,100)] Square: [(0,0)(50,50)] Textbox: [(0,0)(10,10) Hello] Now they are moved Rectangle: [(10,20)(60,120)] Rectangle: [(10,20)(60,70)] Rectangle: [(10,20)(20,30)] Now they are resized Rectangle: [(20,40)(120,240)] Rectangle: [(20,40)(120,140)] Rectangle: [(20,40)(40,60)] N Ơ Gọi hàm draw() của Rectangle! Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 18 © 2005 - HMS ©
  19. Chương trình minh họa2 void main() { Quảnlýcác₫ốitượng const N =3; chung trong một danh sách Rectangle rect(0,0,50,100); nhờ cơ chế dẫnxuất! Square square(0,0,50); TextBox text("Hello"); Rectangle* shapes[N] = {&rect, &square, &text}; for (int i = 0; i draw(); getch(); } Kếtquả: các hàm thành viên củalớpdẫnxuất N Ơ cũng không ₫ượcgọi Rectangle: [(0,0)(50,100)] Rectangle: [(0,0)(50,50)] Rectangle: [(0,0)(10,10)] Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 19 © 2005 - HMS ©
  20. Giảipháp: Hàmảo class Rectangle { public: virtual void draw(); } N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 20 © 2005 - HMS ©
  21. Kếtquả: Như mong muốn! Rectangle: [(0,0)(50,100)] Square: [(0,0)(50,50)] Textbox: [(0,0)(10,10) Hello] Chương trình 1 Now they are moved Rectangle: [(10,20)(60,120)] Square: [(10,20)(60,70)] Textbox: [(10,20)(20,30) Hello] Now they are resized Rectangle: [(20,40)(120,240)] Square: [(20,40)(120,140)] Textbox: [(20,40)(40,60) Hello] N Ơ Rectangle: [(0,0)(50,100)] Chương trình 2 Square: [(0,0)(50,50)] Textbox: [(0,0)(10,10) Hello] Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 21 © 2005 - HMS ©
  22. 7.4 Ví dụ thư viện khốichứcnăng ƒ Bài toán: —Xâydựng mộtthư việncáckhốichứcnăng phụcvụ tính toán và mô phỏng tương tự trong SIMULINK —Viếtchương trình minh họasử dụng ₫ơngiản ƒ Ví dụ mộtsơ₫ồkhối 0 Sum StaticGain Limiter Integrator N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 22 © 2005 - HMS ©
  23. Biểu ₫ồ lớp N Ơ Ch2004, HOÀNG MINH S ương 7: Quan hệ lớp 23 © 2005 - HMS ©