[英]Class with Two “InstanceOf”?
我在編寫要求將Fruit,Banana,Orange,Edible,Snowberry和IceCream用作類的代碼時遇到了麻煩。 在提供給我的測試用例中,我必須編寫使Orange和Banana成為Fruit and Edible實例的代碼。
在這一點上,我的香蕉和橙子應該擴展到水果的抽象類。
public abstract class Fruit {
protected String color;
protected double weight;
public Fruit (String color, double weight) {
this.color = color;
this.weight = weight;
}
public Fruit(double weight) {
this.weight = weight;
}
public Fruit() {
}
public abstract double getWeight();
public abstract String getColor();
public abstract double getCalories();
public boolean equals(Object fruit) {
if ((this.getColor() == (((Fruit) fruit).getColor())&& (this.getWeight() == ((Fruit) fruit).getWeight()))) {
return true;
}
else {
return false;
}
}
}
public class Orange extends Fruit {
private String color = "orange";
public Orange (String color, double weight) {
super("orange", weight);
}
public Orange (double weight) {
super(weight);
}
public double getWeight() {
return weight;
}
public String getColor() {
return color;
}
public double getCalories() {
return weight * 5.0;
}
}
public class Banana extends Fruit{
private String color = "yellow";
public Banana (String color, double weight) {
super("yellow", weight);
}
public Banana (double weight) {
super(weight);
}
public double getWeight() {
return weight;
}
public String getColor() {
return color;
}
public double getCalories() {
return weight * 10.0;
}
}
然后,有IceCream成為“我的食用”的“實例”。 IceCream擴展到Edible,在其構造函數中沒有參數,並且具有getCalories()方法以返回1000。根據測試案例中的此信息,我認為由於它是Edible類的實例,因此Edible類也應該沒有它的構造函數中的參數也是如此?
在那之后,我有一個擴展到Fruit類的Snowberry,其超級值為“ white”和.0117,一個getCalories()返回1,還有getColor()和getWeight()方法。 這里的問題是我需要讓Snowberry成為Fruit的實例,而不是Edible的實例。
下面的測試用例讓我為下面的代碼編寫代碼:
public void test_IceCream() {
IceCream ic = new IceCream();
assertEquals(1000.0, ic.getCalories(), 0.0001);
assertFalse(Fruit.class.isAssignableFrom(ic.getClass()));
assertTrue(ic instanceof Edible);
}
public void test_Snowberry() {
Snowberry sb = new Snowberry();
assertEquals(0.117, sb.getWeight(), 0.0001);
assertEquals("White", sb.getColor());
assertFalse(sb instanceof Edible);
assertTrue(sb instanceof Fruit);
從這些測試用例中,我只有IceCream通過JUnit3測試,但是由於Banana和Orange不是Edible實例,因此遇到了香蕉和Orange通過測試的麻煩:
public void test_Orange() {
Orange orange = new Orange(8);
assertEquals(40.0, orange.getCalories(), 0.0001);
assertTrue(orange instanceof Fruit);
assertTrue(orange instanceof Edible);
}
public void test_Banana() {
Banana banana = new Banana(5);
Orange orange = new Orange(8);
assertEquals(50.0, banana.getCalories(), 0.0001);
assertTrue(banana instanceof Fruit);
assertFalse(banana.getColor().equals(orange.getColor()));
assertTrue(banana instanceof Edible);
到目前為止,我的Edible類看起來像這樣,因為我不確定如何處理這種情況:
public abstract class Edible {
public Edible() {
}
}
最后要提到的是,Edible類必須是一個類(我認為),因為有一個測試用例可以檢查它是否是一個類,並且它要求Edible沒有構造函數。
public void test_Edible() {
try {
// Edible should not have any constructor
Class<Edible> clazz = Edible.class;
Constructor<?>[] ctors = clazz.getConstructors();
assertEquals(0, ctors.length);
// but it should have a way to getCalories
Method m = clazz.getMethod("getCalories", new Class[0]);
assertNotNull(m);
assertEquals(Double.TYPE, m.getReturnType());
}
catch (Exception e) {
// not supposed to happen
e.printStackTrace();
fail(e.getMessage());
}
}
總結一下,對於在我的食用類中應該進行哪些更改,我將不勝感激,以確保Snowberry是Fruit而不是Edible的實例,Banana and Orange是Fruit and Edible的instance,IceCream只是一個Edible的實例,並且Edible具有0個構造函數。
筆記:
我曾嘗試將Fruit擴展到Edible,並讓Orange和Banana完全通過JUnit3測試,但是后來由於失敗了,因為它是Fruit但不是Edible,被困在Snowberry失敗了。
根據我的教授的說法,《指示》從未說過必須將Fruit擴展到Edible,但這很困惑,因為一個類不能擴展到另外2個類,所以我不確定如何將Banana和Orange用作Edible的實例。 。
指令中的提示(我不確定這有什么幫助):“所有可食用對象都有一種計算它們所含卡路里的方式”。
主題涵蓋:具有抽象和接口的類層次結構。 (這個問題還有很多未提及的問題,例如一種比較其他項目之間不同卡路里的方法,這將是此處提到的所有類的接口。
抱歉,這有點長,但是我很感謝我能獲得的所有幫助,並感謝您抽出寶貴的時間閱讀所有這些內容。 我認為,如果我提供盡可能多的詳細信息,那么大家可能都會明白我的問題所在。
您有幾種類型的Fruit
,但並非全部Edible
。 您還擁有並非Fruit
東西,但仍可Edible
。 這意味着這些類型無關。
沒錯,一個類只能擴展另一個類,但是還有另一種方法。 您已經提到了Edible
類,因為當前它沒有添加任何具體功能。 這是接口而不是抽象類的完美用例。
您提到的測試用例允許這樣做,因為您仍然可以將接口類型稱為Class
對象。 這也是滿足“無構造函數”要求的唯一方法,因為接口不能具有構造函數,但是類始終至少具有一個構造函數。 測試用例還說您的接口必須定義getCalories
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.