Java: 定义静态读取方法一个抽象的 superclass 及其 child class?

Java: Defining a static read method an abstract superclass and its child class?

我非常纠结于关于继承、抽象 classes 和静态方法的作业。

我们必须定义一个抽象的class房子。 我们必须定义一个 child class RentalHouse。 我们必须定义一个 child class OwnerOccupiedHouse.

所以首先所有的房子class:

public abstract class House {

    private Address address;
    private int nRooms;
    private int salePrice;
    private boolean available;

    public House(Address address, int nRooms, int salePrice, boolean available) {
        this.address = address;
        this.nRooms = nRooms;
        this.salePrice = salePrice;
        this.available = available;
    }

    public Address getAddress() {
        return this.address;
    }


    public int getNRooms() {
        return this.nRooms;
    }


    public int getSalePrice() {
        return this.salePrice;
    }

    public boolean getAvailable() {
        return this.available;
    }

    public static House read(Scanner sc) {
        String line = sc.next();
        if(line.equals("FOR RENT")) {
            return RentalHouse.read(sc);
        }
        else if(line.equals("RENTED"){
            return RentalHouse.read(sc);
        }
        else if(line.equals("FOR SALE"){
            return OwnerOccupiedHouse.read(sc);
        }
        else{ 
            //if(line.equals("SOLD"))
            return OwnerOccupiedHouse.read(sc);
        }

    }
}

问题是关于读取方法的。当然,House object 由于其抽象性而无法实例化。但是,可以创建一个 child object 并分配给类型 House。 在作业中,我必须从具有特定格式的文本文件中读取:

"FOR SALE"
an address
7 rooms
price 1000
"SOLD"
another address
3 rooms
price 500

一旦您知道您正在处理的是 RentalHouse 还是 OwnerOccupiedHouse,作业就会说明。因此,例如,一旦我们读取 "FOR SALE" 或 "SOLD",我们就必须使用这些 classes 中定义的读取方法。我们可以在这些读取方法中找到我遇到的问题。

为了让 reader 更易于理解,我将只展示 RentalHouse 案例,因为两者的主要原则都是相同的 classes。

这里我们有 RentalHouse class:

public class RentalHouse extends House {

    public RentalHouse(Address address, int nRooms, int salePrice, boolean available) {
        super(address, nRooms, salePrice, available);
    }

    public static RentalHouse read(Scanner sc){
        Address address = sc.next()
        int nRooms = sc.nextInt()
        sc.next()
        sc.next()
        int SalePrice = sc.nextInt()
        return new RentalHouse(address, nRooms, SalePrice, **availability**);
    }

我在这个读取方法中遇到的问题是,我们实际上必须决定它的可用性是真还是假。例如,"FOR RENT" 为真,"RENTED" 为假。但是我们已经在抽象的 superclass House.

的 read 方法中遇到了这一行

因此我的问题是:如何根据可用属性为 House 和 RentalHouse 创建读取方法,以便我可以创建 RentalHouse object?

Kevin Anderson 在评论中的回复会起作用,但以防万一您无法更改 read 方法的签名,一个简单的替代方法似乎是这样。

在RentalHouse 或OwnerOccupiedHouse 的读取方法中,始终将availability 设置为true。

将House的读取方式改成这样:

    public static House read(Scanner sc) {

        House h = null;
        String line = sc.next();

        if(line.equals("FOR RENT")) {
            h = RentalHouse.read(sc);
        }
        else if(line.equals("RENTED"){
            h = RentalHouse.read(sc);
            h.available = false;
        }
        else if(line.equals("FOR SALE"){
            h = OwnerOccupiedHouse.read(sc);
        }
        else { 
            //if(line.equals("SOLD"))
            h = OwnerOccupiedHouse.read(sc);
            h.available = false;
        }

        return h;

    }