13. クラスとオブジェクト

「回数」と「回数を増やす処理」を一つにまとめます。このように持つ値と処理を定義するものが「クラス」です。Program以外のクラスは初回Recompileで解放されます。

回数を数えるCounter

ArcaneScript
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.countsecond.count
二つ作った直後00
first.AddOne()の後10

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を増やしても変わりません。