- - PR -
For Each で呼び出せるクラスを作りたいです
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-28 17:54
ああっ、また時差になってしまった。
>キャスト ミスの例外が出ていないでしょうか? しかも、などと先を見越したご指摘。 本当に申し訳ありません。 ところで、 dim まとめ as new まとめクラス for each 個別 as 個別クラス in まとめ ← ここで例外エラーがでます!! messagebox.show(個別.プロパティ) next このように書けるようにするためには、やはりクラス側の item プロパティ側でキャストさせる必要があるのでしょうか。 というか、少しずつ不安になってきたのですが、僕だけ根本的に何かずれていますか? 皆さんはこのように書くことがないのでしょうか? dim まとめ as new まとめクラス for each t as object in まとめ dim 個別 as 個別クラス = CType(t, 個別クラス) ←こんな書き方が良いんですか? messagebox.show(個別.プロパティ) next | ||||||||
|
投稿日時: 2005-11-28 17:56
こんにちは。
for each がどうやって実現されているかをもう少し調べてみたら、例外の理由も分かってくるでしょう。 for each (1) in (2) の (2) の部分にくるオブジェクトは、IEnumerable を実装しているクラスのインスタンスである必要があります。 HashTable はこの場合条件を満たしていますね。 で、(1)のオブジェクトは、(2)で 「IEnumerable.GetEnumerator()」で呼び出された、「IEnumerator.Current」の戻りです。 で、HashTable の場合、この 「IEnumerator.Current」は、「DictionaryEntry」です。 つまり、(1)には、DictionaryEntry か、その基本型しか駄目だという事です。 では、どうするのか。 他の人も仰っていますが、IEnumerable を独自に実装して、IEnumerator を独自に実装したクラスを返すか、CollectionBase を継承したクラスを作るとかでしょう。 どうしても HashTable を継承して実装したい場合、GetEnumerator() をオーバーライドして、IDictionaryEnumerator 実装した独自のクラスを返す事になるでしょう。 (virtual だからできるみたいですが) #編集 機種依存文字を修正 _________________ 囚人のジレンマな日々 [ メッセージ編集済み 編集者: 囚人 編集日時 2005-11-28 23:36 ] | ||||||||
|
投稿日時: 2005-11-28 18:44
R・田中一郎さん、こんばんは。
取り敢えず、「MSDNライブラリ」のこの辺りとか、目を通してみませんか? そうすると、「Visual Basic 言語の概念」-「For Each...Next ステートメント」というトピックにも行き着くと思うんですが…。 | ||||||||
|
投稿日時: 2005-11-28 19:03
単に for each で回すだけなら配列かArrayListで十分でしょう。 独自クラスにするのは、何か理由があるのでしょうか? [ メッセージ編集済み 編集者: todo 編集日時 2005-11-28 19:03 ] | ||||||||
|
投稿日時: 2005-11-28 19:27
皆さん、僕のために親切にありがとうございます。
皆さんに教わったおかげで、少しずつ for each の仕組みが理解できるようになってきました。 引き続き、勉強したいと思います。 今日、初めてクラスの継承というのをやってみました。 おかげで、mybase の存在と、shadow, overload, override の意味や違いなど、今日一日で随分と成長することができました。 これも、この場の皆さんのおかげです。 ちなみに、今苦しんでいるのはインターフェースって何だろうということです。 プロパティやメソッドを固定的に定義するもの? ということでしょうか。 きっとインターフェースを知ることが、for each で回せるクラスを作る一歩なんでしょうね。 >単に for each で回すだけなら配列かArrayListで十分でしょう。 >独自クラスにするのは、何か理由があるのでしょうか? はい。 まとめクラスには、もっとたくさんの機能(勿論、まとめクラスという名前ではないです)があるので、独自クラスにしました。 で、for each で書きたい部分がでてきたので、調べているところなのです。 | ||||||||
|
投稿日時: 2005-11-28 20:50
HushTableはAddするときにKeyとValueを与えます。
で、取り出すときはこれらのペアでもらうことになるようです。
で、今回のケースは
で取れるはずだと思います。 [ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-28 20:56 ] | ||||||||
|
投稿日時: 2005-11-28 20:55
ってか、何でみんな HashTable 使うん?
なんか、目的と手段がずれている気がする。 | ||||||||
|
投稿日時: 2005-11-28 21:09
ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには みなさん、どうしていますか? 私はCollectionBaseで回していますけど こんな時にHashTable 使うのかな? どこかにガイドライン的なドキュメントありますか? |