2007 年 10 月 27 日 17 時 57 分

スクリーンセーバのタイトル


このアーカイブは同期化されません。 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 の頃のように、バイナリレベルでの厳密な互換性は必要なく、
気兼ねなく修正を行うことができるのである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.