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 に *演算子がないんだから」とか言っちゃったけど、なんとコンパイルできる。
ジェネリックと言うより、まるでテンプレート。最初、全然理解できなかったんだけど、これって常識だったのか!?