Menu
CoddyTech

Ôn tập: hệ phân cấp hình dạng

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 32 trên 61.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ phân cấp hình dạng hoàn chỉnh để minh họa sức mạnh của kế thừa thông qua cấu thành. Bạn sẽ tạo một kiểu cơ sở Shape để mọi hình dạng cụ thể có thể kế thừa, sau đó xây dựng Rect mở rộng kiểu này.

Bạn sẽ sắp xếp code trong ba tệp:

  • shape.h: Định nghĩa hệ phân cấp struct bằng các include guard. Tạo struct Shape với một trường color duy nhất (kiểu số nguyên). Sau đó, định nghĩa struct Rect có Shape làm thành viên đầu tiên và thêm các trường width và height (đều là số nguyên). Khai báo hai hàm: set_color nhận một Shape* và giá trị màu mới, còn print_rect nhận một Rect*.
  • shape.c: Triển khai cả hai hàm. Hàm set_color của bạn hoạt động với kiểu cơ sở. Hàm này thay đổi màu của mọi hình dạng. Hàm print_rect hiển thị toàn bộ thông tin của hình chữ nhật, bao gồm cả màu được kế thừa.
  • main.c: Tạo một Rect và khởi tạo tất cả các trường. Sau đó, minh họa việc ép kiểu lên bằng cách gọi set_color với hình chữ nhật được ép sang kiểu Shape*. Cuối cùng, in hình chữ nhật để xác nhận màu đã được thay đổi thông qua con trỏ kiểu cơ sở.

Bạn sẽ nhận bốn đầu vào: width của hình chữ nhật, height của hình chữ nhật, màu ban đầu và màu mới cần đặt bằng hàm tổng quát.

Trong tệp main, hãy tạo hình chữ nhật với các giá trị ban đầu, sau đó dùng set_color để đổi màu thành giá trị mới (nhớ ép Rect* sang Shape*), rồi gọi print_rect để hiển thị kết quả.

Đầu ra của bạn sẽ trông như sau:

Width: 10
Height: 5
Color: 7

Trong đó 10 là chiều rộng, 5 là chiều cao và 7 là màu đã cập nhật (không phải màu ban đầu). Điểm mấu chốt là set_color không biết gì về hình chữ nhật. Hàm này chỉ làm việc với Shape. Tuy vậy, nhờ quy tắc thành viên đầu tiên và việc ép kiểu lên, màu của hình chữ nhật vẫn được thay đổi thông qua hàm tổng quát này.

Tự làm thử

#include <stdio.h>
#include "shape.h"

int main() {
    int width, height, initial_color, new_color;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &initial_color);
    scanf("%d", &new_color);
    
    // TODO: Tạo một Rect và khởi tạo tất cả các trường của nó
    // (width, height và trường color của Shape được nhúng bằng initial_color)
    
    // TODO: Gọi set_color với hình chữ nhật được ép kiểu thành Shape*
    // để đổi màu thành new_color
    
    // TODO: Gọi print_rect để hiển thị kết quả
    
    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