2013-03-04 124 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,则会调用其具体的某些具体的实现,该类将在内部引发您想要的事件。