无法在Dictionary中访问对象的子类方法

时间:2018-05-02 06:09:42

标签: c#

我正在尝试存储只是Abstract Class的子类的对象。但是,我只能看到抽象类方法而不能看到子类方法。我错过了什么?

包含错误的类:

class CharacterStats
{
    private Dictionary<StatType, Stat> playerStats;

    //Contructor for new game
    public CharacterStats()
    {

        playerStats = new Dictionary<StatType, Stat>();

        //Creates all Stats with default values
        playerStats.Add(StatType.STA, new StatSta());
        playerStats.Add(StatType.STR, new StatStr());
        playerStats.Add(StatType.DEX, new StatDex());
        playerStats.Add(StatType.DEF, new StatDef());

    }

    //Returns the damage reduction in %
    public int GetDamageReduction()
    {
        playerStats[StatType.DEF].  //Missing Methods from StatDef class
        //Added to remove error message
        return 1;
    }
}

抽象类:

 abstract class Stat
 {
    protected int pointsAdded;
    protected int pointCap;

    public Stat() {}

    public string TestMethod()
    {
        return "Working!";
    }

 }

子类:

class StatDef : Stat
{

    public StatDef() : base()
    {
        this.pointsAdded = 0;
        this.pointCap = 100;
    }

    public int ApplyDamageReduction(int dmg)
    {
        //removed data to read easier
        return 1;
    }
}

由于

1 个答案:

答案 0 :(得分:2)

表达式playerStats[StatType.DEF]的类型只是Stat。编译器不知道存储哪种Stat作为值。

如果它总是StatDef,那么你应该只是投射:

var def = (StatDef) playerStats[StatType.DEF];
// Now you can use def.ApplyDamageReduction etc

但是,您需要投射任何时间来使用特定于身份的成员。除非你经常想以同样的方式处理多个统计数据,否则我建议放弃字典方法并且只有单独的字段:

class CharacterStats
{
    private StatDefence defence;
    private StatAttack attack;
    private StatStrength strength;
    // etc
}

您可以轻松编写一种方法,允许您在 有用的时间内迭代所有统计信息:

public IReadOnlyList<Stat> GetAllStats() =>
    new Stat[] { defence, attack, strength, ... };

但我怀疑你使用统计数据时大多数,你实际上想知道具体的统计数据。我总是宁愿写:

var strength = stats.Attack;

大于

var strength = stats[StatType.STR];

即使我需要力量统计的特定方面。