13. クラスとオブジェクト
「回数」と「回数を増やす処理」を一つにまとめます。このように持つ値と処理を定義するものが「クラス」です。Program以外のクラスは初回Recompileで解放されます。
回数を数えるCounter
public class Counter
{
public int count = 0;
public void AddOne()
{
count++;
}
}
public class Program : ArcaneProgram
{
public void OnStart()
{
Counter first = new Counter();
Counter second = new Counter();
first.AddOne();
if (first.count == 1 && second.count == 0)
{
Workshop.Log.Write("Each instance has its own count.");
}
}
}Counterはcountという値とAddOneという処理を持つクラスです。クラスの中で、メソッドの外側に置いた変数を「フィールド」と呼びます。
new Counter()はこの定義に従って実際に値を持つものを一つ作ります。作られたものを「オブジェクト」または「インスタンス」と呼びます。ここではnewを2回書いているので、別々のCounterを作っています。
どちらの値が増えるか
first.AddOne()はfirstで選んだCounterのAddOneを呼びます。その中のcountはそのCounterの値です。
| 時点 | first.count | second.count |
|---|---|---|
| 二つ作った直後 | 0 | 0 |
| first.AddOne()の後 | 1 | 0 |
publicにしたcountやAddOneはProgramからも使えます。privateならCounterの中だけで使います。この例では数を確認するため、countをpublicにしています。
代入では新しく作られない
Counter other = first;と書くと、otherとfirstは同じCounterを選びます。どのオブジェクトを使うかを示す値を「参照」と呼びます。other.AddOne()でもfirst.countが増えます。別々の値を持たせたいときは例のようにnewで別のCounterを作ります。
配列も同じです。別の変数へ代入しただけでは中身のコピーは作られません。
最初から書いていたProgram
Programもクラスです。Program : ArcaneProgramはゲームが用意したArcaneProgramをもとにする指定です。この仕組みを「継承」と呼び、ProgramではWorkshopを使えるようになります。これまで使ってきたOnStartやOnTickはProgramのメソッドです。
練習問題
例のfirst.AddOne()の行をもう一行書いて、2回呼ぶようにしてください。二つのcountはいくつになりますか。結果に合わせてifも直してください。
解答例を表示する解答例を閉じる
first.countは2、second.countは0です。ifをfirst.count == 2 && second.count == 0に変えると文章が出ます。secondは別のCounterなので、firstを増やしても変わりません。
