我在编写需要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成为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的实例:
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和橙色是食用的实例。
指示中的提示(我不确定这有什么用处):“所有可食用物体都有计算它们含有多少卡路里”。
主题包括:具有抽象和接口的类层次结构。 (这个问题还没有提到,比如在其他项目中比较不同卡路里的方法,这将是这里提到的所有课程的界面。
很抱歉这有点长,但我感谢所有帮助,感谢您花时间阅读所有这些内容。我想如果我提供尽可能多的细节,你们都可以理解我的问题是什么。
答案 0 :(得分:5)
您有多种类型的Fruit
,但这些并非Edible
。您还拥有不Fruit
但仍然Edible
的内容。这意味着那些类型并不相关。
你是对的,一个类只能扩展另一个类,但还有另一种方法。您已经提到了Edible
类,因为它目前还没有添加任何具体功能。对于接口而言,这是一个完美的用例,而不是抽象类。
您提到的测试用例允许这样做,因为您仍然可以将接口类型称为Class
对象。这也是满足&#34;没有构造函数的唯一方法。要求,因为接口不能有构造函数,但类总是至少有一个。测试用例还表示您的界面必须定义getCalories
方法。