カスタムDictionaryクラスを作ろう (2)

カスタムDictionaryクラスを作ろう (2)

akashi-keirin.hatenablog.com

前回の続き。

CompareModeプロパティの実装

では、手始めにCompareModeというプロパティを実装してみましょう。

CompareModeプロパティは

文字列を比較するメソッドを設定します。値の取得も可能です。

とのこと。ちょいわかりにくいですが、「設定」ができるということは書き込み可能ということ、「値の取得」ができるということは読み取り可能ということなので、要するにProperty LetProperty 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()メソッドの実装です。

akashi-keirin.hatenablog.com