在创建此对象的新实例时滚动对象

时间:2012-09-26 22:46:04

标签: java object selection instanceof

在我的游戏中,当您按下鼠标右键时,您会将一个物体放在地面上。所有对象都具有相同的超类(GameObject)。 我有一个名为selected的字段,一次将等于某个某个游戏对象。 当单击鼠标右键时,它会检查所选实例以及它如何确定放置在地面上的对象。代码exapmle: t是对象将要进入的“槽”。

if (selected instanceof MapleTree) {
    t = new MapleTree(game,highLight);
} else if (selected instanceof OakTree) {
        t = new OakTree(game,highLight);
}

现在它必须是对象的“新”实例。最终我的游戏将有数百个GameObjects,我不想有一个巨大的if else声明。我如何制作它以便滚动可能的对象类型,如果它是正确的类型然后创建它的新实例...?

当按E时,它将切换所选的类型,并且也是if else语句。我怎么能这样做呢?这是一个代码示例:

if (selected instanceof MapleTree) {
        selected = new OakTree(game);
} else if (selected instanceof OakTree) {
    selected = new MapleTree(game);
}

3 个答案:

答案 0 :(得分:2)

听起来你很擅长使用Prototype

OR

如果你想坚持使用显式路线,你可以使用工厂方法的HashMap。

OR

如果你想隐式和自动化你可以使用反射来操作实例类并检索随后被调用的构造函数:http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

OR

上述一些方法的混合将是确保每个类还实现静态(或不是)工厂方法,如getInstance(),然后当你有匹配的对象时,你可以调用直接在该对象上的工厂方法(或在其类上保持静态静态)。这有点自动但更容易遵循。

答案 1 :(得分:0)

我对Java知之甚少,但是建议你至少用你很长的if-else树进行交易,以获得更好的可读性,可能更快switch statement

答案 2 :(得分:0)

这是一个使用一些反射的例子。它假定按照惯例,您在所有GameObject子类中都具有相同的构造函数签名。

如果你想“滚动浏览所有对象的列表”,你必须自己维护一组所有不同的类。然后,您可以使用相同的方法构建一个新的克隆和现有方法。

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class GameTest {

public static class Game {
    // TODO
}
public static abstract class GameObject {
    protected GameObject( Game game ) {
        // TODO
    }
}

public static class MapleTree extends GameObject {
    // Copy constructor
    public MapleTree( MapleTree tree, Game game ) {
        super( game );
        // TODO, copy
    }
}

public <T extends GameObject> T buildNew( Class<T> clazz, Game game ) {
    try {
        final Constructor<T> constructor = clazz.getConstructor( Game.class );
        return constructor.newInstance( game );
    }
    catch ( NoSuchMethodException | SecurityException
        | InstantiationException | IllegalAccessException
        | IllegalArgumentException | InvocationTargetException e ) {
        e.printStackTrace();
    }
    return null;
}

public GameObject cloneSelected( GameObject selected, Game game ) {
    return buildNew( selected.getClass(), game );
}
}