我正在用Java开发游戏,我正在尝试制造可以射击射弹的敌人。我正在为所有敌人类型定义基类,我已经定义了一个抛射类。我想要做的是在基础敌人类中定义一个类类型变量,以及一个在调用时创建定义的射弹类的新实例的shootProjectile()方法。伪代码:
public class EnemyClass extends GameCharacter {
protected Class projectileType;
protected int a;
protected int b;
// Constructor and other stuff here
public void shootProjectile() {
projectileType newProjectile = new projectileType(a, b);
}
}
public class MyEnemySubClass extends EnemyClass {
public MyEnemySubClass() {
super();
projectileType = MySuperProjectile;
}
// Rest of class stuff here
}
public class MySuperProjectile extends Projectile {
public MySuperProjectile(parameter a, parameter b) {
// Constructor stuff using a and b
}
// Other projectile-related stuff
}
当然,我认为在敌人的子类中,我需要做的就是定义他们射击的射弹类,基类中的射弹()方法将完成剩下的工作。
我不知道如何实现这一目标。我已经看过定义泛型,但不知道如何使这个工作符合我的目的,我不确定我是否完全理解它们是如何工作的。这样的东西在Java中是否可能,或者我是否需要为EnemyClass的每个子类覆盖shootProjectile以在攻击时创建自己的抛射物?
提前致谢!
答案 0 :(得分:1)
如果我理解正确,您不需要使用泛型。
如果你想要Enemy
的不同实现拍摄Projectile
的不同实现,那么只需在Projectile shootProjectile()
抽象类中定义抽象方法Enemy
,并按照你认为合适的方式实现它Enemy
子类。
但如果你因某些原因坚持使用它们。他们将参数T
添加到Enemy
类。并将方法定义为T shootProjectile()
。例如:
abstract class Enemy<T extends Projectile> {
abstract T shootProjectile();
}
再一次。在子类中实现,如:
class Sniper extends Enemy<SniperRifleBullet>{
@Override
SniperRifleBullet shootProjectile() {
return new SniperRifleBullet();
}
}
class Projectile{}
class SniperRifleBullet extends Projectile{}
答案 1 :(得分:0)
您有Class.forName()
,getClass().newInstance()
,prototype pattern或functional objects作为选择。在后一种情况下,您将提供一个对象,其唯一目的是创建所需类的实例(即projectileType
变量)。
答案 2 :(得分:0)
更好的方法是使用“射弹工厂”....这样的事情: - 使用createProjectil等单一方法创建一个ProjectileFactory接口。 - 将BaseEnemyClass更改为具有ProjectileFactory的实例,而不是具有Class。
现在你可以用一个工厂建造你的敌人,可以让敌人射击具有特定参数的同一射弹类。