代表的复杂使用
本文关键字:复杂 | 更新日期: 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
}
}
只是为了添加另一种类似的方法(不一定更好)。