Menu
CoddyTech

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.

challenge icon

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ện Shape cơ sở với các kiểu DrawFunc và AreaFunc.
  • circle.h và circle.c: Phần triển khai Circle từ bài học trước.
  • rectangle.h và 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ên process_shape, nhận một con trỏ Shape*. Hàm này cần gọi hàm draw của hình dạng, sau đó gọi hàm area và in kết quả với 2 chữ số thập phân theo định dạng Area: 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 (c cho hình tròn, r cho 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ên Shape được nhúng bên trong hình dạng đó cho process_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:

  • c theo sau là giá trị bán kính, hoặc
  • r theo 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.54

Ví 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

Tự luyện tập: Trình biên dịch C online