我正在尝试存储仅是抽象类的子类的对象。但是,我只能看到抽象类方法,而看不到任何子类方法。我错过了什么?发生错误的类别: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];
即使我不需要强度统计的特定方面。
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消