2013-03-04 122 views
5

我已經發現了幾個帖子關於提高事件與擴展方法添加事件,但我的問題是有點不同:使用擴展方法

我有一個這樣的接口:

public interface IStateMachine 
{ 
    void SetState(IState NewState); 
    IState GetState(); 
} 

使用這個接口我可以像下面創建一個擴展方法:

public static void ChangeState(this IStateMachine StateMachine, IState NewState) 
{ 
    StateMachine.GetState().Exit(); 
    StateMachine.SetState(NewState); 
    StateMachine.GetState().Enter(); 
} 

我真正想要的是將有需要,比如被解僱的事件:一個statechange-event

但是,我不希望StatechangeEvent成爲IStateMachine界面的一部分,但似乎這是唯一的方法。我有幾個類實現IStateMachine,因此我必須每次都重做相同的代碼。

回答

4

在C#中,只有擴展方法。沒有擴展屬性或事件。您將不得不在接口上聲明事件。
爲了避免需要反覆寫入相同的事件代碼,可以創建一個基類。

另一種可能性是「手動」實施Publish-Subscribe模式。這就是C#中的事件。

您可以將擴展方法SubscribeUnsubscribe添加到IStateMachine

他們會使用一個可能的靜態類StateMachineSubscribers這也暴露了SubscribeUnsubscribe方法。此外,它公開了ChangeState擴展方法使用的Raise方法。

+0

謝謝,我會看看。我有不同類型的類可以都是一個IStateMachine。當我做一個基本的抽象類時,我遇到了多重繼承的問題。 – avanwieringen 2013-03-04 13:35:29

+0

@avanwieringen:在這種情況下,通過擴展方法在接口上實現pub/sub似乎是更好的主意。 – 2013-03-04 13:36:21

0

與其相應的委託的事件可以是具體類器具IStateMachine接口的一部分。因此,如果您在界面上調用SetState,則會調用其具體的某些具體的實現,該類將在內部引發您想要的事件。