所以我有两个数组,
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){ ... }
答案 0 :(得分:4)
一种惯用方法是为GroundEnemy
和FlyingEnemy
创建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,我想以同样的方式与他们互动。他们的工作也非常相似。”
例如,如果FlyingEnemy
和GroundEnemy
都具有stamina
或killed
等属性,或.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
并指定与Enemy
和GroudEnemy
相关的方法。代码:
FlyingEnemy
现在,public interface Enemy {
public void attack(int damage);
}
public interface GroundEnemy extends Enemy { ... }
public interface FlyingEnemy extends Enemy { ... }
和GroudEnemy
都有方法FlyingEnemy
。