代表的复杂使用

时间:2012-05-22 21:43:39

标签: c#

C#newbie here。

在我的一个类中(确切地说是一个Entity类),我有一个代理,它接受一个实体和另一个相关的类:

public delegate void FiringFunc(Entity e, BulletFactory fact)

和Entity类中的一个循环,每个帧调用此函数(如果已定义):

FiringFunc firingFunc = null; //defined later
if(firingFunc)
    firingFunc(this, someBulletFactory);    

正如人们可能知道的那样,这是一个作为子弹射击功能的代表(你可以编写像子弹的计时器,射击的角度等等)。然而,我想到了一个想法:如果我希望子弹有一个轻微的差异,但仍然保持相同(有点像一点点慢,颜色略有不同,在不同的方向,等等)。我必须创建另一个函数作为委托 - 这对我来说似乎不对。

以下是创建和设置委托的示例:

Entity e = new Entity( ... )
e.firingFunc = FiringFunctions.SomeFiringFunctionName;

有没有办法可以为此添加参数?如果我能做类似以下的事情,那就太好了:

e.firingFunc = FiringFunctions.SomeFiringFunctionName(someChange1, someChange2);

2 个答案:

答案 0 :(得分:3)

尝试

e.firingFunc = 
    (Entity e, BulletFactory fact) => 
        FiringFunctions.SomeFiringFunctionName(e, fact, "foo", 5);

这将创建一个新的匿名函数(lambda),使用包含的参数调用FiringFunctions.SomeFiringFunctionName

这假定FiringFunctions.SomeFiringFunctionName定义为:

public void SomeFiringFunctionName(Entity e, BulletFactory fact, String someString, Int32 someInt) { 
  //...  do whatever here
}

答案 1 :(得分:1)

您还可以使用自定义界面并利用多态性(是的,它需要更好的名称)。

public interface IFiringActionProvider
{
    public void Fire(Entity e, BulletFactory fact);
}

然后在同一个Entity班级中:

IFiringActionProvider firingFunc = null; //defined later
if (firingFunc != null)
    firingFunc.Fire(this, someBulletFactory);

您可以以任何您喜欢的形式创建自定义实例,例如:

public class CustomColorFiringActionProvider : IFiringActionProvider
{
    private Color color;
    public CustomColorFiringActionProvider(Color c) { this.color = c; }
    public void Fire(Entity e, BulletFactory fact)
    {
        // do something, using color
    }
}

只是添加另一种类似的方法(不一定更好)。