前回はクラスの概要の説明でした。今回はさっそくクラスの作成に取り掛かります。Visual Studio で空白のプロジェクトを用意してください。
プロジェクトの名前は "ペントミノソルバー3D" です。
最初は「Coordクラス」、3次元の空間にある点を表す座標クラスです。クラス全体のソースはページの最後にまとめて載せます。
・クラス宣言
クラスの名前は "Coord" です(座標を表す英語 Coordinate の略)。
Public Class Coord
・プロパティ
プロパティはX, Y, Z の各座標のみです。X軸は右、Y軸は手前、Z軸は上 がプラスです。スコープはReadOnlyなので他のクラスからは変更不可です。クラス内で変更するときは、プロパティ名の先頭にアンダースコアを付けた特別な名前を使用します。
ReadOnly Property X As Integer '左右(Width:右がプラス) ReadOnly Property Y As Integer '前後(Depth:手前がプラス) ReadOnly Property Z As Integer '上下(Height:上がプラス)
・初期化
引数に座標( x, y, z )が必要です。
Sub New(x As Integer, y As Integer, z As Integer) _X = x _Y = y _Z = z End Sub '=====(例)===== Dim p As New Coord(1, 2, 3)
・座標の変更
指定の座標に変更します。
Public Sub MoveTo(x As Integer, y As Integer, z As Integer) _X = x _Y = y _Z = z End Sub '=====(例)===== Dim p As New Coord(1, 2, 3) p.MoveTo(3, 4, 5) 'pの座標は (3, 4, 5) に変更されます
・複製(関数)
同じプロパティを持つインスタンスをもう一つ作るときのために、このような関数を作っておくと便利です。下の例では p2, p3 はいずれも p1 と同じ座標を持ちますが p1 と p2 は同じインスタンス、p1 と p3 は違うインスタンスになります。
Public Function Clone() As Coord Return New Coord(X, Y, Z) End Function '=====(例)===== Dim p1 As New Coord(1, 2, 3) Dim p2 = p1 '同一インスタンス(p2 is p1) Dim P3 = p1.clone() '別インスタンス(p3 isNot p1)
・演算子定義
2つのクラスを比較する is演算子 は、インスタンスが同一かどうかのみを評価します。インスタンスではなくプロパティが等しいかどうかを評価したいときは自分でコーディングするしかありません。VB.Net はこのように自作した評価コードに =演算子 や <>演算子 が使えるので便利です。
Public Shared Operator =(c1 As Coord, c2 As Coord) As Boolean Return (c1.X = c2.X) AndAlso (c1.Y = c2.Y) AndAlso (c1.Z = c2.Z) End Operator Public Shared Operator <>(c1 As Coord, c2 As Coord) As Boolean Return Not (c1 = c2) End Operator '=====(例)===== Dim p1 As New Coord(1, 2, 3) Dim p2 As New Coord(1, 2, 3) MsgBox(If(p1 Is p2, "True", "Flase")) 'Falseが表示されます MsgBox(If(p1 = p2, "True", "Flase")) 'Trueが表示されます
・座標の回転
反時計回りに90度単位で回転させます。引数には90度単位の回転回数を指定します。
'XY平面で反時計回りに回転 Public Sub RotateXY(ct As Integer) Do While ct > 0 Dim W = X _X = Y _Y = -W ct -= 1 Loop End Sub 'XZ平面で反時計回りに回転 Public Sub RotateXZ(ct As Integer) Do While ct > 0 Dim W = Z _Z = X _X = -W ct -= 1 Loop End Sub 'YZ平面で反時計回りに回転 Public Sub RotateYZ(ct As Integer) Do While ct > 0 Dim W = Y _Y = Z _Z = -W ct -= 1 Loop End Sub '=====(例)===== Dim p1 As New Coord(1, 2, 3) p1.RotateXY(1) 'XY平面で反時計回り90度、p1は(2,-1, 3)になります
以上が「座標クラス」です。クラス全体のソースは以下のとおりです。
Public Class Coord '********************************************** '* Coord (座標クラス) '********************************************** ReadOnly Property X As Integer '左右(Width:右がプラス) ReadOnly Property Y As Integer '前後(Depth:手前がプラス) ReadOnly Property Z As Integer '上下(Height:上がプラス) Sub New(x As Integer, y As Integer, z As Integer) _X = x _Y = y _Z = z End Sub '座標の変更 Public Sub MoveTo(x As Integer, y As Integer, z As Integer) _X = x _Y = y _Z = z End Sub '複製 Public Function Clone() As Coord Return New Coord(X, Y, Z) End Function '演算子定義(=) Public Shared Operator =(c1 As Coord, c2 As Coord) As Boolean Return (c1.X = c2.X) AndAlso (c1.Y = c2.Y) AndAlso (c1.Z = c2.Z) End Operator Public Shared Operator <>(c1 As Coord, c2 As Coord) As Boolean Return Not (c1 = c2) End Operator #Region "回転 ct:1=90度,2=180度,・・・" 'XY平面で反時計回りに回転 Public Sub RotateXY(ct As Integer) Do While ct > 0 Dim W = X _X = Y _Y = -W ct -= 1 Loop End Sub 'XZ平面で反時計回りに回転 Public Sub RotateXZ(ct As Integer) Do While ct > 0 Dim W = Z _Z = X _X = -W ct -= 1 Loop End Sub 'YZ平面で反時計回りに回転 Public Sub RotateYZ(ct As Integer) Do While ct > 0 Dim W = Y _Y = Z _Z = -W ct -= 1 Loop End Sub #End Region End Class
次回は「部品クラス」です。