2013-03-04 2 views
5

ho trovato diversi post su eventi di raccolta con un metodo di estensione, ma la mia domanda è un po 'diverso:Aggiungi eventi utilizzando i metodi di estensione

Ho un'interfaccia come questa:

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

Utilizzando questa interfaccia posso creare un metodo di estensione come segue:

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

quello che voglio davvero è che non ci saranno eventi che hanno bisogno di essere licenziato, ad esempio: un statechange-event.

Tuttavia, non voglio che lo StatechangeEvent faccia parte dell'interfaccia IStateMachine, ma sembra che sia l'unico modo. Ho diverse classi che implementano IStateMachine, e quindi devo ripetere lo stesso codice ogni volta.

risposta

4

In C# esistono solo i metodi di estensione. Nessuna proprietà o eventi di estensione.

Dovrete dichiarare l'evento sull'interfaccia.
Per evitare la necessità di scrivere più volte lo stesso codice evento, è possibile creare una classe base.

Un'altra possibilità sarebbe quella di "manualmente" implementare il modello Publish-Subscribe. Ecco cosa sono gli eventi in C#.

È possibile aggiungere i metodi di estensione Subscribe e Unsubscribe a IStateMachine.

Utilizzerebbero una classe probabilmente statica StateMachineSubscribers che espone anche i metodi Subscribe e Unsubscribe. Inoltre, espone un metodo Raise utilizzato dal metodo di estensione ChangeState.

+0

Grazie, lo guarderò. Ho diversi tipi di classi che possono essere tutte IStateMachine. Quando creo una classe astratta di base, ho problemi con l'ereditarietà multipla. – avanwieringen

+0

@avanwieringen: In tal caso l'implementazione di pub/sub sull'interfaccia tramite i metodi di estensione sembra essere l'idea migliore. –

0

L'evento con il suo corrispondente delegato può essere una parte di una classe calcestruzzo che implementa che IStateMachine interfaccia. Quindi, se si chiama SetState, sull'interfaccia, è concreto implementazione di alcune classe di calcestruzzo, che al suo interno genera un evento desiderato.