C#はDelegateを言語でサポートしてるみたい

C#では「delegate」という機構で、実装の切替をすることが言語仕様でサポートされてるみたいです。いわゆるオブジェクト指向でいう、実装をインタフェースつかって切り替えるってヤツです。Javaで書くとこんな感じ。

package console_application1;

public class Program {
    public static void main(String[] args) {
        Base plus = new Plus();
        Base mult = new Mult();
        calc(2, 3, plus);
        calc(2, 3, mult);
    }

    public static void calc(int x, int y, Base instance) {
        int result = instance.method(x, y);
        System.out.println(result);
    }
}

interface Base {
    int method(int x, int y);
}

class Plus implements Base {
    public int method(int x, int y) {
        return x + y;
    }
}

class Mult implements Base {
    public int method(int x, int y) {
        return x * y;
    }
}

もちろんC#でdelegateを使わないで書くこともできます。こんな感じですね。

using System;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Base plus = new Plus();
      Base mult = new Mult();
      calc(2,3, plus);
      calc(2,3, mult);
    }

    public static void calc(int x, int y, Base instance)
    {
      int result=instance.method(x,y);
      Console.WriteLine(result);
    }
  }

  interface Base
  {
     int method(int x, int y);
  }

  class Plus : Base
  {
    public  int method(int x, int y)
    {
      return x + y;
    }
  }
  
  class Mult : Base
  {
    public  int method(int x, int y)
    {
      return x * y;
    }
  }
}

JavaとC#はほとんど書き方が同じでJava使いの私としてはラクチンです

さてこれをC#のdelegateでかくとこんな感じみたいです

using System;

namespace ConsoleApplication1
{
  delegate int Calculator(int x, int y);//delegateの宣言
  class CalculatorBase
  {
    public int methodMult(int x, int y)
    {
      return x * y;
    }
    public int methodPlus(int x, int y)
    {
      return x + y;
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      CalculatorBase calculator = new CalculatorBase();
      calc(2, 3, new Calculator(calculator.methodPlus));
      calc(2, 3, new Calculator(calculator.methodMult));
    }

    public static void calc(int x, int y, Calculator instance)
    {
      int result=instance(x,y);
      Console.WriteLine(result);
    }
  }
}

メソッドの型(?)を

delegate int Calculator(int x, int y);

って宣言しておいて、実装を

new Calculator(calculator.methodPlus)

ってコンストラクタで指定するって感じ?JavaのインタフェースつかったDelegateと違うのは指定する実装クラスの型が任意ってコトかなあ??

ちなみに new Calculator(calculator.methodPlus) の箇所は下記のように省略も出来ます

 calc(2, 3, new Calculator(calculator.methodPlus));
-> calc(2, 3, calculator.methodPlus);

ちょっとシンプルになります

匿名クラスっぽくかいてみる

calc(2, 3, new Calculator(calculator.methodPlus));

の箇所はいわゆる匿名クラスみたいな感じで書くこともできます。

calc(2, 3, new Calculator(delegate(int x, int y)
{
  return x - y;
}));

「delegate」て単語を使うって事ですね。

ラムダ式?ってのもあるらしい

calc(2, 3, new Calculator((int x, int y) =>
{
  return x + y;
}));

こうやってdelegateって単語すら省略できたり、果ては

calc(2, 3, new Calculator((int x, int y) => x + y));

こういう文法もあるみたいです。

C#ややこしいです(´д`;)

関連リンク


この記事は

選択肢 投票
おもしろかった 4  
そうでもない 3  
  • C#の中カッコを行変えするのが慣れないなぁ。 -- きの? 2010-09-23 (木) 17:14:59

現在のアクセス:5144


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-07-24 (火) 00:11:59 (4456d)