抽象父类House与子类RentalHouse的静态read方法实现问题
解决子类
read方法无法获取available状态的问题 这个问题的核心是父类House的read方法已经读取并处理了状态标识,但没把对应的available值传递给子类,导致子类没法正确初始化对象。我给你两种可行的解决方案,推荐第一种,因为它能避免重复逻辑:
方案1:父类解析状态后传递available给子类read方法
我们可以修改父类的read方法,先解析状态标识得到available的值,再把这个值和Scanner一起传给子类的read方法,让子类直接用这个值创建对象。
修改后的父类House代码:
public abstract class House { // 原有属性、构造方法、getter方法保持不变 public static House read(Scanner sc) { String status = sc.next(); boolean available; // 根据状态标识计算available的值 switch(status) { case "FOR RENT": case "FOR SALE": available = true; break; case "RENTED": case "SOLD": available = false; break; default: throw new IllegalArgumentException("Unknown house status: " + status); } // 根据状态选择对应子类,传递available参数 if (status.equals("FOR RENT") || status.equals("RENTED")) { return RentalHouse.read(sc, available); } else { return OwnerOccupiedHouse.read(sc, available); } } }
修改后的RentalHouse代码:
public class RentalHouse extends House { // 原有构造方法保持不变 // 新增参数接收available值 public static RentalHouse read(Scanner sc, boolean available){ Address address = sc.next(); // 注意:如果Address是自定义类,建议用Address.read(sc)来构建对象 int nRooms = sc.nextInt(); sc.next(); // 跳过文件中多余的固定字段,根据你的实际文件格式调整 sc.next(); int salePrice = sc.nextInt(); // 修正变量名大小写,符合Java命名规范 return new RentalHouse(address, nRooms, salePrice, available); } }
方案2:传递状态标识给子类,由子类自行判断available
如果更希望子类自己处理状态逻辑,可以把读取到的状态字符串传递给子类,由子类判断available:
父类read方法修改:
public static House read(Scanner sc) { String status = sc.next(); if (status.equals("FOR RENT") || status.equals("RENTED")) { return RentalHouse.read(sc, status); } else { return OwnerOccupiedHouse.read(sc, status); } }
RentalHouse方法修改:
public static RentalHouse read(Scanner sc, String status){ Address address = sc.next(); int nRooms = sc.nextInt(); sc.next(); sc.next(); int salePrice = sc.nextInt(); boolean available = status.equals("FOR RENT"); return new RentalHouse(address, nRooms, salePrice, available); }
额外注意点
- 遵循Java命名规范:把变量名
SalePrice改为小写salePrice - 如果
Address是自定义类,不要直接用sc.next(),建议为Address也实现一个read(Scanner sc)静态方法,保证对象构建的一致性 - 可以在父类的
read方法中对未知状态抛出异常,避免创建无效对象
内容的提问来源于stack exchange,提问作者Just van der Veeken
相关产品推荐
相关产品推荐

