有两个" InstanceOf"?

时间:2014-03-30 18:10:26

标签: java

我在编写需要Fruit,a Banana,Orange,Edible,Snowberry和IceCream等课程的代码时遇到了麻烦。在提供给我的测试用例中,我必须编写使Orange和Banana成为Fruit and Edible实例的代码。

此时我的Banana和Orange应该延伸到一个抽象的Fruit类。

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成为我的Edible的“instanceof”。 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());
        }
    }

总而言之,我非常感谢我在Edible课程中应该改变的任何提示,以确保Snowberry是Fruit的一个实例而不是Edible,Banana和Orange是Fruit and Edible,IceCream的实例。只是Edible的一个实例,Edible拥有0个构造函数。

注意:

  • 我尝试将Fruit扩展到Edible,并让Orange和Banana完全通过了JUnit3测试,但之后因为它是Fruit而不是Edible而被困在测试中,因为它是一个水果但不可食用。

  • 根据我的教授的说法,“指示”从未说过Fruit必须扩展到Edible,但这很困惑,因为课程不能扩展到其他2个课程,所以我不知道如何获得Banana和橙色是食用的实例。

  • 指示中的提示(我不确定这有什么用处):“所有可食用物体都有计算它们含有多少卡路里”。

  • 主题包括:具有抽象和接口的类层次结构。 (这个问题还没有提到,比如在其他项目中比较不同卡路里的方法,这将是这里提到的所有课程的界面。

很抱歉这有点长,但我感谢所有帮助,感谢您花时间阅读所有这些内容。我想如果我提供尽可能多的细节,你们都可以理解我的问题是什么。

1 个答案:

答案 0 :(得分:5)

您有多种类型的Fruit,但这些并非Edible。您还拥有不Fruit但仍然Edible的内容。这意味着那些类型并不相关。

你是对的,一个类只能扩展另一个类,但还有另一种方法。您已经提到了Edible类,因为它目前还没有添加任何具体功能。对于接口而言,这是一个完美的用例,而不是抽象类。

您提到的测试用例允许这样做,因为您仍然可以将接口类型称为Class对象。这也是满足&#34;没有构造函数的唯一方法。要求,因为接口不能有构造函数,但类总是至少有一个。测试用例还表示您的界面必须定义getCalories方法。