我在编写要求将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的超类,一个返回1的getCalories(),一个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的实例而使它遇到麻烦,无法通过该测试:

 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方法。

07-27 17:22