講義メモ

テキスト篇: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()); //年月日のみを表示
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です