Phương thức tính chu vi
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 58 trên 70.
Thử thách
DễHãy mở rộng Shape Manager bằng cách thêm phương thức :getPerimeter() vào cả hai lớp Rectangle và Circle. Giống như :getArea(), mỗi hình tính chu vi theo cách khác nhau, nhưng chúng dùng chung tên phương thức: đây là ví dụ điển hình về tính đa hình.
Bạn sẽ tiếp tục làm việc với các tệp hiện có:
Shape.lua: Lớp Shape cơ sở vẫn giữ nguyên.Rectangle.lua: Thêm phương thức:getPerimeter()để trả về chu vi hình chữ nhật theo công thức 2 × (width + height).Circle.lua: Thêm phương thức:getPerimeter()để trả về chu vi hình tròn theo công thức 2 × π × radius. Dùngmath.picho π.main.lua: Yêu cầu cả hai module hình dạng, đọc các kích thước từ đầu vào, tạo một Rectangle và một Circle, sau đó in ra sáu dòng: tên, diện tích và chu vi của hình chữ nhật, rồi đến tên, diện tích và chu vi của hình tròn.
Cả hai hình giờ đều có giao diện hoàn chỉnh với :getName(), :getArea() và :getPerimeter(): bạn có thể gọi chúng bằng cùng tên phương thức dù cách triển khai khác nhau.
Đầu vào: Ba dòng: width (số), height (số) và radius (số).
Đầu ra: Sáu dòng theo thứ tự: tên hình chữ nhật, diện tích hình chữ nhật, chu vi hình chữ nhật, tên hình tròn, diện tích hình tròn, chu vi hình tròn.
Tự làm thử
-- Nạp module Rectangle
local Rectangle = require('Rectangle')
-- Nạp module Circle
local Circle = require('Circle')
-- Đọc chiều rộng và chiều cao từ đầu vào
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Tạo instance Rectangle mới với kích thước đã cho
local rect = Rectangle:new(width, height)
-- Tạo instance Circle mới với bán kính đã cho
local circ = Circle:new(radius)
-- In ra tên, diện tích và chu vi của hình chữ nhật
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- In ra tên, diện tích và chu vi của hình tròn
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
Tất cả bài học trong Lập trình hướng đối tượng
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền7Đa hình và ghi đè
Ghi đè phương thứcGọi phương thức của lớp chaGõ kiểu vịtGiao diện chungKiểm tra kiểuÔn tập: Vai trò của nhân viên10Dự án: Quản lý hình dạng
Thiết lập dự ánLớp hình chữ nhậtLớp hình trònPhương thức tính chu viTập hợp hình dạngTổng diện tíchLọc hình dạng2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online