FizzBuzzとの3か月(19)
お世話になっております。
今日は、C#のイベントを使ってみました。
以下、コードです。
using System; using System.Diagnostics; namespace ConsoleApplication1 { enum Answer { FizzBuzz, Fizz, Buzz, Number } class FizzBuzzEventArgs : EventArgs { private readonly int number; public int Number { get { return this.number; } } public FizzBuzzEventArgs(int number) { this.number = number; } public Answer Answer { get { if (this.Number % 5 == 0 && this.Number % 3 == 0) { return Answer.FizzBuzz; } else if (this.Number % 3 == 0) { return Answer.Fizz; } else if (this.Number % 5 == 0) { return Answer.Buzz; } else { return Answer.Number; } } } } /// <summary> /// イベントを発生させるクラス。 /// </summary> class FizzBuzzEventProvider : Object { public event EventHandler<FizzBuzzEventArgs> Changed; private int number; public int Number { get { return this.number; } set { this.number = value; this.OnChange(); } } protected void OnChange() { FizzBuzzEventArgs args = new FizzBuzzEventArgs(this.Number); this.Changed(this, args); } } /// <summary> /// FizzBuzzEventHandlerのイベントを処理する。 /// </summary> class FizzBuzzEventHandler : Object { /// <summary> /// argsの内容に応じて、FizzBuzz,Fizz,Buzz,数字のいずれかを表示する /// </summary> /// <param name="sender"></param> /// <param name="args"></param> public void ShowAnswer(object sender, FizzBuzzEventArgs args) { switch (args.Answer) { case Answer.FizzBuzz: Debug.WriteLine("FizzBuzz"); break; case Answer.Fizz: Debug.WriteLine("Fizz"); break; case Answer.Buzz: Debug.WriteLine("Buzz"); break; case Answer.Number: Debug.WriteLine(args.Number.ToString()); break; default: throw new ApplicationException("unexpected Answer: " + args.Answer); } return; } } public class Program : Object { public static void Main(String[] args) { FizzBuzzEventProvider provider = new FizzBuzzEventProvider(); FizzBuzzEventHandler handler = new FizzBuzzEventHandler(); provider.Changed += handler.ShowAnswer; for (int i = 0; i < 100; i++) { int number = i + 1; provider.Number = number; } } } }
Javaで言い換えるとすれば、EventProviderクラスがObservableで、EventHandlerクラスがObserverになるでしょうか。
イベントが実行される仕組みについては、まだ勉強中です。
以上