Menu
CoddyTech

回顾:员工层级结构

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 40 课,共 107 课。

challenge icon

挑战

简单

让我们为一家公司构建一个员工层级系统,展示组合如何优雅地模拟现实世界中的组织结构。你将创建一个基础员工类型,让专门的角色可以扩展它,并添加各自独特的行为。

你将把代码分布在 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 在线编译器