Bài giảng Lập trình hướng đối tượng - Phương thức ảo và tính đa hình
Khi lớp có phương thức ảo thuần tuý, lớp trở thành lớp cơ sở trừu tượng. Ta không thể tạo đối tượng thuộc lớp cơ sở thuần tuý.
Ta có thể định nghĩa phương thức ảo thuần tuý, nhưng chỉ có các đối tượng thuộc lớp con có thể gọi nó. Xem pta_tt2
Trong ví dụ trên, các hàm thành phần trong lớp Shape là phương thức ảo thuần tuý. Nó bảo đảm không thể tạo được đối tượng thuộc lớp Shape. Ví dụ trên cũng định nghĩa nội dung cho phương thức ảo thuần tuý, nhưng chỉ có các đối tượng thuộc lớp con có thể gọi.
Phương thức ảo thuần tuý có ý nghĩa cho việc tổ chức sơ đồ phân cấp các lớp, nó đóng vai trò chừa sẵn chỗ trống cho các lớp con điền vào với phiên bản phù hợp.
37 trang |
Chia sẻ: maiphuongtl | Lượt xem: 2611 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình hướng đối tượng - Phương thức ảo và tính đa hình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
* Chương 5Phương thức ảo và tính đa hình 5.1 Bài toán quản lý một danh sách các đối tượng khác kiểu 5.2 Vùng chọn kiểu 5.3 Phương thức ảo 5.4 Phương thức thiết lập ảo 5.5 Phương thức ảo thuần tuý * 5.1 Bài toán quản lý một danh sách các đối tượng khác kiểu Giả sử ta cần quản lý một danh sách các đối tượng có kiểu có thể khác nhau, ta cần giải quyết hai vấn đề: Cách lưu trữ và thao tác xử lý. Xét trường hợp cụ thể, các đối tượng có thể là người, sinh viên hoặc công nhân. Về lưu trữ: Ta có thể dùng union, trong trường hợp này mỗi đối tượng phải có kích thước chứa được đối tượng có kích thước lớn nhất. Điều này gây lãng phí không gian lưu trữ. Một cách thay thế là lưu trữ đối tượng bằng đúng kích thước của nó và dùng một danh sách (mảng, dslk,...) các con trỏ để quản lý các đối tượng. Về thao tác, phải thoả yêu cầu đa hình: Thao tác có hoạt động khác nhau ứng với các loại đối tượng khác nhau. Có hai cách giải quyết là vùng chọn kiểu và phương thức ảo. * 5.2 Dùng vùng chọn kiểu Về lưu trữ: Ta sẽ dùng một mảng các con trỏ đến lớp cơ sở để có thể trỏ đến các đối tượng thuộc lớp con. Xét lớp Người và các lớp kế thừa sinh viên và công nhân. Thao tác ta quan tâm là xuat. Ta cần bảo đảm thao tác xuất áp dụng cho lớp sinh viên và lớp công nhân khác nhau. * Dùng vùng chọn kiểu class Nguoi { protected: char *HoTen; int NamSinh; public: Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout Xuat(); cout pl) { case Nguoi::SV: ((SinhVien *)an[i])->Xuat(); break; case Nguoi::CN: ((CongNhan *)an[i])->Xuat(); break; default: an[i]->Xuat(); break; } cout Xuat(); // Mong muon: goi Xuat cua lop sinh // vien, thuc te: goi Xuat cua lop // Nguoi Phương thức ảo cho phép giải quyết vấn đề. Ta qui định một hàm thành phần là phương thức ảo bằng cách thêm từ khoá virtual vào trước khai báo hàm. Trong ví dụ trên, ta thêm từ khoá virtual vào trước khai báo của hàm xuat. * Phương thức ảo class Nguoi { protected: char *HoTen; int NamSinh; public: Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout Xuat(); cout Xuat(); // Goi thao tac xuat cua lop Sinh vien Con troû pn thuoäc lôùp Nguoi nhöng troû ñeán ñoái töôïng sinh vieân, vì vaäy pn->Xuat() thöïc hieän thao taùc xuaát cuûa lôùp sinh vieân. Trôû laïi ví duï treân, khi i a[i] laàn löôït troû ñeán caùc ñoái töôïng thuoäc caùc loaïi khaùc nhau, thao taùc töông öùng vôùi lôùp seõ ñöôïc goïi. Duøng phöông thöùc aûo khaéc phuïc ñöôïc caùc nhöôïc ñieåm cuûa caùch tieáp caän duøng vuøng choïn kieåu: Thao taùc ñôn giaûn khoâng phaûi duøng switch/case vì vaäy khoù sai, deã söûa. * Thêm lớp con mới Dùng phương thức ảo, ta dễ dàng nâng cấp sửa chữa. Việc thêm một loại đối tượng mới rất đơn giản, ta không cần phải sửa đổi thao tác xử lý (hàm XuatDs). Qui trình thêm chỉ là xây dựng lớp con kế thừa từ lớp cơ sở hoặc các lớp con đã có và định nghĩa lại phương thức (ảo) ở lớp mới tạo nếu cần class CaSi : public Nguoi { protected: double CatXe; public: CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns), CatXe(cx) {} void Xuat() const { cout Xuat(); cout Draw(); } * 5.5 Phương thức ảo thuần tuý và lớp cơ sở trừu tượng Lớp cơ sở trừu tượng là lớp cơ sở không có đối tượng nào thuộc chính nó. Một đối tượng thuộc lớp cơ sở trừu tượng phải thuộc một trong các lớp con. Xét các lớp Circle, Rectangle, Square kế thừa từ lớp Shape, xem chương trình nguồn pta_tt.cpp Trong ví dụ trên, các hàm trong lớp Shape có nội dung nhưng nội dung không có ý nghĩa. Đồng thời ta luôn luôn có thể tạo được đối tượng thuộc lớp Shape, điều này không đúng với tư tưởng của phương pháp luận hướng đối tượng. Ta có thể thay thế cho nội dung không có ý nghĩa bằng phương thức ảo thuần tuý. Phương thức ảo thuần tuý là phương thức ảo không có nội dung. * Phương thức ảo thuần tuý và lớp cơ sở trừu tượng Khi lớp có phương thức ảo thuần tuý, lớp trở thành lớp cơ sở trừu tượng. Ta không thể tạo đối tượng thuộc lớp cơ sở thuần tuý. Ta có thể định nghĩa phương thức ảo thuần tuý, nhưng chỉ có các đối tượng thuộc lớp con có thể gọi nó. Xem pta_tt2 Trong ví dụ trên, các hàm thành phần trong lớp Shape là phương thức ảo thuần tuý. Nó bảo đảm không thể tạo được đối tượng thuộc lớp Shape. Ví dụ trên cũng định nghĩa nội dung cho phương thức ảo thuần tuý, nhưng chỉ có các đối tượng thuộc lớp con có thể gọi. Phương thức ảo thuần tuý có ý nghĩa cho việc tổ chức sơ đồ phân cấp các lớp, nó đóng vai trò chừa sẵn chỗ trống cho các lớp con điền vào với phiên bản phù hợp. * Phương thức ảo thuần tuý và lớp cơ sở trừu tượng Bản thân các lớp con của lớp cơ sở trừu tượng cũng có thể là lớp cơ sở trừu tượng, như ví dụ pta_tt3.cpp.
Các file đính kèm theo tài liệu này:
- lthdt_ch5_3588.ppt