在角色扮演游戏中暂时将玩家转变为动物的设计考虑因素

mik*_*dev 7 c# design-patterns decorator

我正在开发一款角色扮演游戏,用于娱乐和练习设计模式.我希望玩家能够将自己变成不同的动物.例如,德鲁伊可能会变成猎豹.现在我正计划使用装饰模式来做这个,但我的问题是 - 我怎么做到这样当德鲁伊处于猎豹形态时,他们只能获得猎豹的技能?换句话说,他们不应该能够获得他们正常的德鲁伊技能.

使用装饰模式看来,即使在猎豹形态下,我的德鲁伊也能够获得他们正常的德鲁伊技能.

class Druid : Character
{
   // many cool druid skills and spells
   void LightHeal(Character target) { }
}

abstract class CharacterDecorator : Character
{
    Character DecoratedCharacter;
}

class CheetahForm : CharacterDecorator
{
    Character DecoratedCharacter;
    public CheetahForm(Character decoratedCharacter)
    {
       DecoratedCharacter= decoratedCharacter;
    }

    // many cool cheetah related skills
    void CheetahRun()
    {
       // let player move very fast
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用这些类

Druid myDruid = new Druid();
myDruid.LightHeal(myDruid); // casting light heal here is fine
myDruid = new CheetahForm(myDruid);
myDruid.LightHeal(myDruid); // casting here should not be allowed
Run Code Online (Sandbox Code Playgroud)

嗯...现在我想起来了,Druid除非班级被降级,否则myDruid会不会给我们类咒语/技能?但即使是这种情况,是否有更好的方法可以确保myDruid此时被锁定在所有Druid相关的法术/技能之前,直到它被强制转换为Druid(因为目前它已经存在CheetahForm)

wil*_*ood 10

你不应该把你的咒语和技能作为课堂上的方法.它们应该是Spell和Skill对象的集合,可以通过Character(或可能是Creature)界面访问它们.然后,您的CheetaForm可以覆盖getSkills getSpells方法,以返回适当技能的新修改集合.