시나리오 : Ball이 이벤트를 일으켰을 때 이벤트를 등록한 Pitcher object에 Invoke를 한다.
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);