オーバーライド、オーバーロード、インタフェースの明示的な実装が混ざるとむずかしい
Essential .NET ― 共通言語ランタイムの本質を読んでいるんですが、リスト6-14の例が難しく(ややこしく)てうなってしまいました。
ちょっとだけ変更していますが、大体こんなです。実行結果がすぐにわかる人はすごいです。
class Program { static void Main(string[] args) { ReallyDerived r1 = new ReallyDerived(); Derived r2 = r1; Base r3 = r1; ICommon r4 = r1; r1.DoIt(); // e r2.DoIt(); // e r3.DoIt(); // b r4.DoIt(); // c Console.ReadKey(); } } public interface ICommon { void DoIt(); } public class Base : ICommon { void ICommon.DoIt() { Console.WriteLine("a"); } public virtual void DoIt() { Console.WriteLine("b"); } } public class Derived : Base, ICommon { void ICommon.DoIt() { Console.WriteLine("c"); } public new virtual void DoIt() { Console.WriteLine("d"); } } public class ReallyDerived : Derived { public override void DoIt() { Console.WriteLine("e"); } }
Javaにはないインタフェースの明示的な実装は好きな機能ですが、new修飾子によるメソッドの隠蔽機能は使いどころがわからないです。単にややこしい(メリットよりデメリットが大きい)だけな気がしちゃいます。