事件和多态设计

时间:2017-06-13 11:59:52

标签: c# events interface delegates polymorphism

在典型的角色扮演游戏设置中,我尝试制作可以处理角色异能的其他效果的事件设计。

我的主要问题是使这样的系统具有多态性,这样我就可以添加任何我想要的效果而不会遇到参数或返回类型问题。

这是我到目前为止所做的一个例子:

public abstract class Character
{
    public int CurrentMP { get; set; }
    public List<ISkill> Moveset { get; protected set; }
    // the rest doesn't matter i guess
}

public interface ISkill
{
    string Name { get; set; }
}

public class Weaponskill : ISkill
{
    public int Potency { get; protected set; }
    public IEffects AdditionalEffect { get; set; }
}

public class Warrior : Character
{
    public Warrior ()
    {
        Moveset = new List<Move.ISkill>()
        { 
            new Weaponskill("Sword Slash", 100, new ManaGain(this, 707))
        }
    }
}

在另一个名称空间中,事件。

namespace Additional_Effects 
{
    public delegate void EffectEventHandler(Character character, int gain); 

    public interface IEffects
    {
          event EffectEventHandler Event;
    }

    public class ManaGain : IEffects
    {
        public ManaGain(Character character, int gain)
        {
            Event += OnEffect;
        }

        public event EffectEventHandler Event;

        protected virtual void OnEffect(Character character, int gain)
        {
            character.CurrentMP += gain;
        }

        public void Execute(Character character, int gain)
        {
            if (Event != null)
                Event(character, gain);
        }
    }
}

我的主要问题是委托的参数类型和编号及其返回类型不灵活。我可能需要一个对另一个IEffects实现具有完全不同定义的委托。如何更改我的事件系统以实现这一目标?

此外,在我作为示例的IEffects实现的情况下,我不确定属性CurrentMP是否在方法之外实际修改,我对此有疑问在这里通过值或引用传递参数。

最后我想我不能从我的Weaponskill类中调用我的Execute方法,因为它知道IEffect但不知道它的具体实现,但我不能使用Execute方法接口因为我必须在任何地方实现它,即使参数需求在每个具体实现中都有所不同。

1 个答案:

答案 0 :(得分:0)

对于代表们,也许您可​​以使用不同的签名:C# - Is it possible to have multiple method signatures for an Action<>?

如果我记得很清楚,在C#中,只有从Valuetype派生的对象按值传递。如果需要,可以使用关键字ref通过引用传递它们。但我不认为这是个性格的例子。

Currenly,你不能从IEffect调用执行,因为Execute是Managain的一个函数。您必须编写execute的签名以及您希望能够从IEffect调用的每个函数。