S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

今更delegate

あーこんな使い方したい場面あったかもーと今更。
とは言え、実装しないようじゃそもそもダメじゃわなw
こういうの関数型言語っぽいって言っていいのかな???
メソッドだけ借りるって感じか。。。
【2011/09/20訂正】
異なるインスタンスメソッドに委譲しても、thisはあくまでこのインスタンスになってるなぁ。
なんかそのメソッドの設計というか役割ってどうなん?というのもあるような気がして、なんとなくコワイ気がしないでもない。
プロパティzを追加して確認したら、異なるインスタンスメソッドに委譲すると、thisはあくまでその委譲したインスタンスになってる。
引数で渡してるのを見落としてた(>_<)
そりゃそうじゃわな。そのクラスのスコープというか、アクセシビリティとか考えたら当然と言えば当然。
という感じで、オブジェクト変数と引数の関係とか考えると、これはこれで微妙?
結局は単に”ちゃんと設計する”で解決するんだろうけど。

public class Test
{
    private int x { get; set; }
    private int y { get; set; }
    private int z { get; set; }
    delegate void Calculate(int x, int y);
    public Test()
    {
        this.z = 1;
    }
    public static void Main(string[] args)
    {
        new Test().Process();
    }
    private void Process()
    {
        this.x = 100;
        this.y = 100;
        this.z = -1;

        // "Add : -200", "Subtraction : 0"
        //(this.zがこのインスタンスの値[-1])
        Process(Add);
        Process(Subtraction);

        // 異なるインスタンスのメソッドに委譲すると、thisは渡したメソッドのインスタンスになる
        // "Add : 200", "Subtraction : 0"
        // (this.zがインスタンスtestの値[1])
        Test test = new Test();
        Process(test.Add);
        Process(test.Subtraction);
    }
    private void Process(Calculate cal)
    {
        cal(this.x, this.y);
    }
    private void Calculate(Calculate cal)
    {
        cal(this.x, this.y);
    }
    private void Add(int x, int y)
    {
        System.Diagnostics.Trace.WriteLine("Add : " + ((x + y) * this.z));
    }
    private void Subtraction(int x, int y)
    {
        System.Diagnostics.Trace.WriteLine("Subtraction : " + ((x - y) * this.z));
    }
}