デリゲートの考え方(5)

2019年1月8日

デリゲートの考え方(4)では、戻り値を持って、引数を持たないメソッドを見てきました。今回は、両方持つメソッドについて考えてみます。

public int Kick(string str)
{
    Console.WriteLine($"{str}がキックでダメージを与えた");
    return 10;
}

このメソッドのタイプは、どのようなものでしょうか?

  • 戻り値は1つ。(int型が1つ)
  • 引数が1つ。(string型が1つ)

このパターンですね。

次も同じパターンです。

public int Punch(string str)
{
    Console.WriteLine($"{str}がパンチでダメージを与えた");
    return 5;
}

変数を使う場合、まず、宣言が必要でしたね。

型名 変数名;

デリゲートに当てはめると、

Func<string, int> attack;

Funcが型名、attackが変数名です。(Func型は、戻り値がある場合のメソッドを指しています。この場合、Func<引数の型, 戻り値の型>となります。)
変数が宣言できたので、代入してみます。

attack = Kick;

呼び出しは、

attack(“falcon");

となります。

class Player
{
    public int Kick(string str)
    {
        Console.WriteLine($"{str}がキックでダメージを与えた");
        return 10;
    }
    public int Punch(string str)
    {
        Console.WriteLine($"{str}がパンチでダメージを与えた");
        return 5;
    }
    public void Combo()
    {
        Func<string, int> attack;
        // キックの場合
        attack = Kick;
        int damage = attack("falcon");
        Console.WriteLine(damage);
        // パンチの場合
        attack = Punch;
        damage = attack("raptor");
        Console.WriteLine(damage);
    }
}

表示

falconがキックでダメージを与えた
10
raptorがパンチでダメージを与えた
5

追記)このサンプルは、下記インスタンス化が必要です。

class Program
{
    static void Main(string[] args)
    {
        Player falcon = new Player();
        falcon.Combo();
    }
}

2019年1月8日C#,入門

Posted by hidepon