当传递的参数是不同对象的数组时,如何在方法中声明参数类型?

时间:2017-04-25 05:14:47

标签: java arrays object libgdx

所以我有两个数组,

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){ ... }

3 个答案:

答案 0 :(得分:4)

一种惯用方法是为GroundEnemyFlyingEnemy创建an interface(或抽象类)。

例如:

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,我想以同样的方式与他们互动。他们的工作也非常相似。”

例如,如果FlyingEnemyGroundEnemy都具有staminakilled等属性,或.hit().heal()等方法,那么将所有这些放入抽象类中并且不为两种敌人类型重复实现(相同的实现!)可能是有意义的。

请参阅this StackOverflow question and following answers,了解接口概念与抽象类之间差异的相当好的解释。

答案 1 :(得分:0)

面向对象编程的一个优点是你可以完全做到这一点。我假设GroundEmenies和FlyingEnemies有更多共同之处,而不仅仅是渲染过程。什么惯例告诉你在这里做的是创造一个超级类,敌人,它保持飞行和地面敌人之间的相似性。

然后飞行和地面的敌人可以扩展敌人类别。

public class GroundEnemy extends Enemy { ... }
public class FlyingEnemy extends Enemy { ... }

现在,任何与两种类型的敌人共享的属性一起使用的方法都可以使用Enemy作为参数类型。例如:

private void renderEnemy(Array<? extends Enemy> enemies, delta) { ... }

答案 2 :(得分:0)

最好的方法是创建超级界面role_path并指定与EnemyGroudEnemy相关的方法。代码:

FlyingEnemy

现在,public interface Enemy { public void attack(int damage); } public interface GroundEnemy extends Enemy { ... } public interface FlyingEnemy extends Enemy { ... } GroudEnemy都有方法FlyingEnemy