質問
さて、イベントを宣言する基本クラスがあります StatusTextChanged
. 。もちろん、私の子クラスはこのイベントを直接発生させることはできません。
したがって、(簡単にするために)次のようなものになります。
Public MustInherit Class FooBase
Public Event StatusTextChanged(ByVal StatusText As String)
Protected Sub RaiseStatusTextChangedEvent(ByVal StatusText As String)
RaiseEvent StatusTextChanged(StatusText)
End Sub
End Class
そして、私が呼び出す子クラスでMyBase.RaiseStatusTextChangedEvent("something")
。これを行うためのより良い方法、またはより推奨される方法はありますか?
編集:VB.NET または C#、どちらの場合でも基本的には同じように動作します。
編集:したがって、応答の後、基本クラスでこれを行い、子クラスで StatusText プロパティを設定するだけです...
Public Event StatusTextChanged(ByVal StatusText As String)
Private _StatusText As String = "Idle."
Public Property StatusText() As String
Get
Return _StatusText
End Get
Protected Set(ByVal value As String)
RaiseEvent StatusTextChanged(value)
End Set
End Property
解決
推奨される方法 (少なくとも私が推奨する方法) にかなり近いと思います。
選択肢があれば、コードにいくつかの変更を加えます。
- StatusTextChanged を作成する
Protected Overridable
- カスタム EventArgs クラスで StatusText をラップする
- StatusTextChanged 宣言を次のように変更します。
Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)
結果のコードは次のとおりです。
カスタムeventargsクラス:
Public Class TextEventArgs
Inherits EventArgs
Private _text As String
Public Sub New(ByVal text As String)
_text = text
End Sub
Public ReadOnly Property Text() As String
Get
Return _text
End Get
End Property
End Class
基本クラスのイベント実装:
Public Event StatusTextChanged As EventHandler(Of TextEventArgs)
Protected Overridable Sub OnStatusTextChanged(ByVal e As TextEventArgs)
RaiseEvent StatusTextChanged(Me, e)
End Sub
...そして最後に、イベントを発生させるためのコード行です。基本クラスまたはそれを継承するクラスのいずれかで:
OnStatusTextChanged(New TextEventArgs("some text"))
これは、.NET Framework の残りの部分でのイベントの設計方法とより一致します。
他のヒント
私は基本クラスの実装を呼び出すことは絶対に最善の解決策だと思います。
このはかなりこのタイプのシナリオのために由来する1つを介してベースクラスにイベントを上げるための標準的な方法です。
しかし、これは、階層のSTATUSTEXTを制御している人に応じたビットを変更することができます。唯一のアクセサを介して変更することができFooBaseにおける具体的なSTATUSTEXTバッキングフィールドがある場合、私は子供がStatusTextChangedイベントの上昇を制御することはできないだろう。代わりに、私はSTATUSTEXTのプロパティのセッター内のイベントの上昇を強制します。これは、親クラスにすると言ったときにイベントを発生させないように、それは周りたいすべての契約を強制でより詳細に制御できます。
STATUSTEXTは、派生クラスで定義されなければならないプロパティがある場合は、しかし、私はあなたが表示されたルートを選ぶだろう。
あなたが持っている可能性が1つのオプションは、基本クラスのStatusプロパティをラップで (いけないとしてC#でVBを知っていて、現時点でのVisual Studioへのアクセス権を持っていけない)
private string _status;
public string Status
{
get { return _status; }
protected set
{
if (_status == value) return;
_status = value;
StatusChanged(value);
}
}
ここに私のコードは、デリゲートとイベントとステータステキストのパラメータのためだ。
Public Event Status As StatusEventHandler Protected Overridable Sub OnStatus(ByVal e As StatusEventArgs) RaiseEvent Status(Me, e) End Sub Public Delegate Sub StatusEventHandler(ByVal sender As Object, _ ByVal e As StatusEventArgs) <System.Serializable()> _ Public Class StatusEventArgs Inherits System.EventArgs Public Sub New() End Sub Public Sub New(ByVal statusText As String) _StatusText = statusText End Sub ' Enter code here for event properties, etc. Private _StatusText As String = "" Public Property StatusText() As String Get Return _StatusText End Get Set(ByVal value As String) _StatusText = value End Set End Property End Class