回顾:员工层级结构
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 24 课,共 70 课。
挑战
简单让我们构建一个员工层级系统,综合运用本章介绍的所有继承概念。你将创建一个公司结构,其中不同类型的员工共享常见属性,但奖金的计算方式各不相同。
你将把代码分布在 4 个文件中:
Employee.cs:在Company命名空间中定义基类Employee。每位员工都有一个Name(字符串)和一个Salary(十进制数)。创建一个接受这两个值的构造函数。添加一个名为CalculateBonus()的virtual方法,默认返回工资的 10%。重写ToString(),使其返回"{Name} - ${Salary}"。Manager.cs:在Company命名空间中定义一个继承自Employee的Manager类。经理还有一个额外的TeamSize属性(整数)。构造函数应接受姓名、工资和团队人数,并使用base初始化父类。重写CalculateBonus(),使其返回工资的 15% 加上团队中每位成员 50 美元的奖金。重写ToString(),使其返回"{Name} - ${Salary} (Manager, Team: {TeamSize})"。Developer.cs:在Company命名空间中定义一个继承自Employee的Developer类。开发人员有一个ProgrammingLanguage属性(字符串)。构造函数接受姓名、工资和编程语言。重写CalculateBonus(),使其返回工资的 12%。重写ToString(),使其返回"{Name} - ${Salary} (Developer, {ProgrammingLanguage})"。Program.cs:在主文件中,使用输入值为每种员工类型各创建一个实例。将这三名员工都存储在一个由Employee引用组成的数组中,以展示多态。遍历数组,输出每位员工的ToString()结果,然后输出其奖金。
你将收到 8 个输入:
- 普通员工姓名
- 普通员工工资
- 经理姓名
- 经理工资
- 经理团队人数
- 开发人员姓名
- 开发人员工资
- 开发人员使用的编程语言
按照以下格式输出每位员工的信息和奖金:
{ToString result}
Bonus: ${CalculateBonus result}例如,如果输入依次为 John、50000、Sarah、80000、5、Mike、70000 和 C#,输出应为:
John - $50000
Bonus: $5000
Sarah - $80000 (Manager, Team: 5)
Bonus: $12250
Mike - $70000 (Developer, C#)
Bonus: $8400注意,每种员工类型的奖金计算方式都不同,但你仍然可以通过一个 Employee 数组统一处理他们。这就是将继承与多态结合起来的强大之处!
亲手试试
using System;
using Company;
class Program
{
public static void Main(string[] args)
{
// 读取普通员工的输入
string empName = Console.ReadLine();
decimal empSalary = Convert.ToDecimal(Console.ReadLine());
// 读取经理的输入
string mgrName = Console.ReadLine();
decimal mgrSalary = Convert.ToDecimal(Console.ReadLine());
int teamSize = Convert.ToInt32(Console.ReadLine());
// 读取开发人员的输入
string devName = Console.ReadLine();
decimal devSalary = Convert.ToDecimal(Console.ReadLine());
string progLang = Console.ReadLine();
// TODO:创建一个 Employee、一个 Manager 和一个 Developer
// TODO:将这三个对象存入 Employee 数组,以展示多态
// TODO:遍历数组,打印每位员工的 ToString() 结果和奖金
// 格式:
// {ToString 结果}
// 奖金:${CalculateBonus 结果}
}
}
面向对象编程中的所有课
自己练习: C# 在线编译器