いくつかのアプローチがあります。
サブスクリプションを禁止し、発射を抑制
サブクラスは、(a) 呼び出し元がイベントに直接サブスクライブしようとした場合に例外をスローし、ProcessChange
(b) イベントをまったく発生させないように記述できます。BackgroundWorker
呼び出し元はサブクラスを a としてキャストし、イベントを直接サブスクライブできるため、(a) だけではイベントのサブスクライブが妨げられないことに注意してください。
class ExtendedBackgroundWorker : BackgroundWorker
{
public new event ProgressChangedEventHandler ProgressChanges
{
add { throw new InvalidOperationException("This event cannot be added directly"); }
remove {}
}
protected override void OnProgressChanged(ProgressChangedEventArgs e)
{
// do not call base.OnProgressChanged
}
}
継承の代わりにコンポジションを使用する
ただし、可能であれば、まったく継承しない方がよい場合もありますBackgroundWorker
。ABackgroundWorker
はProgressChanged
イベントを使用して進行状況の変化を報告します。そうでない場合、それは ではありませんBackgroundWorker
。代わりに、BackgroundWorker をプライベート クラス メンバーとして実装し、必要に応じてメンバーからメンバーを公開することを検討してください。
class CustomBackgroundWorker : Component
{
private BackgroundWorker worker;
public event ProgressChangedEventHandler FirstEvent;
public event ProgressChangedEventHandler SecondEvent;
public event DoWorkEventHandler DoWork
{
add { worker.DoWork += value; }
remove { worker.DoWork -= value; }
}
public event RunWorkerCompletedEventHandler RunWorkerCompleted
{
add { worker.RunWorkerCompleted += value; }
remove { worker.RunWorkerCompleted -= value; }
}
public CustomBackgroundWorker()
{
worker = new BackgroundWorker();
worker.ProgressChanged += OnProgressChanged;
worker.WorkerReportsProgress = true;
}
public void RunWorkerAsync()
{
worker.RunWorkerAsync();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
worker.Dispose();
}
private void OnProgressChanged(object o, ProgressChangedEventArgs e)
{
// code to handle progress change reports from the worker
}
}
クライアントに役立つ Refire イベント
サブクラスは、イベントの使用を抑制するのではなく、他のイベントと組み合わせて (代わりとしてではなく) 使用して、サブスクライバーに関連情報 (たとえば、操作全体の進行状況) を提供できます。