3

さて、イベントを宣言する基本クラスがあります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
4

5 に答える 5

6

あなたは推奨される方法(または少なくとも私が推奨する方法)にかなり近いと思います。

選択肢があれば、コードにいくつかの変更を加えます。

  • 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 フレームワーク内でのイベントの設計方法とより一致します。

于 2009-05-19T14:55:43.543 に答える
1

子クラスが基本クラスのメソッドをオーバーライドする必要が特にない限り、基本クラスの実装を呼び出すことが絶対に最善の解決策であると言えます。

于 2009-05-19T14:47:55.057 に答える
0

これは、このタイプのシナリオの派生クラスを介して基本クラスでイベントを発生させる標準的な方法です。

ただし、階層の StatusText を誰が制御しているかによって、これは少し変わる可能性があります。アクセサーを介してのみ変更できる具体的な StatusText バッキング フィールドが FooBase にある場合、子に StatusTextChanged イベントの発生を制御させません。代わりに、StatusText のプロパティの Setter 内で強制的にイベントを発生させます。これにより、親クラスは、イベントをいつ発生させるか、いつ発生させないかについて、必要なコントラクトをより詳細に制御できます。

ただし、StatusText が派生クラスで定義する必要があるプロパティである場合は、表示されたルートを選択します。

于 2009-05-19T14:50:35.240 に答える
0

デリゲートとステータステキストのパラメータを持つイベントの私のコードは次のとおりです

Public Event Status As StatusEventHandler

Protected Overridable Sub OnStatus(ByVal e As StatusEventArgs)
    RaiseEvent Status(私、e)
サブ終了

Public Delegate Sub StatusEventHandler(ByVal sender As Object, _
   ByVal e As StatusEventArgs)

<System.Serializable()> _
パブリック クラス StatusEventArgs
    System.EventArgs を継承

    Public Sub New()
    サブ終了

    Public Sub New(ByVal statusText As String)
        _StatusText = ステータステキスト
    サブ終了

    ' イベント プロパティなどのコードをここに入力します。

    Private _StatusText As String = ""
    Public プロパティ StatusText() As String
        得る
            _StatusText を返す
        エンドゲット
        Set(文字列としての ByVal 値)
            _StatusText = 値
        エンドセット
    End プロパティ


クラス終了
于 2009-05-20T12:32:04.060 に答える
0

あなたが持つことができる1つのオプションは、基本クラスでStatusプロパティをラップすることです。これにより、変更でイベント自体が発生します(VBを知らず、現時点ではVisual Studioにアクセスできないため、C#で)

private string _status;

public string Status
{
    get { return _status; }
    protected set
    {
        if (_status == value) return;
        _status = value;
        StatusChanged(value);
    }
}
于 2009-05-19T15:05:28.627 に答える