我的问题是 - 这是一个不好的设计吗?有更好/更清晰/更容易的方法吗?
我试图避免成为那种试图让所有东西都适应一种设计模式的人。但在这种情况下,我觉得这是一个不错的选择。
以下是我的代码,到目前为止只有两个法术类型:
public class Wizard : Creature
{
public List<Spell> Spells { get; set; }
public void Cast(Spell spell, Creature targetCreature)
{
spell.Cast(this, targetCreature);
}
}
public abstract class Spell
{
public string Name { get; set; }
public int ManaCost { get; set; }
public Spell(string name, int manaCost)
{
Name = name;
ManaCost = manaCost;
}
public void Cast(Creature caster, Creature targetCreature)
{
caster.SubtractMana(ManaCost);
ApplySpell(caster, targetCreature);
}
public abstract void ApplySpell(Creature caster, Creature targetCreature);
}
// increases the target's armor by 4
public class MageArmor : Spell
{
public MageArmor() : base("Mage Armor", 4);
public override void ApplySpell(caster, targetCreature)
{
targetCreature.AddAC(4);
}
}
// target takes 7 damage
public class FireBall : Spell
{
public FireBall() : base("Fire Ball", 5);
public override void ApplySpell(caster, targetCreature)
{
targetCreature.SubtractHealth(7);
}
}
现在要施法,我们需要做类似这样的事情:
Wizard wizard = new Wizard();
wizard.Cast(new Spell.MageArmor(), wizard); // i am buffing myself
更新:根据下面回答的一些建议更新了代码