我在编写要求将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成为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());
}
}
总结一下,对于在我的食用类中应该进行哪些更改,我将不胜感激,以确保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
方法。