開発環境
- 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-3を解いてみる。
その他参考書籍
練習17-3.
コード
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);
// eventキーワードで問題を解決
public event 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();
// eventキーワードのおかげでハンドラを直接呼び出せてなくなっている
// 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 コメント:
コメントを投稿