このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
スクリーンセーバーを選択するリストボックスには何を表示すれば良いか。
スクリーンセーバーは 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 の頃のように、バイナリレベルでの厳密な互換性は必要なく、
気兼ねなく修正を行うことができるのである。