最近やってるC#4のセッションと、えぴさんのエントリ( http://blogs.wankuma.com/episteme/archive/2009/01/27/166871.aspx )を混ぜて要望を正確に書いてみました。
1.ダックタイピング
前提
public Interface IDuck { string Talk(); }
public class dog{ public void Talk(){ return “bow”;}}
利用1
IDuck duck = x DynamicAs new Dog();
利用2
void Method( dynamic IDuck duck );
利用3
void Method([Contract.Dynamic(IDuck)] IDuck duck)
求める意味
Genericsで解決出来ない継承関係にないものやインターフェイス実装していないもの同士の、処理の共通化を計るために必須。
Templateで出来てGenericsに出来ないものの補完の意味合いもこめて。
2.限定的多重継承
前提
public class A{void A(){…}}
public class B{void B(){…}}
利用方法1
public class C : public A, private b
{}
var cc = new C();
var a = cc as A; //OK
var b = cc as B; //NG(null)
利用方法2
public class C : public A, private IList<item> : List<item>{}
var cc = new C();
IList<item> a = cc as A;//OK
List<item> b = cc as B; //NG(null)
求める意味
長大なインターフェイスの実装の単純化、継承元は別のものにしたい場合などに有用。
Mix-In的な要望にも対応可能
3.フック(C#じゃないけど)
利用方法
MethodInfo mi = (typeof(System.Windows.Form.Window)).GetMethod("~~");
GlobalFook.Register(mi, GlobalHookFlag.Pre | GlobalHookFlag.Add , pre );
GlobalFook.Register(mi, GlobalHookFlag.body | GlobalHookFlag.Override , body );
GlobalFook.Register(mi, GlobalHookFlag.Post | GlobalHookFlag.Remove, post );
求める意味
Mix-Inにより情報を収集するなどの意味。
フックにより差し替えを可能にすることにより、標準機能の差し替えを行えるようにする。(メッセージボックスなど)
テストによるモックの作りやすさや、証跡の取りやすさなど
透過プロクシでは気軽さが少ないために、1テスト毎に証跡の差し替えなどをうまくコントロール出来ない。