質問

さて、イベントを宣言する基本クラスがあります 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top