こんな感じでしょうか。
Public Class Constant Public Const SUN As Integer = 1 Public Const MON As Integer = 2 Public Const TUE As Integer = 3 Public Const WED As Integer = 4 Public Const THR As Integer = 5 Public Const FRI As Integer = 6 Public Const SAT As Integer = 7 End Class
この定数ファイル「Constant」にどんどん定数を作っていくと、
Constantoのインテリセンスから定数を探すのが大変です。
そこでグループ化したいと考えて、簡単に列挙体にしました。
Public Class Constant Public Enum WeekDay SUN = 1 MON = 2 TUE = 3 WED = 4 THR = 5 FRI = 6 SAT = 7 End Enum End Class
よくある事ですが
SUNを指定したとき「1」を取得したい場合と「日曜日」を取得したい場合があると思います。
そこで列挙体をクラスに変え、KeyValuePairで値と名前をセットで宣言するようにしました。
使うときはConstant.WeekDay.SUN.Keyで「1」を取得し、Constant.WeekDay.SUN.Valueで「日曜日」を取得します。
Namespace Constant Public Class WeekDay Public Shared ReadOnly SUN As New KeyValuePair(Of Integer, String)(1, "日曜日") Public Shared ReadOnly MON As New KeyValuePair(Of Integer, String)(2, "月曜日") Public Shared ReadOnly TUE As New KeyValuePair(Of Integer, String)(3, "火曜日") Public Shared ReadOnly WED As New KeyValuePair(Of Integer, String)(4, "水曜日") Public Shared ReadOnly THR As New KeyValuePair(Of Integer, String)(5, "木曜日") Public Shared ReadOnly FRI As New KeyValuePair(Of Integer, String)(6, "金曜日") Public Shared ReadOnly SAT As New KeyValuePair(Of Integer, String)(7, "土曜日") End Class End Namespace
ところが
SUNを指定したとき「日曜日」とは別に「日」を取得したい場合が出てきました。
そこで値「1」と名前「日曜日」と別名「日」をセットで管理するクラスを作成します。
これで「Sunday」や「Sun」など別名がふえても、プロパティを追加すれば大丈夫です。
NameSpace Constant Public Class ConstItem Private _Cd As Integer Private _Name As String Private _AliasName As String Private Sub New End Sub Public Sub New(cd As Integer, name As String) Me._Cd = cd Me._Name = name Me._AliasName = String.Empty End Sub Public Sub New(cd As Integer, name As String, aliasName As String) Me._Cd = cd Me._Name = name Me._AliasName = aliasName End Sub Public ReadOnly Property Cd() As Integer Get Return Me._Cd End Get End Property Public ReadOnly Property Name() As String Get Return Me._Name End Get End Property Public ReadOnly Property AliasName() As String Get Return Me._AliasName End Get End Property End Class End NameSpace
NameSpace Constant Public Class WeekDay Public Shared ReadOnly SUN As New ConstItem(1, "日曜日","日") Public Shared ReadOnly MON As New ConstItem(2, "月曜日","月") Public Shared ReadOnly TUE As New ConstItem(3, "火曜日","火") Public Shared ReadOnly WED As New ConstItem(4, "水曜日","水") Public Shared ReadOnly THR As New ConstItem(5, "木曜日","木") Public Shared ReadOnly FRI As New ConstItem(6, "金曜日","金") Public Shared ReadOnly SAT As New ConstItem(7, "土曜日","土") End Class End NameSpace
使うときはConstant.WeekDay.SUN.Cdで「1」を取得し、Constant.WeekDay.SUN.Nameで「日曜日」を取得し、Constant.WeekDay.SUN.AliasNameで「日」を取得します。
今度はこの定数をコンボボックスのリストアイテムにセットしたい場面が出てきました。
その都度リストを作るのが面倒とのことで、WeekDayクラスにリストを作るメソッドを用意します。
※インスタンス化せずに使える事が前提です。
NameSpace Constant Public Class WeekDay Public Shared ReadOnly SUN As New ConstItem(1, "日曜日","日") Public Shared ReadOnly MON As New ConstItem(2, "月曜日","月") Public Shared ReadOnly TUE As New ConstItem(3, "火曜日","火") Public Shared ReadOnly WED As New ConstItem(4, "水曜日","水") Public Shared ReadOnly THR As New ConstItem(5, "木曜日","木") Public Shared ReadOnly FRI As New ConstItem(6, "金曜日","金") Public Shared ReadOnly SAT As New ConstItem(7, "土曜日","土") Public Shared Function CreateList As List(Of ConstItem) Dim list As New List(Of ConstItem) list.Add(SUN) list.Add(MON) list.Add(TUE) list.Add(WED) list.Add(THR) list.Add(FRI) list.Add(SAT) Return list End Function End Class End NameSpace
コンボボックスにWeekDayリスト設定するときは以下のようにします。
ComboBox1.ValueMember = "Cd"
ComboBox1.DisplayMember = "Name"
’別名の場合
'ComboBox1.DisplayMember = "AliasName"
ComboBox1.DataSource = Constant.WeekDay.CreateList
ところがWeekDayクラスにNone[0]を追加してほしい。しかしNone[0]がないWeekDayもそのまま使いたいとの要望がありました。
仕方がないのでWeekDayクラスを継承してWeekDayHasNoneクラスを作成しました。
NameSpace Constant Public Class WeekDayHasNone Inherits WeekDay Public Shared ReadOnly NONE As New ConstItem(0, "なし") Public Shared Shadows Function CreateList As List(Of ConstItem) Dim list As List(Of ConstItem) list = WeekDay.CreateList list.InsertAt(0,NONE) Return list End Function End Class End NameSpace
さらにWeekDayクラスからSUN[1]を削除したものが欲しい。しかしSUN[1]があるWeekDayもそのまま使いたいとの要望がありました。
WeekDayクラスを継承してWeekDayHasNotSunクラスを作成しました。
NameSpace Constant Public Class WeekDayHasNotSun Inherits WeekDay Private Shared Shadows ReadOnly SUN As New ConstItem(1, "日曜日","日") Public Shared Shadows Function CreateList As List(Of ConstItem) Dim list As List(Of ConstItem) list = WeekDay.CreateList list.RemoveAt(WeekDay.SUN) Return list End Function End Class End NameSpace
CDから名前を検索できるメソッドがあればいいよね(もちろんインスタンス化せずに)との要望。←今ココ
・・・どうするかなぁ
0 件のコメント:
コメントを投稿