オーバーライド、オーバーロード、インタフェースの明示的な実装が混ざるとむずかしい

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修飾子によるメソッドの隠蔽機能は使いどころがわからないです。単にややこしい(メリットよりデメリットが大きい)だけな気がしちゃいます。