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;
}
我非常纠结于关于继承、抽象 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;
}