You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

抽象父类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:46:19