« 自作コントロールを使い易くする(説明表示系) | トップページ | プロパティエディタの指定 »

2010年9月22日 (水)

公開プロパティを隠す為の考察

前回サンプルに使用したCurrencyTextBoxを例にとると、数値の設定・取得はCurrencyValueプロパティを使用する。Textプロパティは存在しなくてもいい事になる。それどころか、Textプロパティを使用して、数値にならない文字列を設定する事が出来てしまう。なるべくなら、Textプロパティを非公開プロパティにしてしまいたいところだ。
しかし、C#は既に公開されているものを隠せない仕様になっている。ここでは、それでも隠すやり方、あるいは実用上は隠したも同然にならいかを考えてみる。

その1
CurrencyTextBox を貼り付けた UserControl を公開クラスとして使用する。
この手を使えば、UserControl自体が持っているプロパティ以外は、自力でプロパティを追加する事になる。当然、Textプロパティは完全に隠せる。
しかし困った事に、TextBoxが持っている他の多くのプロパティは、UserControlから使用可能な様に定義してやる必要がある。単純作業であるが、TextBoxの様にプロパティ数が多いと、その後のテストも含めると、それなりに大変だと思う。どうしても完全に隠したいのならこの手しかないと思うが、継承元コントロールのプロパティ数や隠したいプロパティ数等を考慮する必要がある。

その2
CurrencyTextBox 自体は通常の定義を行うが、以下の工夫をする。

  1. Textプロパティの設定を実質不可、すなわち何を入れようとしても、表示テキストが変わらない様にする。
  2. プロパティウィンドウでTextプロパティが表示されない様にする。
  3. インテリセンスからも表示されない様にする。

これだけやれば、実質的には隠したも同然ではないだろうか。そしてこれだけなら、「その1」のやり方に比べれば簡単に実装できる。もちろん、型キャストを使用して

((TextBox)currencyTextBox1).Text = "Text強引設定";

なんてやれば、Textの設定が出来ない事もないが、これはそもそも「TextBoxクラスのTextプロパティ設定に則って設定せよ」と指示しているのだから、動作保証の範囲外と割り切っていいと思う。そう割り切れないのであれば、「その1」の方法で実装するしかないであろう。

では、「その2」のやり方で定義したTextプロパティ記述例をのせておく。


[Browsable(false)]                              // プロパティウィンドウ非表示
[EditorBrowsable(EditorBrowsableState.Never)]   // インテリセンス非表示
public new string Text
{
    get
    {
        return base.Text;
    }
    set
    {       // 設定を無効にする為、何も記述しない
    }
}

C#2.0以降であれば、setだけ非公開にする事も出来る。こうすると、Textへの設定記述コードがコンパイルエラーとなるので、以下の様に記述した方がよりベターといえる。


[Browsable(false)]                              // プロパティウィンドウ非表示
[EditorBrowsable(EditorBrowsableState.Never)]   // インテリセンス非表示
public new string Text
{
    get
    {
        return base.Text;
    }
    protected set
    {       // 設定を無効にする為、何も記述しない
    }
}

なお、インテリセンス非表示は、MSDNのEditorBrowsableの記述で、"C#では同じアセンブリのクラスのメンバーは非表示になりません。"とある。きわめて解りにくい(誤解しやすい)表現である。正確かどうか不明だが、私なりに解釈した結果、「CurrencyTextBox を定義したソースファイルを含むソリューション内では、上記記述を行っても、インテリセンスは表示されてしまう」という結論に達した(私の環境では、C#2005でこの現象を確認できたが、C#2003ではちゃんとインテリセンス非表示となっているので、C#2005以降の話かもしれない)。
ただ、実際にCurrencyTextBoxを利用するアプリの場合、そのソリューション内にCurrencyTextBoxの定義ソースを含める事はない筈で、この事が問題とはならないだろう。

今回の考察はこれで終了するが、まだ他にいい方法があったら是非コメントしてもらいたい。

« 自作コントロールを使い易くする(説明表示系) | トップページ | プロパティエディタの指定 »

C# Tips」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 公開プロパティを隠す為の考察:

« 自作コントロールを使い易くする(説明表示系) | トップページ | プロパティエディタの指定 »