![](/img/trans.png)
[英]With Mockito, how to stub a method with return type void which throws an exception when a certain argument is passed?
[英]How to declare argument type in method when argument passed is an array of different objects?
所以我有两个数组
Array<GroundEnemy> groundEnemies;
Array<FlyingEnemy> flyingEnemies;
然后我有方法将敌人渲染为
renderGroundEnemy(groundEnemies, delta);
renderFlyingEnemy(flyingEnemies, delta);
我将这些方法声明为
private void renderGroundEnemy(GroundEnemy enemies, delta){ ... }
private void renderFlyingEnemy(FlyingEnemy enemies, delta){ ... }
因为渲染飞行敌人的方法与渲染地面敌人的方法相同,所以我想我会重复使用相同的方法。 现在我很困惑如何为方法设置参数类型。 如何设置render方法的参数类型? 我当时在想这样的事情,但我还是不太明白,
private void renderEnemy(ArrayOfObjects enemies, delta){ ... }
一种惯用的方法是为GroundEnemy
和FlyingEnemy
创建一个接口 (或抽象类)。
例如:
public interface Enemy { ... }
public class GroundEnemy implements Enemy { ... }
public class FlyingEnemy implements Enemy { ... }
然后您就可以使用Enemy
:
private void renderEnemy(Array<? extends Enemy> enemies, delta) { ... }
接口与抽象类的选择很重要:接口基本上说:
“我有两件事:FlyingEnemy和PublicEnemy,我想以同样的方式与他们互动。”
扩展抽象类意味着更多:
“我有两件事:FlyingEnemy和PublicEnemy,我想以相同的方式与他们互动。它们的工作方式也非常相似。”
举例来说,如果两个FlyingEnemy
和GroundEnemy
有类似性质stamina
,或killed
,或类似的方法.hit()
或.heal()
-那么它可能是有意义的把所有这些成一个抽象类,而不是重复执行(同实施!)。
请参见此StackOverflow问题和以下答案 ,以很好地解释接口概念与抽象类之间的区别。
面向对象编程的优点之一就是您可以做到这一点。 我假设GroundEmenies和FlyingEnemies有更多的共同点,而不仅仅是渲染过程。 惯例告诉您在这里做的是创建一个超级类,敌人,该类拥有飞行和地面敌人之间的相似之处。
然后,飞行和地面敌人可以扩大敌人的等级。
public class GroundEnemy extends Enemy { ... }
public class FlyingEnemy extends Enemy { ... }
现在,任何能与两种类型的敌人共享的属性一起使用的方法都可以将“敌人”用作参数类型。 例:
private void renderEnemy(Array<? extends Enemy> enemies, delta) { ... }
最好的方法是创建超级接口Enemy
并指定与GroudEnemy
和FlyingEnemy
相关的方法。 编码:
public interface Enemy {
public void attack(int damage);
}
public interface GroundEnemy extends Enemy { ... }
public interface FlyingEnemy extends Enemy { ... }
现在, GroudEnemy
和FlyingEnemy
都有方法attack
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.