我有一个播放器可以提供狗或砍树。
以下是我写的课程:
public class Dog {
private int health;
public void feed(Food food){
health = health + food.getNutritionalValue();
}
}
public class Player{
public void feed(Dog dog, Food food) {
dog.feed(food);
}
播放器和狗都有"有效" 的方法。
玩家喂狗,狗开始吃食物(我不确定以这种方式结合方法是否合适)。
另一方面,我有树。并且玩家能够砍树。
public class Player {
public void chop(Tree tree) {
//At this point I am not sure
}
我不确定是否会使用树类的 getters 和 setters 来与树进行交互。
或者,如果我应该为此编写一个自己的方法,因为树被切断,所以它不会真正活跃我会打电话。
所以,最后,会有两种或更多种实现,但我想到的是:
tree.setAmountofWood = x
或
tree.gettingChopped(Damage int)
我想我应该为这个斩波过程制作一个自己的方法。
或者我应该遵循任何设计原则吗?
答案 0 :(得分:1)
我会从这样的事情开始。
树会长大并受到伤害。
public class Tree {
private int lumber;
public Tree(int size) {
this.lumber = size;
}
public void grow() {
this.lumber++;
}
public void grow(int size) {
this.lumber += size;
}
public int receiveDamage(int damage) {
int lumber = 0;
if (damage > this.lumber) {
lumber = this.lumber;
this.lumber = 0;
} else {
lumber = damage;
this.lumber -= damage;
}
return lumber;
}
}
食物只是储存营养价值。
public class Food {
private int nutrition;
public Food(int nutrition) {
this.nutrition = nutrition;
}
public int getNutritionalValue() {
return this.nutrition;
}
}
我不确定所有类型的玩家是否都可以砍树,所以我创建了一个分类责任的类。如果愿意,可以将方法移动到Player类。
public class Woodcutter extends Player {
public int chop(Tree tree) {
// lumber amount may depend on a tool,
// i.e. axe, chainsaw, etc.
return tree.receiveDamage(10);
}
// fell down the tree
public int fell(Tree tree) {
int result = 0;
int lumber = 0;
do {
lumber = chop(tree);
result += lumber;
} while (lumber > 0);
return result;
}
}
代码中的某处
// create a tree and let it grow for a while
Tree tree = new Tree(10);
tree.grow(90);
// Start chopping
Woodcutter woodcutter = new Woodcutter();
System.out.println("Lumber received: " + woodcutter.chop(tree));
System.out.println("Lumber received: " + woodcutter.fell(tree));
Dog dog = new Dog();
Food food = new Food(5);
woodcutter.feed(dog, food);
答案 1 :(得分:1)
我不会在这里深入研究被动/主动方法。一个活跃的树'可能确实是用词不当。
我宁愿考虑将对象的方法称为将消息传递给对象。而且您显然需要将消息发送到当前正被某人剪切的树中,并让树决定何时例如fall()
或bend()
或shake()
。
树有一些内部状态(strength
?thickness
的主干?health
?)。 '发送消息'树的意思是调用它的方法,例如, beingCut()
,这反过来又恶化了树的状态。在树的状态达到一定限度之后,其他动作(=树的坏状态的结果)可能由<树> 启动。
当然,正如在你的主循环的每次迭代中,你的树也有机会将消息发送到grow()
,所以它的状态每次都会有所改善,所以最终它甚至可能从仅被部分切割中恢复并恢复其初始完美状态。
所以,是的,虽然树木似乎相当被动,但它们仍然会对信息/刺激作出反应。 : - )
答案 2 :(得分:1)
我在这里看到3条原则,
所以你必须使用
tree.gettingChopped(Damage damage)
致你的代码:
Dog.feed
错误,将其重命名为Dog.eat
,因为狗没有喂食,狗正在吃。顺便说一句,食物必须减少其 NutritionalValue 。