- PR -

For Each で呼び出せるクラスを作りたいです

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 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 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-28 18:44
R・田中一郎さん、こんばんは。

取り敢えず、「MSDNライブラリ」のこの辺りとか、目を通してみませんか?
そうすると、「Visual Basic 言語の概念」-「For Each...Next ステートメント」というトピックにも行き着くと思うんですが…。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-28 19:03
引用:

というか、少しずつ不安になってきたのですが、僕だけ根本的に何かずれていますか?
皆さんはこのように書くことがないのでしょうか?

dim まとめ as new まとめクラス
for each t as object in まとめ
  dim 個別 as 個別クラス = CType(t, 個別クラス) ←こんな書き方が良いんですか?
  messagebox.show(個別.プロパティ)
next



単に for each で回すだけなら配列かArrayListで十分でしょう。
独自クラスにするのは、何か理由があるのでしょうか?

[ メッセージ編集済み 編集者: todo 編集日時 2005-11-28 19:03 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-28 19:27
皆さん、僕のために親切にありがとうございます。
皆さんに教わったおかげで、少しずつ for each の仕組みが理解できるようになってきました。
引き続き、勉強したいと思います。

今日、初めてクラスの継承というのをやってみました。
おかげで、mybase の存在と、shadow, overload, override の意味や違いなど、今日一日で随分と成長することができました。
これも、この場の皆さんのおかげです。

ちなみに、今苦しんでいるのはインターフェースって何だろうということです。
プロパティやメソッドを固定的に定義するもの?
ということでしょうか。
きっとインターフェースを知ることが、for each で回せるクラスを作る一歩なんでしょうね。

>単に for each で回すだけなら配列かArrayListで十分でしょう。
>独自クラスにするのは、何か理由があるのでしょうか?

はい。
まとめクラスには、もっとたくさんの機能(勿論、まとめクラスという名前ではないです)があるので、独自クラスにしました。
で、for each で書きたい部分がでてきたので、調べているところなのです。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-28 20:50
HushTableはAddするときにKeyとValueを与えます。
で、取り出すときはこれらのペアでもらうことになるようです。

コード:

For Each dictionaryEntry As DictionaryEntry In まとめ
key = dictionaryEntry.Key
value = dictionaryEntry.Value
:



で、今回のケースは
コード:

dim 個別 as 個別クラス = dictionaryEntry.Value


で取れるはずだと思います。

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-28 20:56 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-28 20:55
ってか、何でみんな HashTable 使うん?
なんか、目的と手段がずれている気がする。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-28 21:09
引用:

Jittaさんの書き込み (2005-11-28 20:55) より:
ってか、何でみんな HashTable 使うん?
なんか、目的と手段がずれている気がする。



ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには
みなさん、どうしていますか?

私はCollectionBaseで回していますけど
こんな時にHashTable 使うのかな?

どこかにガイドライン的なドキュメントありますか?

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