昨晩NPlotのソースを読んでいて気付いたのですが、C#では以下のようなことができるみたいです。
namespace Test { public interface IHello { void Say(); } public class HelloBase { public void Say() { Console.WriteLine("Hello!"); } } public class Hello : HelloBase, IHello { } class Program { static void Main(string[] args) { IHello h = new Hello(); h.Say(); } } }
このコードはコンパイルが通り、Hello.Sayメソッドを呼び出すとHelloBase.Sayが呼ばれます。どうも手元の本を読んでも特に記述がないのですが、これって常識なのでしょうか。知らなかったのでちょっと驚きました。
逆アセンブルしてもILがろくに読めないということもあるんですがからくりがわかりませんでした。C#コンパイラがうまいことやっているのかと思ったのですが、痕跡もないので不思議な感じです。
public class Hello : HelloBase, IHello { void IHello.Say() { base.Say(); // base = HelloBase } }
最初はこんなコードが生成されているのかなと思ったのですが……。C#というより中間言語の仕様で良きに計らってくれるんでしょうか。
なんにしても、これは使いようによっては便利な機能ですね。ちょうどC#でコードを書くところだったので早速活用していきたいと思います。でもその前に仕様も調べた方がいいかな。すっきりしなくて気持ち悪い。