PROGRAMING/C#

Event Practice

파란실버라이트 2012. 11. 13. 14:13

시나리오 : Ball이 이벤트를 일으켰을 때 이벤트를 등록한 Pitcher object에 Invoke를 한다.

 

EventPractice.zip

 

 

 

 

    class Ball
    {
        //Ball Calss는 Event를 멤버 변수 가진다.
        public event EventHandler BallInPlay;

        public void OnBallInPlay(BallEventArgs e)
        {
            EventHandler ballInPlay = BallInPlay;

            //OnBallPlay 실행 시 등록된 Event Handle가 있다면 Invoke 한다.
            if (ballInPlay != null)
                ballInPlay(this, e);
        }
    }

 

 

    class BallEventArgs : EventArgs // EventArgs class를 상속
    {
        public int Trajectory { get; private set; }
        public int Distance { get; private set; }
        public BallEventArgs(int trajectory, int distance)
        {
            this.Trajectory = trajectory;
            this.Distance = distance;
        }
    }

 

 

    class Pitcher
    {
        public Pitcher(Ball ball)
        {
            //생성자에서  event handler에 ball_BallInPlay함수포인터를 넘긴다(등록한다)
            ball.BallInPlay += new EventHandler(ball_BallInPlay);
            //ball.BallInPlay += ball_BallInPlay;
        }

        //Ball Class에서 ballInPlay를 invoke하면 등록된 아래 함수가 실행된다.
        void ball_BallInPlay(object sender, EventArgs e)
        {
            if (e is BallEventArgs)
            {
                BallEventArgs ballEventArgs = e as BallEventArgs;
                if ((ballEventArgs.Distance < 95) && (ballEventArgs.Trajectory < 60))
                    CatchBall();
                else
                    CoverFirstBase();
            }
        }


        private void CatchBall()
        {
            Console.WriteLine("Pitcher: I caught the ball");
        }

        private void CoverFirstBase()
        {
            Console.WriteLine("Pitcher: I covered first base");
        }
    }

 

    public partial class Form1 : Form
    {
        Ball ball = new Ball();
        Pitcher pitcher;
        Fan fan;


        public Form1()
        {
            InitializeComponent();
            pitcher = new Pitcher(ball);
            fan = new Fan(ball);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BallEventArgs ballEventArgs = new BallEventArgs((int)listBox1.Value, (int)listBox2.Value);

      //Ball 에서 Event를 발생한다. => eventhandler에 의해 등록된 모든 함수가 실행
      ball.OnBallInPlay(ballEventArgs);

        }
    }

 

 

 

cf ) Main Form에서 button1_Click event 생성 시 자동 생성된 코드를 살펴보면 Button의 Event handler에 등록을 한 것을 볼수 있다.  System.EventHandler는  Button의 Click Event가 발생 시에 대리자로써 Form에 button1_Click()함수를 실행시킨다 .

 

    public partial class Form1 : Form
    {
        Ball ball = new Ball();
        Pitcher pitcher;
        Fan fan;


        public Form1()
        {
            InitializeComponent();
            pitcher = new Pitcher(ball);
            fan = new Fan(ball);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BallEventArgs ballEventArgs = new BallEventArgs((int)listBox1.Value, (int)listBox2.Value);
            ball.OnBallInPlay(ballEventArgs);

        }
    }

 

Form1.Designer에서 자동으로 생성된 코드(button1_Click가 등록)

            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(26, 127);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(186, 96);
            this.button1.TabIndex = 4;
            this.button1.Text = "PlayBall";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);