Java类作为变量

时间:2014-03-12 21:42:25

标签: java oop reflection

我正在用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以在攻击时创建自己的抛射物?

提前致谢!

3 个答案:

答案 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 patternfunctional objects作为选择。在后一种情况下,您将提供一个对象,其唯一目的是创建所需类的实例(即projectileType变量)。

答案 2 :(得分:0)

更好的方法是使用“射弹工厂”....这样的事情:   - 使用createProjectil等单一方法创建一个ProjectileFactory接口。   - 将BaseEnemyClass更改为具有ProjectileFactory的实例,而不是具有Class。

现在你可以用一个工厂建造你的敌人,可以让敌人射击具有特定参数的同一射弹类。