Ôn tập: Máy tính hình học
Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 33 trên 107.
Thử thách
DễHãy xây dựng một chương trình tính toán hình học kết hợp tất cả các khái niệm về interface trong chương này. Bạn sẽ tạo một hệ thống xử lý thống nhất các hình dạng hình học khác nhau thông qua một interface chung, qua đó minh họa sức mạnh của tính đa hình trong Go.
Bạn sẽ sắp xếp code trong ba tệp:
shape.go: Định nghĩa một interfaceShapecó hai phương thức:Area() float64vàPerimeter() float64. Đồng thời, tạo một hàm tên làDescribeShapenhận bất kỳShapenào và trả về một chuỗi đã định dạng, hiển thị cả diện tích lẫn chu vi của hình.shapes.go: Tạo hai struct triển khai interfaceShape:- Một
Rectanglecó các trườngWidthvàHeight - Một
Circlecó trườngRadius
Area()vàPerimeter(), cùng với phương thứcString()(triển khaifmt.Stringer) để trả về phần mô tả dễ đọc về hình.- Một
main.go: Đọc dữ liệu hình dạng từ đầu vào, tạo các hình tương ứng và dùng hàmDescribeShapeđể hiển thị thông tin về từng hình. Đồng thời, in trực tiếp từng hình để minh họa interfaceStringer.
Đầu vào sẽ có dạng:
- Dòng 1: Chiều rộng hình chữ nhật (số thực)
- Dòng 2: Chiều cao hình chữ nhật (số thực)
- Dòng 3: Bán kính hình tròn (số thực)
Trong các phép tính, dùng 3.14159 làm giá trị pi. Chu vi hình tròn là 2 * pi * radius.
Các phương thức String() cần trả về:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
Hàm DescribeShape cần trả về:
Area: [area], Perimeter: [perimeter]Định dạng tất cả giá trị số thực với hai chữ số thập phân bằng %.2f.
Ví dụ, với các đầu vào 4, 3 và 5, đầu ra cần là:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42In từng hình trước bằng phương thức String(), sau đó in phần mô tả từ DescribeShape. Xử lý hình chữ nhật trước, rồi đến hình tròn.
Tự làm thử
package main
import (
"fmt"
)
func main() {
// Đọc các giá trị đầu vào
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Tạo Rectangle với chiều rộng và chiều cao đã cho
// TODO: Tạo Circle với bán kính đã cho
// TODO: In ra hình chữ nhật (dùng phương thức String())
// TODO: In ra mô tả của hình chữ nhật bằng DescribeShape()
// TODO: In ra hình tròn (dùng phương thức String())
// TODO: In ra mô tả của hình tròn bằng DescribeShape()
}
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng OOP trong Go
Tệp bên ngoàiWorkspace và module trong GoPackage và importTên được export và không được exportGiới thiệu về OOP trong GoStruct như lớpĐịnh nghĩa phương thức cho structReceiver kiểu con trỏ và kiểu giá trịKhởi tạo structHàm khởi tạoÔn tập: máy tính đơn giản4Interface
Giới thiệu về interfaceTriển khai ngầm địnhInterface như một hợp đồngInterface rỗng (any)Khẳng định kiểuswitch kiểuKết hợp interfaceInterface Stringer và ErrorÔn tập: Máy tính hình học7Tính đóng gói
Trường được xuất và không được xuấtĐóng gói ở cấp packagePhương thức getter và setterẨn thông tin trong GoÔn tập: hồ sơ học sinh10Generics (Go 1.18 trở lên)
Giới thiệu về GenericsTham số kiểuRàng buộc kiểuStruct tổng quátGiải pháp thay thế cho phương thức tổng quátÔn tập: tập hợp tổng quát13Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếMẫu SingletonMẫu FactoryMẫu Abstract FactoryMẫu ObserverMẫu Strategy2Tìm hiểu chuyên sâu về kiểu dữ liệu và struct
Kiểu cơ bản và kiểu tổng hợpĐịnh nghĩa kiểu dữ liệu tùy chỉnhThẻ structStruct ẩn danhStruct lồng nhauGiá trị zero và giá trị mặc địnhÔn tập: sổ liên lạc5Ưu tiên kết hợp hơn kế thừa
Vì sao Go không có kế thừaNhập môn nhúng structTự động nâng phương thứcNhúng nhiều structNhúng và kết tậpChe khuất phương thức được nhúngÔn tập: hệ phân cấp nhân viên8Xử lý lỗi và lập trình hướng đối tượng
Giao diện errorCác kiểu lỗi tùy chỉnhBọc lỗi với fmt.ErrorfLỗi sentinelerrors.Is() và errors.As()Panic, defer và recoverÔn tập: trình phân tích tệp3Con trỏ và bộ nhớ
Cơ bản về con trỏ trong GoCon trỏ đến structTruyền theo giá trị và tham chiếuHàm new()Thu gom rác trong GoÔn tập: xây dựng danh sách liên kết6Đa hình trong Go
Đa hình qua interfaceĐịnh kiểu vịt trong GoQuy tắc thỏa mãn interfaceCác tập hợp đa hìnhTiêm phụ thuộcÔn tập: bộ xử lý thanh toán9Lập trình đồng thời và lập trình hướng đối tượng
Cơ bản về goroutineChannel và giao tiếpChannel có bộ đệm và không có bộ đệmCâu lệnh selectsync.Mutex và sync.RWMutexsync.WaitGroupThiết kế struct an toàn luồngÔn tập: worker poolTự luyện tập: Trình biên dịch Go online