为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁花不似锦 2021-05-17 17:07:03
我正在尝试存储仅是抽象类的子类的对象。但是,我只能看到抽象类方法,而看不到任何子类方法。我错过了什么?发生错误的类别: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 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

表达式的类型playerStats[StatType.DEF]为just 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];

即使我不需要强度统计的特定方面。


查看完整回答
反对 回复 2021-05-23
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信