-
Notifications
You must be signed in to change notification settings - Fork 0
値オブジェクトの作り方
momomo546 edited this page Jul 19, 2024
·
17 revisions
ここも読むといいかも
あとここも
HP
を例に話します。
using System;
public class Hp
{
private readonly int _maxHp;
public int maxHp { get { return _maxHp; } }
private readonly int _currentHp;
public int currentHp { get { return _currentHp; } }
//引数が2個の場合のコンストラクタ
public Hp(int maxHpValue, int currentHpValue)
{
// 0より小さい時には例外を発生させる
if (currentHpValue < 0) {
throw new ArgumentException("Value cannot be negative");
}
// maxHpを超える時には例外を発生させる
else if (currentHpValue > this._maxHp) {
throw new ArgumentException("Value cannot over maxHp");
}
this._currentHp = currentHpValue;
this._maxHp = maxHpValue;
}
//引数が1個の場合、this(maxHpValue, maxHpValue)の部分で上のコンストラクタを使用し、
//同じ値をcurrentHpとmaxHpに代入している。
public Hp(int maxHpValue) : this(maxHpValue, maxHpValue){}
public Hp AddCurrentHp(Hp addedHp)
{
if (this._currentHp + addedHp.maxHp > this._maxHp) {
return new Hp(this._maxHp);
}
else {
return new Hp(this._maxHp, this._currentHp + addedHp.maxHp);
}
}
public Hp AddMaxHp(Hp addedHp)
{
return new Hp(this._maxHp + addedHp.maxHp);
}
public Hp Substract(Hp substructedHp)
{
if (this._currentHp - substructedHp.maxHp < 0) {
return new Hp(this._maxHp, 0);
}
else {
return new Hp(this._maxHp, this._currentHp - substructedHp.maxHp);
}
}
}
private readonly
として一度作ったら値を変更しない!
変更したくなったときは新しいインスタンスを作る。
つまり戻り値をnew Hp(新しい値)
とする。
外から値を取得するときはgetを使用しhp.maxHp
で取得できる。
setは禁止!!!
private readonly int _maxHp;
public int maxHp { get { return _maxHp; } }
private readonly int _currentHp
としたためコンストラクタからのみ値を代入できる。
詳しくはここ
-
private
が付いているのでクラス内からしかアクセスできない。 -
readonly
が付いているので一回だけ代入できる。 -
_currentHp
の前についている_
は変数がprivate
であるため付いている。
不正な値を防ぐためif文などで例外を投げる(インスタンス生成時にtryが必要になる)
public Hp(int maxHpValue, int currentHpValue) {
// 0より小さい時には例外を発生させる
if (currentHpValue < 0) {
throw new ArgumentException("Value cannot be negative");
}
// maxHpを超える時には例外を発生させる
else if (currentHpValue > this._maxHp) {
throw new ArgumentException("Value cannot over maxHp");
}
this._currentHp = currentHpValue;
this._maxHp = maxHpValue;
}
Hp
クラスにはAdd
メソッドとSubstract
メソッドを作成した。
引数はHp
型として、Mp
やAttack
といった別の値を間違えて入力することを防ぐ。
戻り値はnew Hp(新しい値)
としている。
public Hp Add(Hp addedHp)
{
if (this._currentHp + addedHp.maxHp > this._maxHp) {
return new Hp(this._maxHp, this._maxHp);
}
else {
return new Hp(this._maxHp, this._maxHp + addedHp.maxHp);
}
}
オーバーロードとは、引数が異なるメソッドを同名で定義できる機能のこと
これを利用して引数が1個の場合と引数が2個の場合の動作を定義できる。
this(maxHpValue, maxHpValue)
はHp(maxHpValue, maxHpValue)
と同じである。
つまり引数が1個の場合、currentHp
とmaxHp
に引数の値が代入される。
//引数が1個の場合、this(maxHpValue, maxHpValue)の部分で上のコンストラクタを使用し、
//同じ値をcurrentHpとmaxHpに代入している。
public Hp(int maxHpValue) : this(maxHpValue, maxHpValue){}