我正在尝试存储只是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;
}
}
由于
答案 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];
即使我不需要力量统计的特定方面。