intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

CHƯƠNG 8 THỪA KẾ ẢO-TÍNH ĐA HÌNH

Chia sẻ: Nguyen Quoc Thuy | Ngày: | Loại File: PDF | Số trang:21

76
lượt xem
14
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Đa hình: “nhiều hình thức”, hành động cùng tên có thể được thực hiện khác nhau đối với các đối tượng/các lớp khác nhau.

Chủ đề:
Lưu

Nội dung Text: CHƯƠNG 8 THỪA KẾ ẢO-TÍNH ĐA HÌNH

  1. CH CHƯƠNG 8 THỪA KẾ ẢO-TÍNH ĐA HÌNH 1 GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  2. MỤC TIÊU 2 Giới thiệu khái niệm thừa kế ảo, hàm ảo Tính đa hình trong lập trình hướng đối tượng GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  3. NỘI DUNG CHI TIẾT 3 TÍNH ĐA HÌNH OVERLOADED VÀ OVERRIDDEN LIÊN KẾT TĨNH LIÊN KẾT ĐỘNG HÀM HÀM ẢO THỪA KẾ ẢO GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  4. Tính Đa Hình(Polymorphism) 4 Đa hình: “nhiều hình thức”, hành động cùng tên có thể được thực hiện khác nhau đối với các đối tượng/các lớp khác nhau. Ngữ cảnh khác kết quả khác Đ i ểm Đường Thẳng Hình Tròn Hình Vuông Vẽ GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  5. TÍNH ĐA HÌNH 5 Khả năng có những hiện thực khác nhau cho cùng một hành vi Kỹ thuật cho phép thay đổi nội dung của cùng 1 hành vi trong 2 lớp cha – con Bản chất: Sửa code của cùng 1 hành vi ở 2 lớp cha con để code này khác nhau khá Đa hình tạo ra khả năng cho phép gọi một hành vi của một lớp mà không cần quan tâm đến hiện thực của hành vi này. GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  6. VÍ DỤ VỀ TÍNH ĐA HÌNH class CIRCLE class ĐànBà int x,y,r; void Draw ()() void DiChuyển(); { circle (x,y,r); } class RECTANGLE RECTANGLE class SHAPE int x1,y1, x2, y2; void Draw () class Người void Draw () { void DiChuyển(); { rectangle(x1,y1, x2, y2); } } class TRIANGLE int x1,y1, x2, y2 , x3, y3; class ĐànÔng void Draw () void DiChuyển(); DiChuy { line(x1,y1, x2, y2); line(x2,y2, x3, y3); line(x3,y3, x1, y1); Đa hình tạo được tính mềm dẻo/linh động } của chương trình ch trình GV:Slideồ6/54ảo Châu Võ H ng B OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  7. OVERLOADED VÀ OVERRIDDEN 7 Overloaded methods: Nhằm cung cấp các dạng khác nhau của hành vi (danh sách tham số khác nhau), nhưng vẫn có cùng tên gọi trong cùng một lớp. Overridden methods: Hiện thực lại hành vi đã có của tổ tiên Phải có cùng tên và trùng mọi yếu tố tạo nên hành vi này. GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  8. LIÊN KẾT TĨNH 8 Liên kết tĩnh (static binding): Xác định khi biên dịch chương trình. Dùng hàm thành viên. Gọi hàm của lớp cơ sở (lớp cha). class ContactDir { ContactDir class SortedDir : public ContactDir { SortedDir //... public: public: SortedDir(const int max) : int Lookup (const char ContactDir(max) {} *name); int Lookup(const char *name); //... }; }; void main() { cout
  9. LIÊN KẾT ĐỘNG 9 Liên kết động (dynamic binding) Xác định khi thực thi chương trình. Gọi hàm của lớp Dùng hàm ảo (virtual function). nào ? Gọi hàm của lớp dẫn xuất (lớp con). Thể hiện tính đa hình của OOP. class ContactDir { ContactDir void main() { //... ContactDir c1(10); c1(10); public: SortedDir *p1; p1 = &c1; virtual int Lookup (const char cout
  10. HÀM ẢO 10 Xem Xem kết qủa của việc khái quát hóa sau: Bạn có hình dung nổi một class ANIMAL Không ANIMAL di void Travel(); Dùng hàm ảo chuyển như thế nào không? class Bird class Fish class Snake Bạn có hình dung nổi có hình dung void Travel() void Travel() void Travel() một đối tượng thuộc các lớp này di chuyển Có cụ thể như thế nào không? GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  11. HÀM ẢO 11 Là kết qủa của việc khái quát hóa qúa cao đến nỗi không biết viết code thế nào. Là những hành vi chỉ khai báo mà không viết code. Để dành code cụ thể sẽ được hiện thực ở các lớp dẫn xuất ( lớp cụ thể hơn). Tư duy tự nhiên: Từ các đối tượng cụ thể hàm cụ thể. Từ các lớp cụ thể có cùng tính chất hàm ảo. GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  12. KHAI BÁO HÀM ẢO 12 Cú pháp: Class Tên lớp { … public: virtual Tên hàm ảo () { } … } GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  13. VÍ DỤ 13 Động cơ Nhiên liệu Động cơ xăng Động cơ diezel Nhiên liệu Nhiên liệu Động cơ 2 thì Động cơ 4 thì Nhiên liệu Nhiên liệu GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  14. Class DongCoDiezel{ public: Class DongCo{ void NhienLieu(){ public: cout
  15. PHÂN LOẠI PHƯƠNG THỨC ẢO 15 Phương thức ảo rỗng Khai báo nhưng không làm gì Dùng tạo sự liên kết động trong hệ thống lớp kế thừa. Có Có thể khai báo đối tượng thuộc lớp có phương thức ảo rỗng và gởi thông điệp đến đối tượng đó. Ví dụ: DongCo obj; obj.NhienLieu(); Phương thức ảo thuần Lớp chứa phương thức này được gọi là lớp trừu tượng. Không thể khai báo đối tượng thuộc lớp này cũng như không thể gởi thông điệp đến phương thức ảo thuần. Class A{ public : virtual void NhienLieu()=0; GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  16. VÍ DỤ HÀM ẢO – TÍNH ĐA HÌNH 16 GIÁ THÀNH Dữ liệu: đơn giá Phương thức: HÀM ẢO +giá thành +diện tích +trị giá HÌNH TRÒN HÌNH CHỮ NHẬT Dữ liệu: bán kính Dữ liệu: dài, rộng dà Phương thức: Phương thức: +khởi tạo +khởi tạo +diện tích +diện tích GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  17. 17 class GIATHANH{ class HINHCN: public GIATHANH{ HINHCN: public GIATHANH{ protected: float dongia; float dai,rong; public: public: giathanh (float c){ dongia=c);}; HINHCN(float d,float r, float c): virtual dientich(){ virtual dientich(){ } GIATHANH(c){ float trigia() { return dientich()*dongia;} Nếu không khaidai=d;rong=r;} báo } float dientich(){ return dai*rong;} hàm dientich};là hàm ảo }; class HINHTRON: public GIATHANH{ class HINHTRON: public GIATHANH{ thì kết quả chương trình float bk; voidgì? là main(){ public: HINHTRON a(5,1000); HINHTRON(float r, float c): HINHCN b(2,4,2000); GIATHANH(c){ cout
  18. THỪA KẾ ẢO 18 class A class C class B class D GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  19. Ví dụ 19 class A{ int dulieu; //... }; class B: public A{}; class C: public A{}; class D: public B, public C{ //... ? }; D có 2 thành phần D thừa kế A → = phần hành vi Dư thừa dữ liệu dữ liệu và 2 thành “2 lần” GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
  20. Giải quyết 20 Để tránh tình trạng một thành phần trong lớp A xuất hiện 2 lần trong lớp D, sử dụng thừa kế ảo class B: virtual public A{}; class C: virtual public A{}; class D: public B, public C{ //... }; GV: Võ Hồng Bảo Châu OOP-CHƯƠNG 8-THỪA KẾ ẢO-TÍNH ĐA HÌNH
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
3=>0