投稿数 - 437, コメント - 55186, トラックバック - 156

partial class + generic = template ?

http://blogs.wankuma.com/nagise/archive/2007/12/26/114706.aspx
のコメントにある菊池さんのコード。

さらっと流されたら超もったいない珠玉コードなので、コンパイルできるようにちょっと整形して再掲する。

public class Product<TCurrency>
{
    public string Name;
    public TCurrency UnitPrice;
}

public abstract class Sales<TAmount, TCurrency>
{
    public Product<TCurrency> item;
    public TAmount amount;
    public abstract void WritePrice(TextWriter write);
}

public partial class SpecifiedSales
{
    public override void WritePrice(TextWriter wr)
    {
        var price = item.UnitPrice * amount;
        wr.Write(price);
    }
}

↑ここまでライブラリみたいな考え?
----------------------------------------------------------------------
↓ここからクライアントみたいな考え?

partial class SpecifiedSales : Sales<int, int> { }
or
partial class SpecifiedSales : Sales<double, double> { }

「こんなコード、コンパイルできないでしょ。TAmount と TCurrency に *演算子がないんだから」とか言っちゃったけど、なんとコンパイルできる。

ジェネリックと言うより、まるでテンプレート。最初、全然理解できなかったんだけど、これって常識だったのか!?

投稿日時 : 2007年12月27日 21:42

フィードバック

# re: partial class + generic = template ?

> これって常識だったのか!?
これとはなんでしょう?
partialでジェネリクスを使うこと?
varで受ける部分?
2007/12/27 21:56 | れい

# re: partial class + generic = template ?

>これとはなんでしょう?
>partialでジェネリクスを使うこと?
>varで受ける部分?

全部含めてテンプレートみたいになってる事です。
2007/12/27 22:03 | 囚人

# re: partial class + generic = template ?

>全部含めてテンプレートみたいになってる事です。

「C++のような」テンプレート
2007/12/27 22:04 | 囚人

# re: partial class + generic = template ?

常識ではないかもしれないねー
汎用プログラミングの為にコンパイル時の型依存性とソースコードレベルでの型依存性の違いを突っついてるコードだから。
でもMSDNでのプログラミングガイドで解説されてる通りの挙動ですのでバグでもなく、コンパイルされるべきコードなのです。

まぁ、この関連記事での用語としては上は真理で下は仕様なのです。
2007/12/27 22:10 | 菊池

# re: partial class + generic = template ?

>汎用プログラミングの為にコンパイル時の型依存性とソースコードレベルでの型依存性の違いを突っついてるコードだから。
>でもMSDNでのプログラミングガイドで解説されてる通りの挙動ですのでバグでもなく、コンパイルされるべきコードなのです。

よく見ればコンパイルできる事は常識でしょうけど、ぱっと見、全くコンパイルできないと思いましたよ。
スゲぇっす。
2007/12/27 22:51 | 囚人

# re: partial class + generic = template ?

ん、これアリなのか・・・
あとでやってみます
2007/12/27 23:20 | アキラ

# re: partial class + generic = template ?

バイナリレベルでの再利用はできなくて、ソースファイルレベルの再利用になりますけどね。
あるいは、真理側をコードジェネレータにしてしまえば使えるか。
2007/12/28 0:45 | シャノン

# re: partial class + generic = template ?

>アキラさん

結果待ってます。


>バイナリレベルでの再利用はできなくて、ソースファイルレベルの再利用になりますけどね。

まぁそれは C++ テンプレートも同じで、しょうがないですね。
2007/12/28 0:52 | 囚人

# re: partial class + generic = template ?

自分、あまりよく理解できていないのですが、
パーシャルクラスでジェネリクス型だけ指定しているのかな?
2007/12/28 10:27 | 凪瀬

# re: partial class + generic = template ?

ぼくも上のようなコードが使い方が出来るのではないか、と思っていたわけですよ。(試してなかったのだけど。)

コンパイル後の再利用はできないけど、型セーフで、全く手を付けずに再利用できるコード。

#ただ汎用性と引き換えにコードが増えているので、もっと簡単に書く仕組みが加わればいいのだけど。>C#

再掲させてください。
http://blogs.wankuma.com/gshell/archive/2007/12/26/about_var.aspx
2007/12/28 10:33 | ghost_shell

# re: partial class + generic = template ?

おー、なんだこれ
ホントに動くw

これはたしかにテンプレートっぽくておもしろい

この例ならたしかに
>var price = item.UnitPrice * amount;
はvarと書くしかない
いや、varと書くべきだ

だが本物のテンプレートならSalesクラスにWritePriceの実体を書くw
2007/12/28 10:49 | アキラ

# 仕様は変わっても真理は変わらない

仕様は変わっても真理は変わらない
2007/12/28 11:57 | 菊池 Blog

# re: partial class + generic = template ?

これはおもしろい。

んー、なるほどなぁ・・・。
なんか、デザパタの1つにあってもよさそうな感じですねー。
すばらしい。

でも、こういう発想の転換は少々時間がかかりそうだなぁ(^^;

あと、ここまで汎化をすすめる必要性があるのかどうかを見極める必要はありそうですねー。

2007/12/28 12:36 | ひろえむ

# re: partial class + generic = template ?

> あと、ここまで汎化をすすめる必要性があるのかどうかを見極める必要はありそうですねー。

一部の関数型言語がウリにしている抽象性は、ちょっと抽象過ぎる気がするんですよねー。
2007/12/28 14:10 | シャノン

# re: partial class + generic = template ?

>なんか、デザパタの1つにあってもよさそうな感じですねー。

 デザインパターンにするにはまだ不完全ですよ。
 まぁ、この例だと Sales にvirtual TCurrency Price{ get; }を実装するにはどうすれば良いでしょう。計算するまではこの手法が使えるけど、計算した結果を取り出す手段が無いんじゃ計算の意味がないからね。
 この辺りを克服するにはもう一段のブレイクスルーが必要ですね。

>あと、ここまで汎化をすすめる必要性があるのかどうかを見極める必要はありそうですねー。

 逆も真で、汎化を進めたいとき(必要性が出たとき)になって方法が解らない or 無いんじゃどうしょうもないよね。
 汎化に限らず各種メトリックを言語仕様で許される限界まで獲得しようとしたときにどこが言語仕様上で障壁になるかを調べていってそれが克服できるような言語仕様の変更についてはMSに積極的にリクエストして行きたいね。
2007/12/28 14:20 | 菊池

# 泣き言なんてききたかないね!

泣き言なんてききたかないね!
2007/12/28 15:50 | 菊池 Blog

# re: partial class + generic = template ?

てなわけで、できちゃったわ。
2007/12/28 15:56 | 菊池

# nGBWTbQIkbw

9PzuUO Major thankies for the blog. Really Great.
2013/03/22 23:35 | http://crork.com/

コメントの投稿

タイトル
名前
URL
コメント