2

C#新手在这里。

在我的一个类(准确地说是一个实体类)中,我有一个接受实体和另一个相关类的委托:

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);
4

2 回答 2

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
}
于 2012-05-22T21:47:23.370 回答
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
    }
}

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

于 2012-05-22T21:50:59.123 回答