nikeeshi のコーディング記

コーディングの成果をはっつけるとこ。このブログにあるソースコードはNYSL Version 0.9982に従い公開します(2014/06/18)。

C#のコンストラクタでthisが使える文法は惜しい

C#コンストラクタは引数の組み合わせの異なれば複数定義できる。(関数と同じ)

C#には、あるコンストラクタから別の引数の組み合わせのコンストラクタを呼び出す方法が用意されている。

これは、コンストラクタを再利用できるので、コードの複製をふせぐ文法として多いに期待できそうだ。(この文法がなくても静的なファクトリーメソッドを用意すればいいが、微妙にめんどい)

文法を見てみよう。

class A{
    A(P p,Q q):this(x,y){..}
    A(X x,Y y){..}
}

あーここにthis来ちゃったかー

このコンストラクタの呼び出しから他のコンストラクタに受け渡しするまでに入れられる処理を考えよう。

内側のコンストラクタの引数の数分の「式」の評価である。

これは悲しい。

仮にx=pq,y=p+qを入れたいとすると、this(pq,p+q)と書けばよい。

もっと複雑な計算をしようとして、「変数」が使いたいとする。

this(f(p,q),g(p,q))

として関数をつかえばよい。但し、f内の変数はgで見れないので、同じ計算を何回もやったり、グローバルな領域を駆使したりしないといけない。

これは、引数が複数の場合の問題だ。

引数を無理矢理一つにすると関数が一つにまとまるので好きな計算ができるぞーって思うが。。。

class A{
    A(P p,Q q): this(f(p,q)){..}
    A(X x,Y y){..}
    static x_and_y f(..){..}
}

x_and_yクラスを作らないとね。クラスを一つ作るためにクラスを作ってたらいつまでたっても終わらない気がして萎えるね。

問題はC#のような「文」をつかわないとまともにプログラムが書けない言語で、コンストラクタの再利用が「式」しかかけない文法であること。

こんな文法なかったことにして、とりあえずファクトリーメソッド使うのがいいと思うよ。