继承Repository的Calculator类无法访问列表新增Employee数据怎么办
问题原因
你创建了两个相互独立的类实例,各自持有一份独立的员工数据列表:
- 主方法中操作的
re是Repository类的实例,你新增的员工都存储在这个实例持有的myEmployeeData列表里 Calculator继承了Repository,你初始化的cal是Calculator类的独立实例,它本身也持有一份myEmployeeData列表,这份列表只有初始的3条数据,和re的列表完全无关,自然看不到后续新增的内容
错误的设计逻辑
你违背了SOLID原则中的核心要求:
- 单一职责原则:
Calculator的核心职责是薪资计算,不是数据存储,不应该继承Repository。继承代表is-a(是一种)的关系,计算器显然不是一种数据仓库 - 依赖倒置原则:高层逻辑不应该直接耦合底层实现,应该通过依赖注入的方式获取需要的服务
修复方案
1. 重构Calculator类,移除继承,改为依赖注入Repository
public class Calculator { public double AnnualPayAfterTax; public double AnnualPay; // 持有外部传入的Repository实例 private readonly Repository _repository; // 构造函数要求传入Repository实例 public Calculator(Repository repository) { _repository = repository; } public double CalculateEmployeePay(int employeeID) { var employee = _repository.Read(employeeID); bool EmploymentStatus = employee.isPermanent; if (EmploymentStatus) { int Salary = (int)employee.Salaryint; int Bonus = (int)employee.Bonusint; AnnualPay = Salary + Bonus; } else { int DayRate = (int)employee.DayRateint; int WeeksWorked = (int)employee.WeeksWorkedint; // 原逻辑错误:临时工薪资应为 日薪*每周5天 * 工作周数,原代码写的是加法 AnnualPay = (DayRate * 5) * WeeksWorked; } if (AnnualPay <= 12570) { AnnualPayAfterTax = AnnualPay; } else { // 原逻辑错误:税后薪资是免税部分+超出部分的80%,原代码仅计算了需要缴纳的税额 AnnualPayAfterTax = 12570 + (AnnualPay - 12570) * 0.8; } return AnnualPayAfterTax; } }
2. 修改主方法的初始化逻辑,保证两个类使用同一份数据
// 先初始化Repository实例 Repository re = new Repository(); // 将同一个Repository实例传入Calculator,保证双方操作的是同一份员工列表 Calculator cal = new Calculator(re);
其他优化建议
- 现有
Read方法是按下标取员工,删除员工后下标和员工ID会不匹配,建议修改为按EmployeeID字段查找:return myEmployeeData.FirstOrDefault(e => e.EmployeeID == employeeID);,避免索引越界错误 - 可以为Repository定义抽象接口,进一步解耦Calculator和具体的Repository实现
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

