簡體   English   中英

如何設計一個類層次結構,該類層次結構提供有關子類的信息而無需實例化它

[英]How to design a class hierarchy which gives information about the subclasses without instantiating it

我正在嘗試為游戲中的咒語設計類。

首先,我有一位玩家,並且帶有一本練習簿,其中指出了該玩家可以使用哪些咒語

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點傷害。 它應該僅在玩家真正投放時實例化。

我已經想到了靜態字段,但是靜態字段不能被真正的咒語所取代。

然后我想到了單例模式,但是由於我也將當前位置存儲在我的咒語中,所以這也不起作用

是否有任何標准模式? 我只找到了原型模式,但是我需要一個單例,它將無法繼承

您正在嘗試為類應用繼承(在不同的咒語上統一調用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();
    }
}

實現可能會根據設計的復雜性而有所不同。 照原樣使用它,您應該始終記住要向地圖添加新類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM