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になるでしょうか。
イベントが実行される仕組みについては、まだ勉強中です。

以上