2012年8月10日金曜日

開発環境

『初めてのC# 第2版』(Jesse Liberty+Brian MacDonald著、日向俊二訳、オライリー・ジャパン、2006年、ISBN978-487311-294-7)の 第17章(デリゲートとイベント)17.6(練習問題)、練習17-1.解いてみる。

練習17-1.

コード

using System;
using System.Threading;

namespace Sample
{
    class TimeInfoEventArgs : EventArgs
    {
        public readonly string msg;
        public TimeInfoEventArgs(string msg)
        {
            this.msg = msg;
        }
    }
    class Clock
    {
        private DateTime start;
        private DateTime stop;
        private string msg;
        public Clock(int hours, int minutes, int seconds, string msg)
        {
            start = DateTime.Now;
            TimeSpan duration = new TimeSpan(hours, minutes, seconds);
            stop = start + duration;
            this.msg = msg;
        }
        public delegate void SecondChangeHandler
            (object Clock, TimeInfoEventArgs ti);
        public SecondChangeHandler SecondChanged;
        public void Run()
        {
            for(int i = 0;;i++)
            {
                Console.Write("{0}秒, ", i);
                Thread.Sleep(1000);
                DateTime dt = DateTime.Now;
                if (dt >= this.stop)
                {
                    TimeInfoEventArgs ti = new TimeInfoEventArgs(this.msg);
                    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(ti.msg);
        }
    }
    class Tester
    {
        public void Run()
        {
            Console.Write("メッセージを入力: ");
            string msg = Console.ReadLine();
            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,msg);
            DisplayClock dc = new DisplayClock();
            dc.Subscribe(clock);
            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 コメント:

コメントを投稿