p.167 プロパティの作り方はフィールド変数とまったく違う
・「文法編:プロパティ」や「p.145 変数のように使えるけれどちょっと違うプロパティ」で説明した通り、 プロパティの作り方はメソッドに近い ・なお、プロパティのget、setはどちらか片方であれば省略可能。つまり、getとset、getのみ、setのみの3パターンで記述できる ・主に、getのみにすることで、データを読み込み専用(Read Only)にすることが多い ・特定のデータ専用のプロパティを作成した場合は、そのデータをpublicではなくprivate(あるいは無指定)にすることで、 そのデータの保護に役立つ ・基本的にプロパティはクラスや構造体の外部から呼び出して用いるので、publicにする ・なお、クラスや構造体の内部ではデータとして持っていない情報(計算や処理で得られる値など)を、 プロパティで返すようにすると、外部からはクラスや構造体の持つデータに見える
演習 ex0824b.cs
・以下のBMIを扱うクラスの定義に、文字列「痩せ気味」「普通」「太り気味」「未設定」のいずれかを返す
プロパティmessageを追記して、動作を確認しよう
・なお、BMIが20以上30未満であれば「普通」とし、heightまたはweightが0.0であれば「未設定」を返すこと
class BMI0824 { //BMIを扱うクラスの定義
private double height; //身長(内部用)
private double weight; //体重(内部用)
public double HM { //heightを扱うプロパティ
get { return height; } //値を返すのは無制限
set { if (value > 0) { height = value; } } //値を設定するにはルールあり
}
public double KG { //プロパティの定義
get { return weight; } //値を返すのは無制限
set { if (value > 0) { weight = value; } } //値を設定するにはルールあり
}
}
作成例
using UnityEngine;
public class ex0824b : MonoBehaviour {
public double Height, Weight; //パブリック変数
class BMI0824 { //BMIを扱うクラスの定義
private double height; //身長(内部用)
private double weight; //体重(内部用)
public double HM { //heightを扱うプロパティ
get { return height; } //値を返すのは無制限
set { if (value > 0) { height = value; } } //値を設定するにはルールあり
}
public double KG { //プロパティの定義
get { return weight; } //値を返すのは無制限
set { if (value > 0) { weight = value; } } //値を設定するにはルールあり
}
public string message { //判定文字列を返すプロパティ(set無し)
get {
if (height == 0.0 || weight == 0.0) {
return "未設定";
} else {
double bmi = weight / height / height;
if (bmi < 20.0) {
return "痩せ気味";
}
else if (bmi >= 30.0) {
return "太り気味";
}
else {
return "普通";
}
}
}
}
}
void Start() {
BMI0824 b = new BMI0824(); //BMIを扱うオブジェクトを生成
Debug.Log(b.message); //判定文字列を表示
b.HM = Height; //パブリック変数からプロパティ経由で身長を設定
b.KG = Weight; //パブリック変数からプロパティ経由で体重を設定
Debug.Log(b.message); //判定文字列を表示
}
}
p.168 class(クラス)とstruct(構造体)の違いについて
・UnityやC#を業務に活用していくと、Unityに用意されていないクラスや構造体を自分で定義したり、 他者が定義したものを利用することは少なくない ・よって、class(クラス)とstruct(構造体)の違いをしっかり理解しておこう ・なお、C/C++における構造体と、C#/Unityにおける構造体は仕様が大きく異なるので注意 ⇒ C/C++における構造体はデータメンバのみを持ち、データをまとめて扱うためだけの仕組み。 ⇒ C#/Unityにおける構造体はメソッドやプロパティなども持てる「軽量のクラス」 ・class(クラス)にできてstruct(構造体)にはできないこと: ①継承できない ②データ(インスタンス変数)の初期化ができない(代入で初期値を与えること) ③引数のないコンストラクタ(※後述)の定義はできない(自動的に用意される) ④デストラクタ(※後述)の定義はできない(自動的に用意される) ・class(クラス)は参照型だが、struct(構造体)は値型なので、下記の場合に全データのコピーが発生する ①構造体を型とする変数間の代入 ②構造体を型とする引数を持つメソッドの呼び出し ③構造体を戻り値型とするメソッドやプロパティからの戻り ・なお、class(クラス)は参照型なので、クラスを型とする変数間の代入では、参照が代入され、 2つの変数が同じオブジェクトを扱うようになる ⇒2つ目の変数が1つ目の変数の別名になる
演習 ex0824c.cs
・class(クラス)は参照型なので、クラスを型とする変数間の代入では、参照が代入され、 2つの変数が同じオブジェクトを扱うようになることを確認しよう ・struct(構造体)は値型なので、データのコピーが発生することを確認しよう ・Slimeクラスと、Dragon構造体を定義し、双方にpublicなint型の変数hpを記述する ・Slimeクラスのオブジェクトrimuruのhpを100にし、rimuruをSlimeクラスのオブジェクトslalinに代入 ・Dragon構造体のオブジェクトveldraのhpを200にし、veldraをDragon構造体のオブジェクトvelgreに代入 ・slalinのhpを300にすると、rimuruのhpも300になることを確認しよう(別名なので) ・velgreのhpを400にしても、veldraのhpは200のままなことを確認しよう(コピーなので)
提出:演習 ex0824c.cs