前回はクラスの概要の説明でした。今回はさっそくクラスの作成に取り掛かります。Visual Studio でC#の新規プロジェクトを用意してください。
プロジェクトの名前は "ペントミノソルバー2D" です。
最初は「Coordクラス」、2次元の平面にある点を表す座標クラスです。クラス全体のソースはページの最後にまとめて載せます。
・クラス宣言
クラスの名前は "Coord" です。C#(9.0以降)では新しく record class が導入され、演算子(==)や複製(clone)などが簡単に使えるようになりました。ただしクラスのプロパティはプリミティブ型に限ります。Coordクラスのプロパティは座標(int)のみなので record class として宣言します。
internal record class Coord
・プロパティ
プロパティはX座標とY座標のみです。Y軸は一般の画像ソフトと同じで下方向がプラスです。スコープはPublicですが "private set" の記述で他のクラスからは変更不可となります。
public int X { get; private set; } // 水平方向 public int Y { get; private set; } // 垂直方向
・初期化
引数に座標( x と y )が必要です。
public Coord(int x, int y) { X = x; Y = y; } //=====(例)===== Coord p = new Coord(1, 2);
・座標の変更
指定の座標に変更します。
public void MoveTo(int x, int y) { X = x; Y = y; } //=====(例)===== Coord p = new Coord(1, 2); p.MoveTo(3, 4); //pの座標は (3, 4) に変更されます
・複製(関数)
前述のとおり record class を宣言したので、クラスの複製のためのコードは不要です。例のように "with {}" と書けば、すべてのプロパティ値が同じ別インスタンスが作成されます(中括弧の中には違う値を持つプロパティの設定ができます)。
//=====(例)===== Coord p1 = new XY(1, 2); Coord p2 = p1; //同一インスタンス(p2 is p1) Coord p3 = p1 with {}; //別インスタンス(p3 isNot p1)←複製
・演算子定義
演算子(==)も record class の宣言でコードの記述なしで使えるようになります。
'=====(例)===== Coord p1 = new Coord(1, 2); Coord p2 = new Coord(1, 2); If (p1==p2) { MessageBox.Show("True"); //Trueが表示されます } Else { MessageBox.Show("False"); }
・座標の回転
反時計回りに90度単位で回転させます。引数には90度単位の回転回数を指定します。
public void AntiClockWiseRotate(int ct) //ct:1=90度,2=180度,・・・ { while (ct > 0) { int W = X; X = Y; Y = -W; ct--; } } //=====(例)===== Coord p1 = new Coord(1, 2); p1.AntiClockWiseRotate(1); //90度回転、p1は(2,-1)になります
・反転
Y軸に対して折り返します。
public void HorizontalReverse() { X = -X; } //=====(例)===== Coord p1 = new Coord(1, 2); p1.HorizontalReverse(); //p1は(-1,2)になります
以上が「座標クラス」です。クラス全体のソースは以下のとおりです。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ペントミノソルバー2D { internal record class Coord { //**************************************** //* Coord (座標クラス) //**************************************** public int X { get; private set; } // 水平方向 public int Y { get; private set; } // 垂直方向 // 初期化 public Coord(int x, int y) { X = x; Y = y; } // 座標の変更 public void MoveTo(int x, int y) { X = x; Y = y; } // (0,0)を中心に反時計回り回転 public void AntiClockWiseRotate(int ct) //ct:1=90度,2=180度,・・・ { while (ct > 0) { int W = X; X = Y; Y = -W; ct--; } } // y軸に対して反転 public void HorizontalReverse() { X = -X; } } }
次回は「部品クラス」です。