回顾:员工层级结构
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 40 课,共 107 课。
挑战
简单让我们为一家公司构建一个员工层级系统,展示组合如何优雅地模拟现实世界中的组织结构。你将创建一个基础员工类型,让专门的角色可以扩展它,并添加各自独特的行为。
你将把代码分布在 3 个文件中:
employee.go:创建基础结构,其中包含ID、Name和BaseSalary(float64)字段。为它添加两个方法:Info() string,返回[ID] [Name]CalculateBonus() float64,返回基本工资的 10%
roles.go:创建两种嵌入Employee的专门员工类型:Manager包含一个TeamSize字段(int):经理的奖金更高,为基本工资的 20%,再加上团队中每位成员 $100。通过遮蔽CalculateBonus方法来实现这一点。Developer包含一个Language字段(string):开发者保留标准奖金,但会遮蔽Info方法,在信息中追加其编程语言:[ID] [Name] ([Language])
main.go:从输入中读取员工详情,创建一位 Manager 和一位 Developer,然后显示每位员工的信息及计算出的奖金。
输入内容如下:
- 第 1 行:Manager 的 ID
- 第 2 行:Manager 的姓名
- 第 3 行:Manager 的基本工资(float64)
- 第 4 行:Manager 的团队人数(整数)
- 第 5 行:Developer 的 ID
- 第 6 行:Developer 的姓名
- 第 7 行:Developer 的基本工资(float64)
- 第 8 行:Developer 的编程语言
对于每位员工,先打印其信息,再在下一行打印其奖金。奖金格式保留两位小数。
例如,给定 M001、Sarah Chen、80000、5、D001、Alex Rivera、65000 和 Go,输出应为:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00请注意,Manager 的奖金计算方式(80000 的 20% + 5×100 = 16500)不同于 Developer 的标准 10% 奖金,而 Developer 会自定义信息的显示方式。这两种类型仍然都可以访问嵌入的 Employee 字段,并能在需要时调用原始方法。
亲手试试
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取 Manager 的详细信息
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// 读取 Developer 的详细信息
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO:使用读取的值创建 Manager
// 提示:使用组合,让 Manager 嵌入 Employee
// TODO:使用读取的值创建 Developer
// 提示:使用组合,让 Developer 嵌入 Employee
// TODO:输出 Manager 的信息和奖金(奖金保留 2 位小数)
// 使用 fmt.Printf 和 "%.2f" 进行格式化
// TODO:输出 Developer 的信息和奖金(奖金保留 2 位小数)
}
面向对象编程中的所有课
自己练习: Go 在线编译器