・p.176「既存のクラスを使ってみる」から
補足:thisの用途(コンストラクタからコンストラクタを呼ぶ)
・コンストラクタに「: this(引数,…)」を記述することで、他のコンストラクタに引数を渡して呼び出すことができる
・例えば、public クラス名(int a, int b) {…} があれば、
public クラス名(int a) : this(a, 100) {} とすることで、上のコンストラクタを呼び出せる
public クラス名() : this(200) {} とすることで、上のコンストラクタを呼び出せる
・この場合、コンストラクタの本文は空出も構わないが「{}」は省略不可
・なお、近い構文に「: base(引数,…)」があり、継承時のコンストラクタの扱いに用いる(p.245)
利用例:アレンジ演習:p.169 construct02.cs:コンストラクタからコンストラクタを呼ぶ
//アレンジ演習:p.169 construct02.cs:コンストラクタからコンストラクタを呼ぶ
using System;
class MyClass {
private string name; //氏名(外部からの直接利用不可)
private int age; //年齢(外部からの直接利用不可)
private string address; //住所(外部からの直接利用不可)
public void Show() { //表示用のメソッド
string toshi; //年齢情報の表示用の変数(このメソッド内でのみ有効な作業変数)
if (age == -1) {
toshi = "不明";
} else {
toshi = age.ToString(); //整数から文字列に変換して代入
}
Console.WriteLine("氏名:{0} 住所:{1} 年齢:{2}", name, address, toshi);
}
public MyClass(string str1, string str2, int x) { //コンストラクタ③(string,string,int) 全て
name = str1; //氏名は引数1から
address = str2; //住所は引数2から
age = x; //年齢は引数3から
}
public MyClass(string str) : this(str, -1) { }//コンストラクタ①(string) 氏名のみ⇒④を呼ぶ
public MyClass(int x) : this("不明", "不定", x) { } //コンストラクタ②(int) 年齢のみ⇒③を呼ぶ
public MyClass(string str, int x) : this(str, "不定", x) { } //コンストラクタ④(string,int) 氏名と年齢⇒③を呼ぶ
public MyClass() : this(-1) { } //デフォルトコンストラクタ⇒②を呼ぶ
}
class construct01 {
public static void Main() {
MyClass mc1 = new MyClass(18); //コンストラクタ②(int) 年齢のみ を呼ぶ
MyClass mc2 = new MyClass("粂井康孝"); //コンストラクタ①(string) 氏名のみ を呼ぶ
MyClass mc3 = new MyClass("田中太郎", "東京都", 32); //コンストラクタ③(全部)を呼ぶ
mc1.Show();
mc2.Show();
mc3.Show();
MyClass mc4 = new MyClass("シャア", 20); //【追加】コンストラクタ④(string,int)を呼ぶ
mc4.Show(); //【追加】
MyClass mc5 = new MyClass(); //【追加】デフォルトコンストラクタ()を呼ぶ
mc5.Show(); //【追加】
}
}
p.176 既存のクラスを使ってみる
・すでに用いている「Console.Write(…)」メソッドなどの「Console」や、「Math.Sin(…)」メソッドなどの「Math」などは C#が提供するクラス ・C#が提供するクラスの中には効率的なデータ構造を提供するコレクションクラスが含まれている ・代表的なコレクションクラスがArrayListクラスで、自由度の高い配列機能を提供する ・ArrayListオブジェクトでは、要素数の変更や、その時点の要素数を得る手段などを利用できる ※テキスト中にある「プロパティ」についは8章で後述するが、引数のない簡易的なメソッド。 ・ArrayListオブジェクトに格納した要素は、配列要素と同様に添字で直接扱うことも可能 ・利用には「using System.Collections;」を用いると良い ・Countプロパティ(要素数を得る手段)とfor文を用いることで、全要素に対する処理を記述できるが、 閲覧用であればforeachを用いることも可能
アレンジ演習:p.177 ArrayList01.cs
・forの代わりにforeachを用いよう ・終了フラグbEndを用いないようにしよう
作成例
//アレンジ演習:p.177 ArrayList01.cs
using System;
using System.Collections;
class arraylist01 {
public static void Main() {
//bool bEnd = false; //【削除】終了フラグをオフにしておく
string strData; //入力用
double sum = 0.0; //合計
ArrayList al = new ArrayList(); //配列機能を持つアレイリストクラスのオブジェクトを生成
while (true) { //無限ループ
Console.Write("データ(数値以外入力で終了)-- ");
strData = Console.ReadLine();
if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //先頭文字が数字ではなく'-'でもない
//bEnd = true; //【削除】終了フラグをオン
break; //【移動】
} else {
al.Add(double.Parse(strData)); //入力文字列を実数変換してアレイリストに格納
}
}
int n = 0; //【追加】添字の代わり
foreach (var w in al) { //【変更】全要素について繰り返す
Console.WriteLine("Data[{0}] = {1}", n++, w);
sum += (double)w; //実数に逆変換して合計に足し込む
}
int count = al.Count; //Countで要素数を得る
double avr = sum / count; //合計を要素数で割って平均を得る
Console.WriteLine("データ個数 = {0}", count);
Console.WriteLine("平均値 = {0}", avr);
}
}
p.180 練習問題1 ex0701.cs 指針とヒント
・変数名、クラス名などは自由 ・Mainメソッドはこのクラスとは別のクラスに配置すると良い ・よって、インスタンスの生成が必要
作成例
//p.180 練習問題1
using System;
class MyClass {
public int age;
}
class arraylist01 {
public static void Main() {
MyClass m = new MyClass(); //オブジェクトを生成
m.age = 63;
Console.WriteLine("m.age = {0}", m.age);
}
}
p.180 練習問題2 ヒント
・メソッド名、クラス名などは自由 ・テキスト中ではコンストラクタのオーバーロードしか説明していないが、講義メモの通り、メソッドもオーバーロードが可能 ・int型2値の和を求めるメソッドの戻り値型はint、double型2値の和を求めるメソッドの戻り値型はdoubleとすれば良い
作成例
//p.180 練習問題2
using System;
class MyClass {
public int Add(int a, int b) { //整数和を返すメソッド①
return a + b;
}
public double Add(double a, double b) { //実数和を返すメソッド②
return a + b;
}
}
class ex0702 {
public static void Main() {
MyClass m = new MyClass(); //オブジェクトを生成
Console.WriteLine("m.Add(1, 2) = {0}", m.Add(1, 2)); //(int,int)なので①を呼ぶ
Console.WriteLine("m.Add(1.1, 2.2) = {0}", m.Add(1.1, 2.2)); //(double,double)なので②を呼ぶ
}
}