しらとりのブログ

社会人ひよこプログラマのtil

ややこしい委譲の意味

C#に触れていると委譲の意味で混乱することがあるので整理しておきます。

Javaに真の委譲は無い

一般に委譲といえばこちらのイメージ。
コンポジションと転送の組み合わせで処理を委譲する

Javaのサンプルコード

class Operation
{
    public int sum(int x, int y){
        return x + y;
    }    
}

class Calculator
{
    private Operation ope = new Operation();
    public int sum(int x, int y){
        return ope.sum(x,y);
    }
}

真の委譲

delegateを使用している例。
C#に備わっている処理を委譲する機能

C#のサンプルコード

namespace App
{
    delegate int Sum(int x, int y);
    class Operation
    {
        public int sum(int x, int y)
        {
            return x + y;
        }  
    }
    class Claculator
    {
        public int sum(int x, int y)
        {
            var ope = new Operation();
            var sum = new Sum(ope.sum);
            return sum(x,y);
        }
    }
}

とりあえず
委譲  :コンポジション+転送とかアダプターのときに使う。
真の委譲:コールバックを渡すときとかに使う。今はdelegateキーワードではなくActionやFuncしか使いませんが。。。
という感じで落ち着きました。文脈に注意しなければだめですね。