p.164(戻り値のないメソッド、引数のないメソッド)
・戻り値のないメソッドでは、戻り値型にvoidを指定する ・この場合、returnは必須ではなくなるが、指定は可能 ・returnを指定する事で、メソッドの途中で呼び出し側に戻ることができるので、効率が上がる ※ メソッドの出口が複数化するので、推奨されない場合もある ・引数のないメソッドでは、仮引数の記述は不要だが、定義および呼び出しでは「()」が必要
p.165 noreturnvalue.cs
//p.165 noreturnvalue.cs
using System;
class Kakeibo { //利用される家計簿クラス
private int total = 0; //残高(直接操作されないようにprivateにする)
public void nyukin(int en) { //入金(引数は入金額)メソッド:戻り値なし
total += en; //入金額を残高に足しこむ
Console.WriteLine("{0}円を入金しました", en);
return; //なくても良い
}
public void shishutsu(int en) { //支出(引数は出金額)メソッド:戻り値なし
if (total < en) { //残高を超えていたら
Console.WriteLine("{0}円も支出できません", en);
return; //なくても良い
} else { //残高以下なら
total -= en; //出金額を残高から差し引く
Console.WriteLine("{0}円を支出しました", en);
return; //なくても良い
}
}
public void gettotal() { //残高の表示(引数なし)メソッド:戻り値なし
if (total == 0) { //残高ゼロ?
Console.WriteLine("残高はありません");
return; //なくても良い
} else {
Console.WriteLine("残高は{0}円です", total);
return; //なくても良い
}
}
}
class noreturnvalue {
public static void Main() {
Kakeibo k = new Kakeibo(); //家計簿クラスのインスタンスを生成
k.gettotal();
k.nyukin(1000);
k.gettotal();
k.nyukin(2000);
k.gettotal();
k.shishutsu(500);
k.gettotal();
k.shishutsu(10000);
k.gettotal();
}
}
アレンジ演習:p.165 noreturnvalue.cs
・各メソッドの最後のreturnは必要ないので削除しよう ・また、ifの最後のreturnがあれば、elseが不要になることを確認しよう
作成例
//アレンジ演習:p.165 noreturnvalue.cs
using System;
class Kakeibo { //利用される家計簿クラス
private int total = 0; //残高(直接操作されないようにprivateにする)
public void nyukin(int en) { //入金(引数は入金額)メソッド:戻り値なし
total += en; //入金額を残高に足しこむ
Console.WriteLine("{0}円を入金しました", en);
//return; //なくても良い
}
public void shishutsu(int en) { //支出(引数は出金額)メソッド:戻り値なし
if (total < en) { //残高を超えていたら
Console.WriteLine("{0}円も支出できません", en);
return; //メソッドの途中で戻る
}
total -= en; //出金額を残高から差し引く
Console.WriteLine("{0}円を支出しました", en);
//return; //なくても良い
}
public void gettotal() { //残高の表示(引数なし)メソッド:戻り値なし
if (total == 0) { //残高ゼロ?
Console.WriteLine("残高はありません");
return; //メソッドの途中で戻る
}
Console.WriteLine("残高は{0}円です", total);
//return; //なくても良い
}
}
class noreturnvalue {
public static void Main() {
Kakeibo k = new Kakeibo(); //家計簿クラスのインスタンスを生成
k.gettotal();
k.nyukin(1000);
k.gettotal();
k.nyukin(2000);
k.gettotal();
k.shishutsu(500);
k.gettotal();
k.shishutsu(10000);
k.gettotal();
}
}
p.166(カプセル化)
・このプログラムの「private int total = 0; //残高(直接操作されないようにprivateにする)」のように、 データメンバを守ることをカプセル化という ・特に、データの特性により最大値、最小値が決まっている場合(負の数禁止も含む)や、直接操作されることによる危険性が ある場合はカプセル化が必要 ・基本的には、データメンバは全てprivateにし、これを操作するメソッドをpublicにする ・このプログラムでは、totalの値が負の数にならないようにカプセル化している
p.167 コンストラクタ
・newによりインスタンスを生成すると、自動的に実行される特別なメソッドがあり、これをコンストラクタという。 ・コンストラクタの有無は自由で、記述しないと自動的に中身のないコンストラクタが作られて動作する ・コンストラクタを記述する事で、インスタンスを生成するときに行いたい事を指定できる ・これは、主にデータメンバへの初期値の設定や、複雑なメソッドを持つクラスにおける開始処理などに用いる 例: Monster rimuru = new Monster(100, 500); //コンストラクタにHPとMPを渡して初期値にしてもらう ・コンストラクタは特別なメソッドで名前がなくクラス名になり、戻り値はなく、必ずpublicとする。
p.167 construct01.cs
//p.167 construct01.cs
using System;
class MyClass { //部品クラス
int x; //インスタンス変数
public void showx() { //xの値を表示するメソッド
Console.WriteLine("x = " + x);
}
// コンストラクタ クラスと同じ名前、戻り値なし
public MyClass() {
x = 10; //インスタンス変数の初期値を設定
Console.WriteLine("xに10を代入しました"); //テスト用
}
}
class construct01 { //実行用クラス
public static void Main() { //実行用メソッド
// newしたときにコンストラクタが呼ばれます
MyClass mc = new MyClass();
mc.showx();
}
}
アレンジ演習:p.167 construct01.cs
・複数のオブジェクトを生成すると、その都度、コンストラクタが動作することを確認しよう
作成例
//アレンジ演習:p.167 construct01.cs
using System;
class MyClass { //部品クラス
int x; //インスタンス変数
public void showx() { //xの値を表示するメソッド
Console.WriteLine("x = " + x);
}
// コンストラクタ クラスと同じ名前、戻り値なし
public MyClass() {
x = 10; //インスタンス変数の初期値を設定
Console.WriteLine("xに10を代入しました"); //テスト用
}
}
class construct01 { //実行用クラス
public static void Main() { //実行用メソッド
// newしたときにコンストラクタが呼ばれる
MyClass mc = new MyClass();
mc.showx();
MyClass md = new MyClass(); //【追加】再度コンストラクタが呼ばれる
}
}
p.168(コンストラクタの引数とオーバーロード)
・コンストラクタもメソッドの一種なので、パラメータリストを指定できる
例: public Monster(int h, int m) { hp = h; mp = m; }
・これはnewによって呼び出す時に、その値を指定する
例: Monster rimuru = new Monster(100, 500); //コンストラクタにHPとMPを渡して初期値にしてもらう
・パラメータリストを指定したコンストラクタと指定しないコンストラクタを混在できる
・また、呼び出しにおいて区別できるのであれば、パラメータリストを指定したコンストラクタを複数記述できる
・このことをオーバーロードという
例:
public Monster() { hp = 10; mp = 20; } //コンストラクタ①
public Monster(int h) { hp = h; mp = 20; } //コンストラクタ②
public Monster(int h, int m) { hp = h; mp = m; } //コンストラクタ③
:
Monster veldra = new Monster(); //コンストラクタ①を呼ぶ
Monster slalin = new Monster(100); //コンストラクタ②を呼ぶ
Monster rimuru = new Monster(100, 500); //コンストラクタ③を呼ぶ
提出:アレンジ演習:p.167 construct01.cs