[英]C# State pattern and events
在 C# 中,事件只能由所屬類通過受保護的虛擬方法(如 OnClick、OnExit 等)觸發……我想做的是為我的一些復雜類實現 GOF 狀態模式。 到目前為止,一切都很好,只是我找不到從我的狀態類中觸發擁有類的事件的方法。
例如,我的按鈕有兩種狀態(向上和向下),DownState 類將檢查用戶輸入,並在必要時觸發按鈕的 Click 事件。
public class Button
{
public Button()
{
State = new ButtonStateNormal(this);
}
public event EventHandler<MouseEventArgs> Click;
public ButtonState State { get; set; }
protected virtual void OnClick(MouseEventArgs e)
{
if (Click != null)
Click(this, e);
}
}
public class ButtonStateNormal : ButtonState
{
Button button;
public ButtonStateNormal(Button button)
{
this.button = button;
}
public override void CheckForInput()
{
//...
//Check for user input and change the state
//...
button.State = new ButtonStateDown(button);
}
}
public class ButtonStateDown : ButtonState
{
Button button;
public ButtonStateDown(Button button)
{
this.button = button;
}
public override void CheckForInput()
{
//...
//Check for user input, fire the event of the button and change the state
//...
button.OnClick(new MouseEventArgs(mouse.X, mouse.Y)); //I want to do this, obviously it won't work this way
button.State = new ButtonStateNormal(button);
}
}
我怎樣才能做到這一點?
在ButtonState
類上設置事件或委托,以便您的按鈕可以調用。 將Button
自動State
屬性更改為一個后備存儲,該存儲在狀態更改時掛鈎和取消掛鈎此事件或委托。
public class Button
{
public Button()
{
State = new ButtonStateNormal(this);
}
private ButtonState _state;
public event EventHandler<MouseEventArgs> Click;
public ButtonState State
{
protected get
{
return _state;
}
set
{
if (_state == value)
return;
if (_state != null)
_state.Click -= OnClick;
if (value != null)
value.Click += OnClick;
_state = value;
}
}
protected virtual void OnClick(MouseEventArgs e)
{
if (Click != null)
Click(this, e);
}
public void CheckForInput(){
State.CheckForInput();
}
}
public abstract class ButtonState
{
public abstract void CheckForInput();
public ClickDelegate Click;
public delegate void ClickDelegate(MouseEventArgs a);
}
然后您可以在具體的 State 類中執行此操作
public class ButtonStateDown : ButtonState
{
Button button;
public ButtonStateDown(Button button)
{
this.button = button;
}
public void CheckForInput()
{
//...
//Check for user input, fire the event of the button and change the state
//...
if(Click != null)
Click(new MouseEventArgs(mouse.X, mouse.Y))
button.State = new ButtonStateNormal(button);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.