状態(生きている、死んでいる?)を管理するクラス

今の状態を管理するクラスを考えてみましょう

状態管理クラス

生きている状態をAlive、死んでいる状態をDieとしてコードを考えてみましょう

Status status = new Status();

status.SetState(Status.State.Alive);
Console.WriteLine(status.IsAlive);

status.SetState(Status.State.Die);
Console.WriteLine(status.IsAlive);

class Status
{
    public enum State
    {
        Alive,
        Die,
    }

    State state;

    public bool IsAlive => state == State.Alive;

    public void SetState(State state)
    {
        this.state = state;
    }
}

説明

列挙型

生きているか死んでいるかの状態を保存するために使います
メリットは、2つの状態以外を設定できない点があります
プログラムとしては、これ以外の状態になると処理ができないでしょうから限定されるのは大きなメリットになります

public enum State
{
    Alive,
    Die,
}

列挙型を知らないと次のようにコーディングしてしまいます

bool Alive = true;
bool Die = false;

または、

int state;
state = 0 // 生きている
state = 1 // 死んでいる

間違いやすかったり、また0や1で表すと数値が何を表しているのかが覚えてられないなどが起こります
次の場合はどうでしょう

string state;
state = "生きている";
state = "死んでいる";

0,1よりはマシでしょうが、C#は綴の間違いをチェックしてくれませんし、"生きた状態"だったかな?など、覚えきれないでしょう。やはり余計なところを頭を使わなくてはなりません

列挙型の初期値

初期値の代入を省略すると0が代入(つまりAlive)が代入されています

State state;

これと同じ

State state = State.Alive;

プロパティ

次のコードは読み取り専用にプロパティです
プロパティはC#にあってJavaにないメンバーですが、外部からのアクセスはフィールドのように見えて、クラス内ではメソッドのように扱うことができるものです

JavaではGetState()メソッドにあたります

public bool IsAlive => state == State.Alive;

展開してみると、わかりますね。
外部からは、status.IsAliveでアクセスできます
コードを見ればわかりますが、getブロック内はメソッドが書かれていますね(JavaではGetState()メソッドのようですね)

public bool IsAlive
{
    get
    {
        if (state == State.Alive)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

メソッド

ステートの状態を変更するためのメソッドです
インスタンス変数のstateに状態を代入しています

public void SetState(State state)
{
    this.state = state;
}

引数は、少しややこしく感じますが、列挙型がクラス内部に定義されていますので、このようにします
長いですが、インテリセンスで次々と候補が出てきますので、実際はそれほど負担にはなりません

Status status = new Status();

status.SetState(Status.State.Alive);

C#,Unity

Posted by hidepon