.NET 定数ファイルを作成する ~その2~
.NET 定数ファイルを作成する ~その3~
.NET 定数ファイルを作成する ~その4~ インテリセンスに候補を表示する
.NET 定数ファイルを作成する ~その5~ 定数のリストを作成する
System.Drawing.Colorオブジェクトは「=」や「<>」で比較することができます。
Dim c1 As System.Drawing.Color = Color.Red Dim c2 As System.Drawing.Color = Color.Red Console.WriteLine("c1=c2:" & (c1 = c2)) Console.WriteLine("c1<>c2:" & (c1 <> c2))
しかし前回作成したConstantItemクラスは「=」や「<>」で比較するとコンパイルエラーになってしまいます。
そこで、System.Drawing.Colorと同じように「=」や「<>」で比較できるように、
前回(.NET 定数ファイルを作成する ~その5~ 定数のリストを作成する)作成したConstantItemに変更を加えます。
「=」演算子と「<>」演算子をオーバーロードし、_iCdフィールドの値が同じなら「=」演算子はtrueを返すようにします。
Namespace Constant ''' <summary> ''' 定数アイテムの基底クラスです。 ''' </summary> Public MustInherit Class ConstantItem '-----フィールド----- ''' <summary>コード</summary> Protected _iCd As Integer ''' <summary>名前</summary> Protected _sName As String ''' <summary>別名</summary> Protected _sAliasName As String '-----Publicプロパティ----- ''' <summary>コードを取得します</summary> Public ReadOnly Property Cd() As Integer Get Return Me._iCd End Get End Property ''' <summary>名前を取得します。</summary> Public ReadOnly Property Name() As String Get Return Me._sName End Get End Property ''' <summary>別名を取得します。</summary> Public ReadOnly Property AliasName() As String Get Return Me._sAliasName End Get End Property '-----コンストラクタ----- ''' <summary>引数を取らないコンストラクタ</summary> Private Sub New() End Sub ''' <summary>コードと名前を引数に取るコンストラクタ</summary> Public Sub New(ByVal cd As Integer, ByVal name As String) MyBase.New() Me._iCd = cd Me._sName = name End Sub ''' <summary>コードと名前と別名を引数に取るコンストラクタ</summary> Public Sub New(ByVal cd As Integer, ByVal name As String, ByVal aliasname As String) Me.New(cd, name) Me._sAliasName = aliasname End Sub '-----Public Overridesメソッド----- ''' <summary> ''' ToStringメソッド ''' </summary> Public Overrides Function ToString() As String Return String.Format("Cd={0},Nmae={1},AliasName={2}", Me._iCd, Me._sName, Me._sAliasName) End Function '-----Operator----- ''' <summary< ''' =オペレータ ''' </summary< Public Shared Operator =(ByVal left As ConstantItem, ByVal right As ConstantItem) As Boolean 'cdが同じなら=の結果もtrueとする。 If (left Is Nothing) OrElse (right Is Nothing) Then Return (left Is Nothing) And (right Is Nothing) Else Return (left.Cd = right.Cd) End If End Operator ''' <summary> ''' <>オペレータ ''' </summary> Public Shared Operator <>(ByVal left As ConstantItem, ByVal right As ConstantItem) As Boolean If (left Is Nothing) OrElse (right Is Nothing) Then Return Not ((left Is Nothing) And (right Is Nothing)) Else Return Not (left.Cd = right.Cd) End If End Operator End Class End Namespace
WeekDayTypeクラス 前回のまま変更はありません。
Namespace Constant ''' <summary> ''' 曜日 ''' </summary> Public NotInheritable Class WeekDayType : Inherits ConstantItem Public Shared ReadOnly Items As New ConstantItemCollection(Of WeekDayType) Public Shared ReadOnly Sun As New WeekDayType(1, "日曜日", "日") Public Shared ReadOnly Mon As New WeekDayType(2, "月曜日", "月") Public Shared ReadOnly Tue As New WeekDayType(3, "火曜日", "火") Public Shared ReadOnly Wed As New WeekDayType(4, "水曜日", "水") Public Shared ReadOnly Thr As New WeekDayType(5, "木曜日", "木") Public Shared ReadOnly Fri As New WeekDayType(6, "金曜日", "金") Public Shared ReadOnly Sat As New WeekDayType(7, "土曜日", "土") Private Sub New(ByVal cd As Integer, ByVal name As String, ByVal aliasname As String) MyBase.new(cd, name, aliasname) Items.Add(Me) End Sub End Class End Namespace
ConstantItemCollectionクラス 前回のまま変更はありません。
Namespace Constant Namespace Constant ''' <summary> ''' 定数アイテムを管理するコレクションクラスです。 ''' </summary> Public Class ConstantItemCollection(Of T As ConstantItem) Inherits List(Of T) Implements ICloneable ''' <summary> ''' 定義されている定数アイテムより、引数に指定したcdをもつアイテムを検索します。 ''' </summary> Public Function GetItem(ByVal cd As Integer) As T For idx As Integer = 0 To Me.Count - 1 If cd = CType(Me.Item(idx), ConstantItem).Cd Then Return CType(Me.Item(idx), T) End If Next Return Nothing End Function ''' <summary> ''' 定義されている定数アイテムより、引数に指定したnameをもつアイテムを検索します。 ''' </summary> Public Function GetItem(ByVal name As String) As T For idx As Integer = 0 To Me.Count - 1 If name = CType(Me.Item(idx), ConstantItem).Name Then Return CType(Me.Item(idx), T) End If Next Return Nothing End Function ''' <summary> ''' Copyメソッド ''' </summary> Public Function Copy() As ConstantItemCollection(Of T) Return DirectCast(Me.Clone(), ConstantItemCollection(Of T)) End Function '-----ICloneableインターフェースのimplementsメソッド----- ''' <summary> ''' Cloneメソッド ''' </summary> Private Function Clone() As Object Implements System.ICloneable.Clone '戻り値がObject型だと不便なのでPrivateにしCopyメソッドをPublicで公開します。 Return Me.MemberwiseClone() End Function End Class End Namespace
これで「=」や「<>」での比較もコンパイルエラーになりません。
Dim w1 As Constant.DayOfWeekType = Constant.DayOfWeekType.Fri Dim w2 As Constant.DayOfWeekType = Constant.DayOfWeekType.Fri Console.WriteLine("w1=w2:" & (w1 = w2)) Console.WriteLine("w1<>w2:" & (w1 <> w2))
0 件のコメント:
コメントを投稿