繁体   English   中英

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

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

一种惯用的方法是为GroundEnemyFlyingEnemy创建一个接口 (或抽象类)。

例如:

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有类似性质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并指定与GroudEnemyFlyingEnemy相关的方法。 编码:

public interface Enemy { 
   public void attack(int damage);
}
public interface GroundEnemy extends Enemy { ... }
public interface FlyingEnemy extends Enemy { ... }

现在, GroudEnemyFlyingEnemy都有方法attack

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM