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);
答案 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
}
}
只是添加另一种类似的方法(不一定更好)。