代表的复杂使用

本文关键字:复杂 | 更新日期: 2023-09-27 18:35:05

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

代表的复杂使用

尝试

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

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

这假设 FireringFunctions.SomeFireringFunctionName 定义为:

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

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

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
    }
}

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