2008/12/24

[VB.NET]文字列型列挙体の実装

enumとか使っていると、文字列型列挙体が欲しくなってきます。

VB.NETはまだ初心者ですけど、ちょっと考え付いたのでメモ書き。

以下コードと解説



コード



Public Structure sampleStructure
      Public Const hoge As String = "hogehoge"
      Public Const fuga As String = "fugafuga"
      Public Const foo As String = "foofoo"
      Public Const bar As String = "barbar"

      '構造体用インスタンスメンバをダミー実装
      Private dummy As String

      '構造体のReferenceEqualsを参照出来なくする。
      Private Shadows Function ReferenceEquals() As Object
          Return New Object
        End Function

      '構造体のEqualsを参照出来なくする。
      Private Shadows Function equals() As Object
          Return New Object
        End Function
  End Structure




解説

ポイントはインスタンスメンバのdummy実装と、shadowsによる参照制限


インスタンスメンバのdummy実装はもしかしたら何とかできるかもしれない。
とりあえずメンバ変数がConstのみだとコンパイラに怒られるので、
Private宣言でdummyを実装してみた。


もちろん インスタンスメンバをPrivate宣言に変更し、
ReadOnly Property でゲッターメソッドのみを定義すれば
dummy実装なんていらないんだろうけど。

構造体自体の可読性を重視して廃止。


次に構造体はequalsメソッドと、
ReferenceEqualsメソッドを実装している。
これらがあると、この構造体を参照した時に両メソッドが参照されてしまう。



それを防ぐためにShadowsで両メソッドをPrivateで上書きする。

そうすると。候補から両メソッドが消える。


以上で解説終わり。



2 件のコメント:

  1. 列挙体のメリットの一つに、
    Dim a As 列挙体
    と書いて、列挙体のメンバを指定することを明示できる点もありますよね。

    そういった使い方もできるようにするには、どうしたらいいんだろう。

    返信削除
  2. コメントありがとうございます。
    これを書いたのは大分前なので、現在はVB.NETにネイティブなENUM使えるみたいなのでそちらを使う事をお勧めします。

    http://msdn.microsoft.com/en-us/library/8h84wky1(v=vs.80).aspx

    Dim a As 列挙体も出来ます。

    返信削除