如何在父类Employee中访问子类实例变量以写入文件?
解决父类
writeData方法访问子类实例变量的问题 嘿,我来帮你搞定这个问题~你现在的核心困扰是父类Employee的writeData方法没法直接访问子类Commission的私有成员变量对吧?这其实是面向对象封装性的正常表现,不过有几种优雅的解决办法,我给你梳理一下:
最推荐的方案:利用多态让子类重写writeData
这完全符合面向对象的开闭原则,父类负责处理自己的属性写入,子类扩展自己的部分,代码既清晰又容易维护:
public class Employee { protected String name; protected String employeeNum; protected String department; protected char type; // 父类只处理基础员工信息的写入 public void writeData() throws IOException { // 用追加模式打开文件,避免每次写入覆盖之前的内容 BufferedWriter printer = new BufferedWriter(new FileWriter("fileName", true)); printer.write("姓名: " + name + "\n"); printer.write("员工编号: " + employeeNum + "\n"); printer.write("部门: " + department + "\n"); printer.write("员工类型: " + type + "\n"); printer.flush(); } } public class Commission extends Employee { private int weeksStart; private double baseWeeklySalary; private double salesWeekly; private double totalSales; private double commissionRate; // 子类重写方法,先调用父类的逻辑,再添加自己的属性 @Override public void writeData() throws IOException { super.writeData(); // 先写入父类的基础信息 BufferedWriter printer = new BufferedWriter(new FileWriter("fileName", true)); printer.write("入职周数: " + weeksStart + "\n"); printer.write("周基本工资: " + baseWeeklySalary + "\n"); printer.write("周销售额: " + salesWeekly + "\n"); printer.write("总销售额: " + totalSales + "\n"); printer.write("佣金比例: " + commissionRate + "\n"); printer.write("---\n"); // 用分隔线区分不同员工 printer.close(); } }
小提示:这里用了FileWriter("fileName", true)的追加模式,不然每次写入都会清空文件;另外记得处理IOException,要么抛出要么在方法里捕获哦。
备选方案:通过Getter+类型判断访问子类属性
如果必须在父类的writeData里统一处理所有子类的信息,可以先判断实例类型,强转后通过Getter方法访问子类属性:
首先给Commission类添加Getter方法:
public class Commission extends Employee { // ... 原有变量 ... public int getWeeksStart() { return weeksStart; } public double getBaseWeeklySalary() { return baseWeeklySalary; } // 其他属性的Getter同理,比如getSalesWeekly、getTotalSales等 }
然后修改父类的writeData方法:
public void writeData() throws IOException { BufferedWriter printer = new BufferedWriter(new FileWriter("fileName", true)); // 先写入父类的基础属性 printer.write("姓名: " + name + "\n"); printer.write("员工编号: " + employeeNum + "\n"); printer.write("部门: " + department + "\n"); printer.write("员工类型: " + type + "\n"); // 判断当前实例是不是Commission类型的员工 if (this instanceof Commission) { Commission commEmp = (Commission) this; printer.write("入职周数: " + commEmp.getWeeksStart() + "\n"); printer.write("周基本工资: " + commEmp.getBaseWeeklySalary() + "\n"); // 依次写入其他子类属性 printer.write("---\n"); } printer.close(); }
不过这个方法有个缺点:如果以后新增其他Employee子类,你得不断修改父类的writeData方法,违反了开闭原则,所以除非特殊情况,不建议用这个。
不推荐的方案:把子类属性改成protected
你可能会想,把Commission里的私有变量改成protected,这样父类就能直接访问了。但这会破坏封装性,把子类的内部细节暴露给父类,后续维护起来容易出问题,所以千万别这么做。
总的来说,优先选第一个方案,用多态的方式让子类负责自己的属性写入,代码扩展性和可维护性都更好~
内容的提问来源于stack exchange,提问作者Shah Bari
相关产品推荐
相关产品推荐

