インターフェイスへの(そこそこ)安全なメソッドの追加

Effective Java第二版では、

一般的に言えば、publicのインタフェースに、そのインタフェースを使用しているすべてのプログラムを動かなくさせることなく、メソッドを追加することは不可能です。

とあるけど、C#では拡張メソッドを使用することでpublicのインターフェイスに(そこそこ)安全にメソッドを追加できる。


たとえば、

public interface IHoge { }

こんなインターフェイスがあったとして、

public static class IHogeExtension
{
	public void Method(this IHoge hoge) { }
}

これでIHogeオブジェクトはMethodメソッドを追加したような記述が可能になる。

IHoge hoge = new Hoge();
hoge.Method();

拡張メソッドでは実装も提供するため、既存のコードに影響を与えずにメソッドを追加できる可能性がある。
ただし、絶対に安全と言うわけではなく、すでに拡張メソッドを使用している場合にシグニチャが衝突してしまうと、usingを追加した時点でコンパイルエラーとなってしまう。
やっぱりメソッドを安全に追加するのは難しいのだなぁ。