2011-07-29 38 views
0

我遇到了一些問題。我有一個名爲「GameScreen」的課程,它將知道選擇了哪個級別和階段。從那我可以建立一個字符串來建議像「level1_1」或「level1_2」的東西。問題是我現在如何加載這個類?根據級別/階段加載課程?

我打算使用Class.forname(string)但是每個級別都是不同的類,所以如何將新運算符傳遞給類?

我想要實現這樣的事情...... world = new World(worldListener);其中「世界」是諸如「level1_1」的類。

希望是有道理的。

+0

沒有意義...你在問反射嗎? – Randy

+0

是的,如果我使用Class c = Class.forName(「java.lang.String」);我怎麼會允許它被創建爲「新」,所以它不會導致空指針? – Chris

回答

2

除了一個事實,即有實現這個更好的方法(見其他的答案,例如),這應該工作(沒有測試過,忽略異常,可引起腹脹等):

public World createWorld(String levelClassName, WorldListener listener) throws Exception 
{ 
    Class<?> clazz = Class.forName(name); 
    Constructor<World> ctor = (Constructor<World>) clazz.getConstructor(WorldListener.class); 
    World world = ctor.newInstance(listener); 

    return world; 
} 
+1

儘管如此, *更好的方法來設計這個 –

+0

非常感謝,我可以理解抽象的方式,但我無法看到整個「1_1」或「1_2」類參數的一種解決方法 – Chris

+0

創建一個「LevelManager」類,它需要階段和級別,然後在其自己的方法中調用適當的方法? – Chris

1

您必須使用反射(java.lang.reflect中)

首先,即使每個級別的類是不同的,他們都應該擴展/實現一個共同的超類/接口等等基本操作都可用(VG一個構造函數,一個startLevel()方法等)。

通過反思,您可以選擇與您的關卡相關的類,實例化它,並將其傳遞給引擎,以便調用您的類。

作爲一個便箋,我覺得這個架構很奇怪。除非有其他的理由要這樣做,否則我會建議使用一個獨特的關卡類並從文件中加載每個關卡的配置。不過,如果遊戲玩法在不同級別之間變化,它可能並不適合。

0

嗯......有101個更好的方法來做到這一點。

更新例如:

public abstract class Level { 
    // or whatever your interface is 
    abstract public void createWorld(WorldListener worldListener); 
    abstract public void nextWorld(); 
} 

public class Level1 extends Level { 
    public void createLevel(WorldListener worldListener) { 
     /** do it **/ 
    } 
    public Level nextLevel() { return new Level2(); } 
} 

然後在別處:

Level cur = new Level1(); 
do { 
    cur.createLevel(worldListener); 
    ... 
    cur = cur.nextLevel(); 
} while (cur != null); 

原始 例如:

public abstract class Level { 
    final public int number; 
    public Level(int num) { this.number = num; levels[num-1] = this;/* set up level */ } 

    // adjust 10 to number of levels 
    static private Level[] = new Level[10]; 
    static public getLevel(int num) { return levels[num-1]; } 

    // or whatever your interface is 
    abstract public void createWorld(WorldListener worldListener); 
} 

public class Level1 extends Level { 
    public Level1() { super(0); } 
    public void createWorld(WorldListener worldListener) { 
     /** do it **/ 
    } 
} 

然後某處埃爾se:

Level.getLevel(1).createWorld(); 
+0

我不明白這是如何工作的,因爲抽象類。這是一個更好的方法,但通過調用Level.getLevel(1).createLevel()將不會拋出錯誤,因爲我試圖聲明一個抽象類? – Chris

+0

@Chris:對不起,更新了 –

+0

@Chris:不,因爲getLevel(1)返回了Level1的瞬間。 –

1

查看Factory Pattern。爲了您的情況,您可以實現CreateLevel(String level)方法,該方法執行一個簡單的case-statement來確定要創建或使用反射的類。