C#3.0
もう我慢できないので、VisualStudio2007のCTPを入れた。Community Technology Preview。簡単に言えばβ版。
それなりに普通に動いているのでもうこっちで開発する。ラムダ式がないと俺は無理だ。それもこれも型推論しないdelegateが悪い。
ExtensionMethodでinterfaceに実装を与えることで、多重継承の問題の大部分は解決できそうだ。ExtensionMethodは多態出来ないけど、別に多態するメソッドを呼び出せばいいだけの話じゃない。
//多態するタコのインターフェース interface ITakoPoly{ void TakoMethod(); } //多態するイカのインターフェース interface IIkaPoly{ void IkaMethod(); } //タコ interface ITako{ ITakoPoly _internal___tako{ get; } } //イカ interface IIka`{ IIkaPoly _internal___ika{ get; } } static class Extension { //多態するタコのメソッドをただ呼び出す。 public static void TakoMethod(this ITako tako){ tako.internal___tako.TakoMethod(); } public static void IkaMethod(this IIka ika){ ika.internal___ika.IkaMethod(); } } //タコとイカを多重継承 class TakoIka : ITako, IIka { ITakoPoly takoPoly; IIkaPoly ikaPoly; public TakoIka(ITakoPoly _takoPoly, IIkaPoly _ikaPoly){ takoPoly = _takoPoly; ikaPlay = _ikaPoly; } public ITakoPoly internal___tako{ get{ return takoPoly; } } public IIkaPoly internal___ika{ get{ return ikaPoly; } ] }
これで、ITakoとIIkaを実装すれば自動的にタコメソッドとイカメソッドが実装される感じになった。あとはタコとイカをコンストラクタに突っ込むだけだ。
タコ、イカ、以外に様々な多重継承がある場合に楽に書ける。委譲するだけのメソッドをわんさか書かなくても、internal___とかいうプロパティを持つだけでいいのだが限りなく怪しい。
ExtensionMethodはまあ多重継承の解決には使えるには使えるのだけど実のとこ非常にあやしいフィールドを公開しなければならないのでだめかなあ。そもそもITakoがITakoPolyを実装できないので汎用性に乏しい。それより俺が必要としていたのはこっちだった。クラス名.やフィールド名.をつけずに直接呼び出せるメソッドを多重継承したかったのだ。
static class Extension { //HogeのExtensionMethod public static void Hoge(this Interface1 i1){ ... } public static void Huga(this Interface2 i2){ ... } } このようにすると、インターフェースを多重継承したときに、 class HogeHuga : Interface1, Interface2{ void Method(){ //インターフェースを継承するだけでHogeとHugaが使えるように!! this.Hoge(); this.Huga(); } } こうはできる。しかしExtensionMethodの制限かなんかで、thisをつけない呼び出し void Method() { //コンパイルエラー Hoge(); Huga(); } これはアウトになる。ExtensionMethodを使うには自クラス内でもthisを介さないといけない。ううむ。