2009-11-17 14 views
23

Che cosa è un buon esempio della potenza degli eventi dell'interfaccia (dichiarare gli eventi all'interno dell'interfaccia)?Uso pratico degli eventi di interfaccia

La maggior parte delle volte ho visto solo metodi astratti pubblici all'interno dell'interfaccia.

risposta

42

Ho usato gli eventi per segnalare quando una porta seriale ha ricevuto i dati.

Ecco la mia interfaccia.

public interface ISerialPortWatcher 
{ 
    event EventHandler<ReceivedDataEventArgs> ReceivedData; 
    event EventHandler StartedListening; 
    event EventHandler StoppedListening; 

    SerialPortSettings PortOptions { set; } 

    bool Listening { get; set; } 
    void Stop(); 
    void Start(); 
} 

public class ReceivedDataEventArgs : EventArgs 
{ 
    public ReceivedDataEventArgs(string data) 
    { 
     Data = data; 
    } 
    public string Data { get; private set; } 
} 
4

Gli eventi nelle interfacce funzionano praticamente come i metodi. Puoi usarli proprio come useresti qualsiasi interfaccia.

public interface IInterface { 
    event EventHandler QuestionAsked; 
} 

public class Class : IInterface { 
    event EventHandler QuestionAsked; 

    //As with typical events you might want an protected OnQuestionAsked 
} 
13

qui è un esempio

public interface IMainAppWindow 
{ 
    event EventHandler Closed; 
} 

// version 1 main window 
public MainForm : Form , IMainAppWindow 
{ 

} 

// version 2 main window 
public MainWindow : Window , IMainAppWindow 
{ 
    event EventHandler Closed; 

    public void OnClosed(object sender,RoutedEventArgs e) 
    { 
    if(Closed != null) 
    { 
     Closed(this,e); 
    } 
    } 
} 

ho qualche codice come questo in 1 delle mie applicazioni. L'app è stata scritta in winform, quindi aggiornata a WPF.

+0

Quando si genera un evento, è necessario [creare una copia dell'evento] (https://msdn.microsoft.com/en-us/library/w369ty8x%28v=vs.100%29.aspx) (vedere ' OnRaiseCustomEvent() ') per evitare la possibilità di una ** condizione di competizione **:' EventHandler handler = this.Closed; if (handler! = null) {...} ' – DavidRR

16

Un esempio eccellente all'interno del framework .NET è l'interfaccia INotifyPropertyChanged. Questa interfaccia è composta da un solo membro: l'evento PropertyChanged.

In WPF, è possibile specificare che un controllo visualizzerà una proprietà specifica di un'istanza di oggetto. Ma come verrà aggiornato questo controllo se la proprietà sottostante cambia?

Se l'oggetto associato implementa l' INotifyPropertyChanged interfaccia, il quadro WPF può solo ascoltare PropertyChanged e aggiornare in modo appropriato.

2

Uno scenario classico è il modello MVP con vista passiva. Il modulo implementa una vista intefaccia con un evento NameChanged. Il relatore che crea/utilizza la vista si iscrive a questo evento. Quando il testo del nome nella casella di testo è cambiato, la vista attiva questo evento. Il presentatore viene quindi informato. Poiché il relatore conosce solo l'evento dall'interfaccia della vista, è possibile fornire una simulazione di prova. La vista è completamente disaccoppiata dal presentatore.

+0

Nell'articolo [Model View Presenter Styles] (https://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/) che descrive tre diversi pattern MVP, il terzo pattern chiamato ** Observing Presenter Style ** sembra essere più strettamente allineato con lo schema ** Passive View ** qui descritto. – DavidRR