2016-03-06 40 views
0

我試圖在遊戲中設計類法術。如何設計一個類層次結構,該類層次結構在不實例化的情況下提供有關子類的信息

首先我有一個spelbook,這表明該法術可用於該球員

public class Player { 
    private List<Class<? extends Spell>> speellBook; 
} 

現在我創造了一些法術

public abstact class Spell { 
    public abstact double getDmg(); 
    private double position x; 
    private double position y; 
} 
public class FireBolt extends Spell { 
    public double getDmg() { return 15; } 
} 
public class FrostBolt extends Spell { 
    public double getDmg() { return 10; } 
} 

現在我想展現一個關於提示玩家FireBolt,這表明這個法術在沒有實例化的情況下會造成15點傷害。它應該只在玩家真正投射時實例化。

我已經想到了靜態字段,但靜態字段不能被真正的法術超越。

然後我想到了一個單例模式的,但因爲我的當前位置存儲在我的法術,也這將不工作,要麼

是否有標準模式爲這個?我只發現原型模式,但我需要一個單身它不會被繼承

+1

我認爲你正在反思這一點,只是在玩家中存儲咒語實例 – 2016-03-06 20:57:26

+0

如果某個咒語的特定實例的傷害沒有改變,引入一個靜態變量來表示它有什麼不對?即:對於FireBolt引入一個靜態變量'fireboltDamage' – Pubudu

+0

,因爲我的通用工具提示必須能夠顯示任何咒語 – wutzebaer

回答

2

您試圖對類應用繼承(統一調用getDmg方法在不同的法術上),避免對象實例化。正如你已經注意到的那樣,這些需要靜態字段和靜態方法,但它們不適用於繼承。我已經看過很多次了,並沒有那種方式。

我建議創建模板對象並使用它們來顯示工具提示。示例:

public class SpellTooltip { 

    private Map<Class<? extends Spell>, Spell> templates = new HashMap<>(); 

    { 
     templates.put(Firebolt.class, new Firebolt()); 
     templates.put(Frostbolt.class, new Frostbolt()); 
    } 

    public int getSpellDamage(Class<? extends Spell> clazz) { 
     return templates.get(clazz).getDmg(); 
    } 
} 

實現可能因設計的複雜性而異。按原樣使用它,您應該始終記住向地圖添加新類型。