2

C#初心者です。

私のクラスの 1 つ (正確には Entity クラス) には、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);
4

2 に答える 2

3

試す

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

これにより、含まれているパラメーターを使用して呼び出す新しい無名関数(ラムダ)が作成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 に答える