カスタムDictionaryクラスを作ろう (2)
前回の続き。
CompareModeプロパティの実装
では、手始めにCompareModeというプロパティを実装してみましょう。

CompareModeプロパティは
文字列を比較するメソッドを設定します。値の取得も可能です。
とのこと。ちょいわかりにくいですが、「設定」ができるということは書き込み可能ということ、「値の取得」ができるということは読み取り可能ということなので、要するにProperty Let、Property Getの両方が必要、ということです。
また、
Property CompareMode As CompareMethod
とあるので、CompareModeプロパティはCompareMethod型であるようです。
とりあえず、ここまでの情報を元に実装してみます。
リスト1
Public Property Get CompareMode() As CompareMethod
CompareMode = m_Dictionary.CompareMode
End Property
Public Property Let CompareMode(ByVal CompareMode As CompareMethod)
m_Dictionary.CompareMode = CompareMode
End Property
上段はCompareModeの値を取得するコードです。
たとえば、
Dim dic As Dictionary
Set dic = New Dictionary
Debug.Print dic.CompareMode
こんなコードを実行したとき、3行目のdic.CompareModeの部分が評価されるときにProperty Get CompareMode()プロシージャが実行され、その時点で変数m_Dictionaryに格納されているインスタンスのCompareModeプロパティの値が返される、というしくみです。
下段は、逆にCompareModeに値をセットするコードです。
たとえば、
Dim dic As Dictionary
Set dic = New Dictionary
dic.CompareMode = TextCompare
こんなコードを実行したとき、3行目のdic.CompareMode = TextCompareが評価されるときにProperty Let CompareMode()にTextCompareという値が渡され、変数m_Dictionaryに格納されているインスタンスのCompareModeプロパティにTextCompareという値がセットされる、というしくみです。
CompareMethod列挙体の実装
ところが、リスト1のように実装した状態で「デバッグ」-> 「……のコンパイル」を実行すると、あえなくコンパイルエラーになります。

これは、CompareMethodという列挙体がMicrosoft Scripting Runtimeで定義された列挙体だからです。
参照設定しないと使えないのです。
では、どうするか。
ないものは作ればよろしい。
リスト2
Public Enum CompareMethod
BinaryCompare = 0
TextCompare = 1
DatabaseCompare = 2
End Enum
これを、クラス モジュールDictionaryの宣言セクションに追加するのです。
念のため、ここまでの全コードを載せておきましょう。
ソースコードを
Option Explicit
Public Enum CompareMethod
BinaryCompare = 0
TextCompare = 1
DatabaseCompare = 2
End Enum
Private m_Dictionary As Object
Private Sub Class_Initialize()
Set m_Dictionary = CreateObject("Scripting.Dictionary")
End Sub
Public Property Get CompareMode() As CompareMethod
CompareMode = m_Dictionary.CompareMode
End Property
Public Property Let CompareMode(ByVal CompareMode As CompareMethod)
m_Dictionary.CompareMode = CompareMode
End Property
使ってみる
では、さっそくこのカスタムDictionaryオブジェクトを使ってみましょう。
テキトーな標準モジュールにプロシージャを作って、次のリスト3のように入力します。
リスト3
Private Sub DictionaryTest01()
Dim dic As Dictionary
Set dic = New Dictionary
End Sub
まず、dim dic as dicとかset dic = new dicまで打った時点でDictionaryが候補に出てくることでしょう。
さらに、dic.と打てばCompareModeが入力候補に出てくるはずです。

このとおり。
あとは、この要領で必要なプロパティ・メソッドを生やしていくだけですが、その前にCompareModeプロパティの仕上げをしておきましょう。
CompareMethodプロパティのデフォルト値を明示しておく
別に何もしなくてもCompareMethodプロパティのデフォルト値はBinaryCompareなのですが、それをソースコード上で明示しておきましょう。
Class_Initialize()メソッドに次のように追記します。
リスト4
Private Sub Class_Initialize()
Set m_Dictionary = CreateObject("Scripting.Dictionary")
m_Dictionary.CompareMode = BinaryCompare
End Sub
m_Dictionaryには〝ホンモノ〟のScripting.Dictionaryインスタンスが格納されており、Scripting.DictionaryのCompareModeプロパティのデフォルト値はBinaryCompareなので、別に何もしなくても良いのですが、ソースコード上で明示しておくのは良い心掛けだと思うのでこうしておきました。
おわりに
次回はAdd()メソッドの実装です。