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 Lua của Coddy. Bài học 36 trên 70.

challenge icon

Thử thách

Dễ

Hãy tạo một hệ thống phân cấp hình dạng hoàn chỉnh từ đầu! Bạn sẽ tạo lớp cha Shape để mọi hình dạng kế thừa, sau đó tạo các lớp con Circle và Square. Mỗi lớp có thuộc tính riêng, đồng thời dùng chung các chức năng.

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

  • Shape.lua: Lớp cơ sở mà mọi hình dạng sẽ kế thừa. Lớp này cần có hàm khởi tạo :new(color) để lưu màu của hình dạng và phương thức :getColor() để trả về màu đó. Nhờ có thuộc tính dùng chung này, mọi hình dạng, dù là hình tròn hay hình vuông, đều có màu.
  • Circle.lua: Lớp con kế thừa từ Shape. Hàm khởi tạo :new(color, radius) cần gọi hàm khởi tạo của lớp cha để lưu màu, sau đó thêm bán kính làm thuộc tính riêng. Thêm phương thức :describe() để in thông tin của hình tròn.
  • Square.lua: Một lớp con khác kế thừa từ Shape. Hàm khởi tạo :new(color, side) cũng cần gọi hàm khởi tạo của lớp cha, sau đó lưu độ dài cạnh. Thêm phương thức :describe() cho hình vuông.
  • main.lua: Kết hợp mọi thứ bằng cách tạo instance của cả hai hình dạng và cho thấy chúng kế thừa đúng cách từ Shape, đồng thời vẫn giữ các thuộc tính riêng.

Bạn sẽ nhận hai đầu vào:

  1. Dữ liệu hình tròn: màu sắc và bán kính, cách nhau bằng dấu phẩy (ví dụ: blue,5)
  2. Dữ liệu hình vuông: màu sắc và độ dài cạnh, cách nhau bằng dấu phẩy (ví dụ: red,4)

Trong tệp chính, hãy tạo một Circle và một Square với các giá trị đã cho. Sau đó, in các nội dung sau, mỗi nội dung trên một dòng riêng:

  1. Gọi :describe() trên hình tròn
  2. Gọi :describe() trên hình vuông
  3. In màu của hình tròn bằng :getColor()
  4. In màu của hình vuông bằng :getColor()

Phương thức :describe() của Circle cần in:

Circle with radius {radius}

Phương thức :describe() của Square cần in:

Square with side {side}

Ví dụ, nếu đầu vào là blue,5 và red,4, đầu ra sẽ là:

Circle with radius 5
Square with side 4
blue
red

Đây là ví dụ đầy đủ về kế thừa: cả hai hình dạng đều kế thừa :getColor() từ Shape (chúng không tự định nghĩa phương thức này), trong khi mỗi hình có thuộc tính riêng và phương thức :describe()!

Tự làm thử

-- main.lua: Kết hợp mọi thứ

local Circle = require('Circle')
local Square = require('Square')

-- Đọc đầu vào cho hình tròn (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)

-- Đọc đầu vào cho hình vuông (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)

-- TODO: Tạo một instance Circle với màu sắc và bán kính đã cho

-- TODO: Tạo một instance Square với màu sắc và độ dài cạnh đã cho

-- TODO: Gọi :describe() trên hình tròn

-- TODO: Gọi :describe() trên hình vuông

-- TODO: In ra màu sắc của hình tròn bằng :getColor()

-- TODO: In ra màu sắc của hình vuông bằng :getColor()

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 Lua online