reveal.js-LT_overload



reveal.js-LT_overload

0 0


reveal.js-LT_overload

presentation by use of reveal.js

On Github y-tsutsu / reveal.js-LT_overload

オーバーロードのはなし

(C#)

 

by tsutsu

オーバーロードって?

引数の型や数の違う

同じ名前の関数を定義すること

 

static void DoSomething(char c) { Console.WriteLine(c); }

static void DoSomething(string s) { Console.WriteLine(s); }

static void DoSomething(char c, int n) { Console.WriteLine(new string(c, n)); }

便利ですね(゚∀゚)

ところで関数といえば...

デリゲートですね!

 

class Program
{
    static readonly Func<int, int> Something = x => x * 2;

    static int DoSomething(int n) { return n * 2; }

    static void Main(string[] args)
    {
        Console.WriteLine(Something(42));
        Console.WriteLine(DoSomething(42));
    }
}

ということで...

オーバーロード!

 

class Program
{
    static readonly Func<int, int> Something = x => x * 2;

    static readonly Func<string, int> Something = x => int.Parse(x) * 2;

    static void Main(string[] args)
    {
        Console.WriteLine(Something(42));
        Console.WriteLine(Something("42"));
    }
}

Error'Something' の定義を既に含んでいます

出来んのかいっ( ゚Д゚)

ところでラムダといえば...

高階関数ですね!

 

class Program
{
    static Func<char, string> Something(int n)
    {
        return c => new string(c, n);
    }

    static void Main(string[] args)
    {
        var hoge = Something(42);
        Console.WriteLine(hoge('A'));

        // 1行で書くと
        Console.WriteLine(Something(42)('A'));
    }
}

2つの引数を取るメソッドと似てる!

 

class Program
{
    static Func<char, string> Something(int n)
    {
        return c => new string(c, n);
    }

    static string Something(int n, char c)
    {
        return new string(c, n);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Something(42)('A'));
        Console.WriteLine(Something(42, 'A'));
    }
}

再びオーバーロード!

2つの引数を取るメソッド

 

class Program
{
    static string DoSomething(int n, char c)
    {
        return new string(c, n);
    }

    static string DoSomething(int n, string s)
    {
        return new string(' ', n).Replace(" ", s);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(DoSomething(42, 'A'));
        Console.WriteLine(DoSomething(23, "XYZ"));
    }
}

高階関数の場合

 

class Program
{
    static Func<char, string> Something(int n)
    {
        return c => new string(c, n);
    }

    static Func<string, string> Something(int n)
    {
        return s => new string(' ', n).Replace(" ", s);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Something(42)('A'));
        Console.WriteLine(Something(23)("XYZ"));
    }
}

Error'Something' と呼ばれるメンバーを同じパラメーターの型で既に定義しています

出来んのかいっ( ゚Д゚)

まとめ

オーバーロードは便利だけど

機能の統一性が...

言語の機能拡張は難しい!

Scalaはどうなの?

Thank U for Reading

 

by tsutsu