簡體   English   中英

有兩個“ InstanceOf”的類?

[英]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成為F​​ruit的實例,而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM