Cách sử dụng đa hình
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 47 trên 61.
Thử thách
DễHãy chứng minh tính đa hình thực sự hoạt động bằng cách viết một hàm có thể xử lý bất kỳ hình dạng nào thông qua con trỏ Shape* cơ sở, dù đó là Circle hay Rectangle.
Dựa trên các phần triển khai Circle và Rectangle hiện có, bạn sẽ thêm một lớp trừu tượng mạnh mẽ: một hàm duy nhất hoạt động thống nhất với mọi kiểu hình dạng.
Dự án của bạn sẽ có các tệp sau:
shape.h: Giao diệnShapecơ sở với các kiểuDrawFuncvàAreaFunc.circle.hvàcircle.c: Phần triển khai Circle từ bài học trước.rectangle.hvàrectangle.c: Phần triển khai Rectangle từ bài học trước.shape.c: Triển khai hàm mới có tênprocess_shape, nhận một con trỏShape*. Hàm này cần gọi hàmdrawcủa hình dạng, sau đó gọi hàmareavà in kết quả với 2 chữ số thập phân theo định dạngArea: X.XX.main.c: Minh họa tính đa hình trong thực tế. Đọc ký hiệu cho biết kiểu hình dạng (ccho hình tròn,rcho hình chữ nhật), sau đó đọc các kích thước cần thiết. Tạo hình dạng tương ứng, rồi truyền con trỏ đến thành viênShapeđược nhúng bên trong hình dạng đó choprocess_shape. Cùng một hàm xử lý được cả hai kiểu!
Chương trình sẽ nhận một trong các dạng đầu vào sau:
ctheo sau là giá trị bán kính, hoặcrtheo sau là giá trị chiều rộng và chiều cao
Ví dụ đầu ra khi đầu vào là c và 5.0:
Drawing Circle with radius: 5.00
Area: 78.54Ví dụ đầu ra khi đầu vào là r, 4.0 và 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Điểm đặc biệt ở đây là process_shape không biết nó đang làm việc với Circle hay Rectangle. Hàm chỉ biết giao diện Shape. Bằng cách ép kiểu thành viên Shape được nhúng bên trong hình dạng cụ thể thành Shape*, bạn có thể truyền bất kỳ kiểu hình dạng nào cho hàm duy nhất này. Đây chính là tính đa hình: một hàm, nhiều hành vi tùy theo kiểu đối tượng thực tế.
Nhớ khai báo process_shape trong shape.h để có thể gọi hàm này từ main.c.
Tự làm thử
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Đọc một ký tự để xác định loại hình ('c' cho hình tròn, 'r' cho hình chữ nhật)
// TODO: Nếu là 'c', đọc bán kính, tạo một Circle rồi gọi process_shape với phần cơ sở của nó
// TODO: Nếu là 'r', đọc chiều rộng và chiều cao, tạo một Rectangle rồi gọi process_shape với phần cơ sở của nó
return 0;
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạng9Dự án: Trình vẽ hình
Tổng quan về dự ánTriển khai hình trònTriển khai hình chữ nhậtCách sử dụng đa hìnhBộ chứa hìnhTự luyện tập: Trình biên dịch C online