インターフェースイベント(インターフェース内のイベントの宣言)のパワーの良い例は何ですか?
ほとんどの場合、インターフェイス内のパブリック抽象メソッドのみを見てきました。
イベントを使用して、シリアルポートがデータを受信したことを通知しました。
これが私のインターフェースです。
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; }
}
.NETフレームワーク内の優れた例は、 INotifyPropertyChanged インターフェイスです。このインターフェイスは、 PropertyChanged イベントの1つのメンバーのみで構成されています。
WPFでは、コントロールがオブジェクトインスタンスの特定のプロパティを表示することを指定できます。しかし、基になるプロパティが変更された場合、このコントロールはどのように更新されますか?
バインドされたオブジェクトが INotifyPropertyChanged インターフェイス、WPFフレームワークは単にリッスンできます PropertyChanged 適切に更新します。
ここに一例があります
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);
}
}
}
私のアプリケーションの1つにこのようなコードがいくつかあります。アプリはwinformsで記述され、WPFにアップグレードされました。
インターフェイスのイベントは、メソッドとほとんど同じように機能します。インターフェースを使用するのと同じように使用できます。
public interface IInterface {
event EventHandler QuestionAsked;
}
public class Class : IInterface {
event EventHandler QuestionAsked;
//As with typical events you might want an protected OnQuestionAsked
}
INotifyPropertyChanged はフレームワーク全体で使用されます。
INotifyPropertyChanged.PropertyChanged イベントを見てください。
典型的なシナリオは、パッシブビューを持つMVPパターンです。フォームは、NameChangedイベントを持つビューインターフェイスを実装します。ビューを作成/使用するプレゼンターは、このイベントをサブスクライブします。テキストボックスの名前テキストが変更されると、ビューはこのイベントを発生させます。その後、発表者に通知されます。プレゼンターはビューインターフェイスからのイベントのみを認識しているため、テスト用にモックビューを提供できます。ビューはプレゼンターから完全に切り離されています。