2013-03-04 10 views
5

Znalazłem kilka postów o Podnoszenie wydarzenia z metodę rozszerzenia, ale moje pytanie jest nieco inna:Dodaj zdarzeń przy użyciu metody rozszerzenie

Mam interfejs tak:

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

Za pomocą tego interfejsu mogę stworzyć metodę rozszerzenia jak następuje:

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

Co ja naprawdę chcę to, że nie będzie wydarzeń, które muszą zostać zwolniony, np: a statechange-event.

Jednak nie chcę, aby StatechangeEvent był częścią interfejsu IStateMachine, ale wydaje się, że to jedyny sposób. Mam kilka klas, które implementują IStateMachine, i dlatego muszę powtórzyć ten sam kod za każdym razem.

Odpowiedz

4

W języku C# istnieją tylko metody rozszerzenia. Brak właściwości lub zdarzeń rozszerzenia.

Będziesz musiał zadeklarować zdarzenie w interfejsie.
Aby uniknąć konieczności wielokrotnego pisania tego samego kodu zdarzenia, można utworzyć klasę podstawową.

Inną możliwością jest "ręczne" wdrożenie wzoru Publish-Subscribe. To są zdarzenia w C#.

Możesz dodać metody rozszerzeń Subscribe i Unsubscribe do IStateMachine.

Używają one prawdopodobnie statycznej klasy StateMachineSubscribers, która również odsłania metody Subscribe i Unsubscribe. Dodatkowo udostępnia on metodę Raise używaną przez Twoją metodę rozszerzenia ChangeState.

+0

Dzięki, popatrzę na to. Mam różne klasy, które mogą być IStateMachine. Kiedy robię podstawową klasę abstrakcyjną, mam problemy z dziedziczeniem wielokrotnym. – avanwieringen

+0

@avanwieringen: W takim przypadku lepszym rozwiązaniem wydaje się implementacja pub/sub na interfejsie za pomocą metod rozszerzeń. –

0

Zdarzenie z odpowiednim pełnomocnika może być częścią betonu klasy że narzędzi tym IStateMachine interfejsu. Więc jeśli zadzwonisz na SetState, na interfejsie, wywoływana jest jego beton implementacji pewnej klasy konkretnej, która w środku wywołuje zdarzenie, które chcesz.

Powiązane problemy