- PR -

読み取り専用のハッシュテーブル

1
投稿者投稿内容
やんたん
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 63
投稿日時: 2003-08-22 19:01
読み取り専用のハッシュオブジェクトを用意したいと思っております。
JavaでいうところのPropertiesオブジェクト相当ものです。
.NETでもありそうなもんですが、見当たらなかったもので。。
そのようなオブジェクトは提供されているのでしょうか?
もし提供されていないようであれば何かよい実装方法はありませんでしょうか。

よろしくお願いします。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-08-22 21:52
読み取り専用のプロパティを使えばいいんじゃないでしょうか。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-23 04:49
引用:

catsさんの書き込み (2003-08-22 21:52) より:
読み取り専用のプロパティを使えばいいんじゃないでしょうか。


IDictionary.IsReadOnly プロパティですかね?
このプロパティって読み取り専用(ややこしい)なんですよね。
コレクションによってはもともと読取専用になっているものもあるかもしれませんが、よく知りません。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-23 05:05
引用:

やんたんさんの書き込み (2003-08-22 19:01) より:
読み取り専用のハッシュオブジェクトを用意したいと思っております。
JavaでいうところのPropertiesオブジェクト相当ものです。
.NETでもありそうなもんですが、見当たらなかったもので。。
そのようなオブジェクトは提供されているのでしょうか?
もし提供されていないようであれば何かよい実装方法はありませんでしょうか。


どういう用途かという部分が若干気になるんですが(システム、環境により提供されるプロパティ機能のようなものなのか、自分のプログラム内で自由に使いたいのかなど)、とりあえず読取専用に設定できるクラスがあるのかはよく分かりません(というか、知っている限りでは無い様に思います)。

例えばDictionaryBaseを継承して、ReadOnlyなディクショナリを作成するとかになると思います。この場合も、特定のメソッド呼び出しなどのタイミングで読取専用にするのか、最初から読取専用にする(つまり初期化時にしかデータをセットできないようにする)のかなどでやり方や注意点などが変わってきます。

本当に読取専用(クラスのインタフェースレベルで読み取りしか出来ないクラス)にするのなら、Hashtableなどをメンバに持つようにして、新しいクラスを作成する必要があると思われます。この場合はIDictionaryインタフェースを実装できないので、使い勝手に問題が出てくるかもしれません。

どちらにしても、ある程度自作しないと仕方ないように思われます。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-08-24 14:57
引用:

なちゃさんの書き込み (2003-08-23 05:05) より:
本当に読取専用(クラスのインタフェースレベルで読み取りしか出来ないクラス)にするのなら、Hashtableなどをメンバに持つようにして、新しいクラスを作成する必要があると思われます。この場合はIDictionaryインタフェースを実装できないので、使い勝手に問題が出てくるかもしれません。



なぜIDictionaryインタフェースを実装できないのでしょうか?
IsReadOnlyプロパティはTrueを返す、
Add/Remove/ClearメソッドはNotSupportedExceptionを上げる、
といったような実装で実現できませんか?

--編集による追記--
ItemプロパティのセッターもNotSupportedExceptionを上げないといけませんね。


[ メッセージ編集済み 編集者: よねKEN 編集日時 2003-08-24 16:59 ]
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2003-08-24 15:26
引用:

やんたんさんの書き込み (2003-08-22 19:01) より:
読み取り専用のハッシュオブジェクトを用意したいと思っております。
JavaでいうところのPropertiesオブジェクト相当ものです。



java.util.Properties は読み取り専用じゃないですよ...


[ メッセージ編集済み 編集者: サ 編集日時 2003-08-24 15:27 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-24 15:44
引用:

よねKENさんの書き込み (2003-08-24 14:57) より:
引用:

なちゃさんの書き込み (2003-08-23 05:05) より:
本当に読取専用(クラスのインタフェースレベルで読み取りしか出来ないクラス)にするのなら、Hashtableなどをメンバに持つようにして、新しいクラスを作成する必要があると思われます。この場合はIDictionaryインタフェースを実装できないので、使い勝手に問題が出てくるかもしれません。



なぜIDictionaryインタフェースを実装できないのでしょうか?
IsReadOnlyプロパティはTrueを返す、
Add/Remove/ClearメソッドはNotSupportedExceptionを上げる、
といったような実装で実現できませんか?


いや、ですから
> 本当に読取専用(クラスのインタフェースレベルで読み取りしか出来ないクラス)
> にするのなら
と書いたんですが。
「クラスのインタフェースレベルで読み取りしか出来ない」と言ったのは、ようはコード上そういうメソッドなどの呼び出し自体が出来ない(コンパイル時レベルのインタフェース)と言う意味で言いました。
もちろん、コレクションの実装としては、よねKENさんの方法で問題はないわけですが。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-08-24 16:57
引用:

なちゃさんの書き込み (2003-08-24 15:44) より:
いや、ですから
> 本当に読取専用(クラスのインタフェースレベルで読み取りしか出来ないクラス)
> にするのなら
と書いたんですが。
「クラスのインタフェースレベルで読み取りしか出来ない」と言ったのは、ようはコード上そういうメソッドなどの呼び出し自体が出来ない(コンパイル時レベルのインタフェース)と言う意味で言いました。



そういう意味でしたか失礼しました。
そういうことなら、IDictionaryインタフェースは実装しつつ、
読み取り専用の独自のインタフェース(例えば、IReadOnlyDictionaryとかいう名前で)
を用意して、それも同様に実装すればいいのではないでしょうか?

IDictionaryとしても扱えるし、読み取り専用のDictionaryとして扱いたい場合は、
IReadOnlyDictionaryで扱えばOKですよね。

#IDictionaryとして扱う場合にAddなどが呼べます。IDictionaryとして扱うときは、
#読み取り専用かどうかはIsReadOnlyプロパティで調べるか、あるいは、
#NotSupportExceptionをキャッチするかをしないといけませんが、
#これはIDictionaryインタフェース自体の仕様なので、また、別の話ですね。

1

スキルアップ/キャリアアップ(JOB@IT)