スクリーンセーバーを選択するリストボックスには何を表示すれば良いか。

スクリーンセーバーは ISaver を実装するクラスなのだが、
現在の ISaver には、特別なプロパティがないため、
クラスの FQCN くらいしか名前として使えそうなものがない。

そこで、ISaver に名前を得るためのプロパティ 'Name' を追加して、
ISaver を実装するクラスから名前を取得する事ができるようにする。
そして、ホストではこれをリストボックスに表示するようにしよう。

ただし、インタフェースを変更するのは御法度だ。
開発用ライブラリ「Loafer.ScreenSaver.dll」を既にリリースしていた場合、
既存のスクリーンセーバーは古い ISaver を実装してコンパイルされている。

もし、ISaver を直接変更してしまうと、それを使ったホストは、
古いスクリーンセーバーとの互換性がなくなってしまうからだ。

こういう場合、昔から使われている方法は、
新たに拡張インタフェースを定義する方法である。

========== ISaver2.cs ==========

using System;

namespace Loafer.ScreenSaver {

    public interface ISaver2 : ISaver {

        string Name { get; }

    }

}

========== end of ISaver2.cs ==========

ISaver を拡張した ISaver2 インタフェースを定義し、
そこに string 型の Name プロパティを追加した。
プロパティを設定することはないので、読み取り専用で十分だ。

これにより、新しいスクリーンセーバーは、
ISaver2 を実装することで、表示される名前を自由に決められるようになる。

では、開発用ライブラリを新しくビルドしておこう。
ISaver2 を追加するだけだ。

$ csc /w:4 /t:library /out:Loafer.ScreenSaver.dll ^
        /r:System.dll /r:System.Drawing.dll ^
        /r:System.Windows.Forms.dll ^
        ISaver.cs ISaver2.cs

.NET のクラスライブラリは非常に柔軟性がある。
古い Loafer.ScreenSaver.dll をこの新しいもので上書きしても、
以前にビルドしたホストや HelloSaver は問題なく動作するはずだ。

COM の頃のように、バイナリレベルでの厳密な互換性は必要なく、
気兼ねなく修正を行うことができるのである。