- PR -

IDictionary実装時のGetEnumeratorの記述について

1
投稿者投稿内容
Hodgkin
常連さん
会議室デビュー日: 2003/07/18
投稿数: 34
投稿日時: 2005-05-30 10:26
現在、VB.NET(.NET Framework1.0 SP2)で開発を行っております。
そこで、IDictionaryを実装し、アイテムを追加した順に取得出来るクラスを作成しようとしております。
(既存のソースへの変更を最小限にするためにIDictionaryの実装は必須です。)

 Public Class XXXXXMap Implements IDictionary

GetEnumerator()メソッド以外の実装は行えたのですが、GetEnumerator()だけが実装できません。

 Public Overridable Overloads Function GetEnumerator() As IDictionaryEnumerator Implements IDictionary.GetEnumerator
 End Function

 Public Overridable Overloads Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
 End Function

と書いたところ、GetEnumerator()が
「戻り値のみが異なるため、お互いをオーバーロードできません。」とエラーが出ます。
ならばと

 Public Overridable Overloads Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator, IDictionary.GetEnumerator
 End Function

と書くと
「IEnumerable.GetEnumeratorを2回実装することは出来ません」とエラーメッセージが出ます。

IEnumerable
  △
  |
IDictionary

IEnumerator
  △
  |
IDictionaryEnumerator

という関係から、

 Public Overridable Overloads Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
 End Function

とも書いてみたのですが、
「IDictionary.GetEnumeratorが実装されていない」とエラーが出ます。

かなり初歩的な質問で申し訳ありません。
何卒、ご教授願えないでしょうか。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-05-30 11:11
コード:
Public Overridable Overloads Function GetEnumerator() As System.Collections.IDictionaryEnumerator Implements IDictionary.GetEnumerator



VSを使用しているなら、Tabでテンプレートができると思いますが。
あとOverloadsが必要なのかが疑問です。
Hodgkin
常連さん
会議室デビュー日: 2003/07/18
投稿数: 34
投稿日時: 2005-05-30 11:29
burton999さんありがとうございます。

本件ですが、ListDictionaryクラスを使用することで解決いたしました。
(クラスライブラリの勉強不足でした)

開発で、VSは使用していますが、
「VSを使用しているなら、Tabでテンプレートができると思いますが。」とはどういう事なんでしょう?
インターフェースを実装するクラスを作成する際に自動的にメソッドの記述(メソッドの中身の実装以外)を行ってくれる機能があるって事なのでしょうか?
どのタイミングでTabキーを押下すればいいのでしょうか?

確かにburton999さんの言われるとおりOverloads は不要な気がしてきました…
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-05-30 11:37
Implements GetEnumerator
を入力している途中で[Ctrl + Space]で候補を出して
Enterでテンプレートが生成されます。C#だとタブです。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-05-30 12:02
Hodgkinさん、こんにちは。

引用:

(既存のソースへの変更を最小限にするためにIDictionaryの実装は必須です。)


であれば、IDictionary.GetEnumerator を当たり前に実装するべきではないかと思うのですが…。
敢えて IEnumerable.GetEnumerator を 実装しようとしているのは、for each 列挙で、キーと値のペア(DictionaryEntry)ではなく、値そのものを列挙したい、という事なんですよね? まあ、気持ちは判りますが…。
しかしそれでは「IDictionaryの実装は必須」という前提と矛盾するような気がします。

【追記】
この辺↑の挙動について確認してみようと思い、IDictionary を実装するクラスを作ってみたんですが、IDictionary.GetEnumerator と Enumerable.GetEnumerator の両方を実装しろと怒られますね…。失礼しました。

IDictionary を実装するクラスに対して、For Each 列挙を行った場合の正常な動作を考えると、Enumerable.GetEnumerator の実装メソッドの名前を適当に変更して、Private に変えてやれば良いのではないかと思います。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2005-05-30 12:45 ]
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-05-30 12:32
引用:

敢えて IEnumerable.GetEnumerator を 実装しようとしている


というか、IDictionary が IEnumerable を継承しているので IEnumerable.GetEnumerator
も実装せざるを得ないという状態だと推測しているのですが。

IEnumerable を実装する場合、C# でいうところの明示的実装を行う必要があると
思っています。
VB.NET の構文はわからないので推測ですが、IEnumerable.GetEnumerator を Public に
しないで実装すればいいのではないでしょうか。

これから実験してみます。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-05-30 12:39
試してみたところ、VB.NET ではメソッドごとに Implements 句で
実装するインタフェースとメソッドを指定するため、
メソッド名はインタフェースのメソッド名と異なっても構わないようですね。

自動生成したところ、
コード:
    Public Function GetEnumerator() As IDictionaryEnumerator Implements IDictionary.GetEnumerator
    Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator


が生成されました。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-05-30 12:55
にしざきさん、こんにちは。
引用:

というか、IDictionary が IEnumerable を継承しているので IEnumerable.GetEnumerator
も実装せざるを得ないという状態だと推測しているのですが。


↓にも書きましたが、どうもそのようですね。

引用:

きくちゃんの書き込み (2005-05-30 12:02) より:
【追記】


1

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