【问题标题】:Need to represent what food an animal can eat as an array of strings but have food objects instead需要将动物可以吃的食物表示为字符串数组,但有食物对象
【发布时间】:2015-12-08 21:57:11
【问题描述】:

我希望我能清楚地解释这一点。我有一个具有 eats 属性的动物(抽象类),这是一个字符串数组,表示每只动物可以吃什么。这就是我的动物课的样子。

public abstract class Animal {
    String[] eats;

    public Animal (String[] eats) {
        this.eats = eats;
    }
}

我还有一个狮子课,它扩展了我的动物课。规范告诉我,我的狮子会吃芹菜和牛排。我的lion类中的构造函数如下(有编译错误):

public Lion(String[] eats) {
    this.eats = steak, celery; 
}

我在一个食物类中创建了这两个食物对象,每个单独的食物项目都有一个指定的健康价值和废物价值。这是我的美食课:

public class Food {
    int healthGain;
    int wasteGain;
    public static void main(String[] args) {
        Food steak = new Food();
        steak.healthGain = +3;
        steak.wasteGain = 4;
        //same but for celery instead
    }
}    

我真的很困惑,因为我应该为每只动物吃的食物提供一系列字符串,但是我创建了食物对象而不是字符串(规范没有要求我这样做,我只是看不到另一种方法它)。有一个更好的方法吗?或者我可以更改我的代码以使其编译吗?无论哪种方式,每只动物吃的食物都必须是一系列字符串。提前致谢。

【问题讨论】:

  • Food 类有什么用?你们学校最初的问题是什么?

标签: java string object inheritance


【解决方案1】:

您的 Lion 应该如下所示:

class Lion extends Animal{

    public Lion() {
        super(new String[]{"steak", "celery"});
    }

    //...

}

请注意,我们实际上不需要构造函数中的任何参数,因为我们已经知道 Lion 吃什么食物,而且每次创建 Lion 对象时都要求用户提供这些信息是不好的。


顺便说一句,如果您想避免重复此 new String[]{...} 代码,请尝试将您的 Animal 构造函数更改为使用 varargs

public Animal (String... eats) {
//                   ^^^
    this.eats = eats;
}

这仍然允许您将 eats 视为字符串数组 (String[]),因此您可以毫无问题地将其分配给 this.eats,但现在 Lion 构造函数可能如下所示:

public Lion() {
    super("steak", "celery");
}

【讨论】:

    【解决方案2】:

    以下是有关如何进行的简短示例:

    public static void main(String args[]) {
    
        // Initialize this array with food types
        String[] foods = new String[] {"celery", "meat"}; 
        Lion lion = new Lion(foods); // Pass in the foods as an argument
    }
    
    public Lion(String[] eats) {
        super(eats); // Call the overloaded Animal constructor
    }
    

    【讨论】:

    • 为什么还要将eats arg传递给Lion构造函数?什么都没做
    • @robjwilkins 他只想编译代码;我发布了首选的替代方案。
    【解决方案3】:

    这是你应该做的:

    class Lion extends Animal
    {
        public Lion(String[] eats) {
            super(eats); //invoke superclass constructor
        }
    }
    

    由于eats 不是私有的,它将被继承。还要记得调用超类的构造函数,否则会出现编译错误。

    您不会在 Lion 类中对 Lion 吃的东西进行硬编码。您在 main() 中执行此操作:

    //In the main method
    String[] eats = {"celery", "steak"};
    new Lion(eats);
    

    【讨论】:

      猜你喜欢
      • 2014-01-31
      • 2011-06-23
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      相关资源
      最近更新 更多