開発環境
- Microsoft Windows 8 Pro 64bit 日本語 (OS)
 - Microsoft Visual Studio Express 2012 for Windows Desktop (IDE)
 - プログラミング言語: C#
 
『初めてのC# 第2版』(Jesse Liberty+Brian MacDonald著、日向俊二訳、オライリー・ジャパン、2006年、ISBN978-487312-194-7)の 第17章(デリゲートとイベント)17.6(練習問題)練習17-2を解いてみる。
その他参考書籍
練習17-2.
コード
using System;
using System.Threading;
class TimeInfoEventArgs : EventArgs
{
    public readonly string msg;
    public TimeInfoEventArgs()
    {
        this.msg = "経過しました";
    }
}
class Clock
{
    private DateTime start;
    private DateTime stop;
    public Clock(int hours, int minutes, int seconds)
    {
        start = DateTime.Now;
        TimeSpan duration = new TimeSpan(hours, minutes, seconds);
        stop = start + duration;
    }
    public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs ti);
    public SecondChangeHandler SecondChanged;
    public void Run()
    {
        for (int i = 0; ; i += 1)
        {
            Console.WriteLine("{0}秒", i);
            Thread.Sleep(1000);
            DateTime dt = DateTime.Now;
            if (dt >= this.stop)
            {
                TimeInfoEventArgs ti = new TimeInfoEventArgs();
                if (SecondChanged != null)
                {
                    SecondChanged(this, ti);
                    break;
                }
            }
        }
    }
}
class DisplayClock
{
    public void Subscribe(Clock clock)
    {
        // 「+=」を「=」に変更
        clock.SecondChanged = new Clock.SecondChangeHandler(TimeHasChanged);
    }
    public void TimeHasChanged(object clock, TimeInfoEventArgs ti)
    {
        Console.WriteLine("{0}", ti.msg);
    }
}
class Tester
{
    public void Run()
    {
        Console.WriteLine("経過時間を入力(時間、分、秒)");
        int hours = Convert.ToInt16(Console.ReadLine());
        int minutes = Convert.ToInt16(Console.ReadLine());
        int seconds = Convert.ToInt16(Console.ReadLine());
        Clock clock = new Clock(hours, minutes, seconds);
        DisplayClock dc = new DisplayClock();
        dc.Subscribe(clock);
        TimeInfoEventArgs ti = new TimeInfoEventArgs();
        // ハンドラを直接呼び出せてしまう
        clock.SecondChanged(clock, ti);
        clock.Run();
    }
    static void Main()
    {
        Tester t = new Tester();
        t.Run();
    }
}
入出力結果(Console Window)
経過時間を入力(時間、分、秒) 0 0 10 経過しました 0秒 1秒 2秒 3秒 4秒 5秒 6秒 7秒 8秒 9秒 経過しました 続行するには何かキーを押してください . . .
0 コメント:
コメントを投稿