字典中对象的Cant访问子类方法

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


发生错误的类别:


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;

    }

}


繁花不似锦
浏览 113回答 1
1回答

qq_笑_17

表达式的类型playerStats[StatType.DEF]为just Stat。编译器不知道将哪种类型Stat存储为那里的值。如果它将始终是StatDef,则应强制转换:var def = (StatDef) playerStats[StatType.DEF];// Now you can use def.ApplyDamageReduction etc但是,您需要在任何时候使用特定于统计信息的成员进行强制转换。除非您经常想以相同的方式处理多个统计信息,否则我建议放弃字典方法,而只使用单独的字段:class CharacterStats{&nbsp; &nbsp; private StatDefence defence;&nbsp; &nbsp; private StatAttack attack;&nbsp; &nbsp; private StatStrength strength;&nbsp; &nbsp; // etc}你可以很容易地编写一个方法,可以让你迭代的时间在那里,所有的统计数据是有用的:public IReadOnlyList<Stat> GetAllStats() =>&nbsp; &nbsp; new Stat[] { defence, attack, strength, ... };但我怀疑,在大多数情况下,您在使用统计信息时,实际上希望了解特定的统计信息。我总是宁愿写:var strength = stats.Attack;比var strength = stats[StatType.STR];即使我不需要强度统计的特定方面。
打开App,查看更多内容
随时随地看视频慕课网APP