講義メモ

・p.060「メソッドの.(ドット)の前にあるものは」から

p.060 メソッドの.(ドット)の前にあるものは

・C言語やC++などの関数とC#やJavaなどのメソッドは近い概念だが、メソッドの基本は「クラスや構造体に所属する」ことが異なる
・よって例えば「Debug.Log」メソッドは、DebugクラスのLogメソッドを示す
・つまり「.」は日本語の「の」
・なお、自前のクラス内に自前のメソッドを書くと、自前のクラスに所属するメソッドとして扱われるが、
 自分の中なので「自前のクラス名.」は基本的に不要。
・Unityでは機能ごとにクラスを提供し、その中にメソッドを置くことで、グループ化すると共に「同じ名前でもクラスが違うと別のもの」に
 なっている

p.061 静的メソッドとインスタンスメソッド

・自らのデータを持つ必要がないメソッドと、必要があるメソッドがある
・例えば、Debug.Logは引数で与えられた情報を処理するだけなので、自らのデータを持つ必要がない
・このようなメソッドはクラスに所属するだけで良いので、静的メソッドとなりキーワード「static」を付けて定義される
・MathfクラスのMathf.MaxやMathf.Sqrtも同様
・これに対して、スライムをクラスで扱う場合、HPやMPはクラスではなくクラスをもとに生成するオブジェクト(インスタンス)で
 持つ必要がある
・例えばスライムのスラリンを表現するには、スライムはクラス(設計図)、スラリンはインスタンス(実体)とすることで、
 他のスライムの個体も扱える
・ということは、スライムクラスにHPやMPを扱うメソッドを記述した場合、これはクラスではなくインスタンスに含まれないと困る
・このようなメソッドがインスタンスメソッドで、これが本来のメソッド。
例:
class Slime { 
  public int hp = 10; 
  public void dispHP() { Debug.Log(hp); } //クラス定義
}
:
Slime sulalin = new Slime(); //スライムクラスのインスタンスsulalinを生成
sulalin.dispHP(); //インスタンスメソッドでsulalinのHPを表示(10)
sulalin.hp = 20;  //sulalinのHPを変更
sulalin.dispHP(); //インスタンスメソッドでsulalinのHPを表示(20)
Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成
hoimin.hp = 50;  //hoiminのHPを変更
hoimin.dispHP(); //インスタンスメソッドでhoiminのHPを表示(50)

・p.061には書かれていないが、クラスにはデータ(インスタンス変数)を定義でき、生成したインスタンスごとに領域がとられ、
 これを扱うにはインスタンスメソッドを用いる

ミニ演習 mini061.cs

・スライムクラスを実装してインスタンスメソッドを試してみよう
・Unityの場合、制限があり、用意されるクラスの中にクラスを定義して用いる(内部クラスという)

作成例

using UnityEngine;

public class mini061 : MonoBehaviour {
    class Slime { //スライムを表すクラス(内部クラス)
        public int hp; //インスタンス変数(インスタンスごとの変数)
        public void dispHP() { //インスタンスメソッド
            Debug.Log("HPは" + hp); //インスタンス変数の値を用いる
        }
    }
    void Start() {
        Slime slalin = new Slime(); //スライムクラスのインスタンスslalinを生成
        slalin.hp = 20; //インスタンスslalinのHPを設定
        slalin.dispHP(); //slalinのインスタンスメソッドdispHPを呼ぶ 
        Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成
        hoimin.hp = 50; //インスタンスhoiminのHPを設定
        hoimin.dispHP(); //hoiminのインスタンスメソッドdispHPを呼ぶ 
    }
}

補足:静的メソッドとインスタンスメソッドの共存(使い分け)

・クラスに含まれる情報には、インスタンスごとに持つべきデータ(インスタンス変数)と、
 クラスで持った方が良いデータ(静的変数(クラス変数))がある
・インスタンス変数の例:HP、MP、名前など
・静的変数(クラス変数)の例:種族名、生成したインスタンスの数など
・よって、インスタンス変数を扱うメソッドはインスタンスメソッドにする
・静的変数(クラス変数)を扱うメソッドは静的メソッドにする
・静的変数(クラス変数)の書式例: public static 型 変数名;
・静的メソッドの書式例: public 戻り値型 メソッド名(引数型 引数名,…) {…}
・静的メソッドとインスタンスメソッドの共存できるが、静的メソッドからはインスタンス変数やインスタンスメソッドは使えない
 (特定できないので)

ミニ演習 mini061.cs・改造

・静的変数(クラス変数)として下記を追加
 public static string cname = "スライム";
・静的メソッドとして下記を追加
 public void dispCname() { Debug.Log("種族:" + cname); }
・インスタンス変数として下記を追加
 public string name;
・dispHP()メソッドでnameも表示するようにしよう
・start()において、slalin.name、hoimin.nameに名前を代入しよう
・静的メソッドであるdispCname()は「Slime.dispCname()」で実行しよう

作成例

using UnityEngine;

public class mini061 : MonoBehaviour {
    class Slime { //スライムを表すクラス(内部クラス)
        public static string cname = "スライム"; //静的変数(クラスごとの種族名)
        public static void dispCname() { //静的メソッド
            Debug.Log("種族:" + cname); //静的変数の値を用いる
        }
        public string name; //インスタンス変数(インスタンスごとの名前)
        public int hp; //インスタンス変数(インスタンスごとのHP)
        public void dispHP() { //インスタンスメソッド
            Debug.Log(name + "のHPは" + hp); //インスタンス変数の値を用いる
        }
    }
    void Start() {
        Slime.dispCname(); //静的メソッドで種族名を表示(インスタンス不要)
        Slime slalin = new Slime(); //スライムクラスのインスタンスslalinを生成
        slalin.name = "スラリン"; //インスタンスslalinのnameを設定
        slalin.hp = 20; //インスタンスslalinのHPを設定
        slalin.dispHP(); //slalinのインスタンスメソッドdispHPを呼ぶ 
        Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成
        hoimin.name = "ホイミン"; //インスタンスhoiminのnameを設定
        hoimin.hp = 50; //インスタンスhoiminのHPを設定
        hoimin.dispHP(); //hoiminのインスタンスメソッドdispHPを呼ぶ 
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です