テキスト篇:p.282「構造体でインターフェイスを実装する」
ゲーム開発演習:キーボードが押された情報を得る、終了処理 など
p.282 構造体でインターフェイスを実装する
・クラスとまったく同様に構造体でインターフェイスを実装できる ・複数の実装も可能 ・ただし、利用側ではnew演算子で明示的にオブジェクトを生成すること
p.282 struct05.cs
//p.282 struct05.cs
using System;
interface IMyInterface { //インターフェイスの定義
void Show(); //抽象メソッド
int xprop { get; set; } //抽象プロパティ
}
struct MyStruct : IMyInterface { //インターフェイスを実装した構造体
int x;
public void Show() { //抽象メソッドの実装
Console.WriteLine("x = {0}", x);
}
public int xprop { //抽象プロパティの実装
get {
return x;
}
set {
x = value;
}
}
}
class struct05 {
public static void Main() {
MyStruct msNew = new MyStruct(); //インターフェイスを実装した構造体ではnew必須
msNew.Show(); //抽象メソッドの実装を呼ぶ
msNew.xprop = 20; //抽象プロパティの実装を呼ぶ(set)
msNew.Show();
}
}
p.284 構造体をメソッドに渡す
・クラスとの違いは値型であることで、引数の構造体から仮引数の構造体へ全メンバがコピーされる ・よって、クラスと同様に参照渡しにするにはref(p.188)を指定すれば良い
p.284 struct06.cs
//p.284 struct06.cs
using System;
struct MyData { //構造体の定義
public int x, y;
}
class MyDataClass { //クラスの定義
public int x, y;
}
class ChangeData {
public void change(ref MyData md) { //構造体型引数を参照渡し
int temp; //作業用
temp = md.x; //値を交換
md.x = md.y;
md.y = temp;
}
public void change(MyData md) { //構造体型引数を値渡し(オーバロード可能)
int temp; //作業用
temp = md.x; //値を交換
md.x = md.y;
md.y = temp; //(※元の引数には反映しないのでこの処理は無意味)
}
public void change(MyDataClass m) { //クラス型引数なので参照渡し(オーバロード)
int temp; //作業用
temp = m.x; //値を交換
m.x = m.y;
m.y = temp;
}
}
class struct06 {
public static void Main() {
MyData md = new MyData(); //構造体オブジェクトを生成
md.x = 10;
md.y = 20;
Console.WriteLine("最初の状態");
Console.WriteLine("md.x = {0}, md.y = {1}", md.x, md.y);
ChangeData cd = new ChangeData();
cd.change(md); //構造体型引数を値渡し
Console.WriteLine("cd.change(md)後");
Console.WriteLine("md.x = {0}, md.y = {1}", md.x, md.y); //値渡しなので変わらない
cd.change(ref md); //構造体型引数を参照渡し
Console.WriteLine("cd.change(ref md)後");
Console.WriteLine("md.x = {0}, md.y = {1}", md.x, md.y); //参照渡しなので変わる
MyData m; //構造体オブジェクトを生成(new無し)
m.x = 10;
m.y = 20;
Console.WriteLine("最初の状態");
Console.WriteLine("m.x = {0}, m.y = {1}", m.x, m.y);
cd.change(ref m); //構造体型引数を参照渡し
Console.WriteLine("cd.change(ref m)後");
Console.WriteLine("m.x = {0}, m.y = {1}", m.x, m.y); //参照渡しなので変わる
MyDataClass mdc = new MyDataClass(); //クラスオブジェクトを生成
mdc.x = 10;
mdc.y = 20;
Console.WriteLine("最初の状態");
Console.WriteLine("mdc.x = {0}, mdc.y = {1}", mdc.x, mdc.y);
cd.change(mdc); //クラスオブジェクトなので参照渡し
Console.WriteLine("cd.change(mdc)後");
Console.WriteLine("mdc.x = {0}, mdc.y = {1}", mdc.x, mdc.y); //参照渡しなので変わる
}
}
p.288 DateTime構造体を使ってみる
・日付時刻の処理や現在時刻の取得などに便利なC#が提供する構造体がDateTime ・年月日時分秒とミリ秒をint型で提供するプロパティ Year、Month、Day、Hour、Minute、Second、MilliSecondがある ※ C/C++とは異なり、年や月を調整する必要はない ・他に便利なプロパティが含まれている ・DateTime Now:実行時点の現在時刻を持つDateTimeオブジェクトを返す(静的プロパティ) ・DayOfWeek DayOfWeek:曜日をDayOfWeek列挙型で返す。このまま表示すると英語曜日名になる ・DateTime Date:日付部分のみを返す(時分秒はゼロになる) ・ToString()メソッドのオーバーライドにより、オブジェクトを表示すると「YYYY/MM/DD HH:MM:SS」形式の文字列が得られる ・これを「YYYY/MM/DD」だけにするのがToShortDateString()メソッド。
p.290 datetime01.cs
//p.290 datetime01.cs
using System;
class datetime01 {
public static void Main(){
DateTime dt = DateTime.Now;
Console.WriteLine("今日は{0}年{1}月{2}日({3})です",
dt.Year, dt.Month, dt.Day, dt.DayOfWeek //年、月、日、曜日(英語)
);
Console.WriteLine("現在{0}時{1}分{2}秒{3}ミリセコンドです",
dt.Hour, dt.Minute, dt.Second, dt.Millisecond); //時、分、秒、ミリ秒
Console.WriteLine("dt.Date = {0}", dt.Date); //年月日のみを持つのでToString()で時分秒はゼロになる
Console.WriteLine("短い日付形式 = {0}", dt.ToShortDateString()); //年月日のみを表示
}
}
アレンジ演習:p.290 datetime01.cs
・曜日を日本語にしよう
・文字列配列 string[] dow = {"日","月","火","水","木","金","土"}; を用いると良い
作成例
//アレンジ演習:p.290 datetime01.cs
using System;
class datetime01 {
public static void Main(){
string[] dow = {"日","月","火","水","木","金","土"}; //【追加】
DateTime dt = DateTime.Now;
Console.WriteLine("今日は{0}年{1}月{2}日({3})です",
dt.Year, dt.Month, dt.Day, dow[(int)dt.DayOfWeek] //【変更】年、月、日、曜日(日本語)
);
Console.WriteLine("現在{0}時{1}分{2}秒{3}ミリセコンドです",
dt.Hour, dt.Minute, dt.Second, dt.Millisecond); //時、分、秒、ミリ秒
Console.WriteLine("dt.Date = {0}", dt.Date); //年月日のみを持つのでToString()で時分秒はゼロになる
Console.WriteLine("短い日付形式 = {0}", dt.ToShortDateString()); //年月日のみを表示
}
}