簡體   English   中英

基類中的事件

[英]Events in Base Classes

好的,所以我有一個基類,它聲明事件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
  • 將StatusText包裝在自定義EventArgs類中
  • 將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框架其余部分中事件的設計方式更加一致。

除非您的子類特別需要重寫基類方法,否則我會說調用基類實現絕對是最佳解決方案。

這幾乎是通過此類場景的派生事件在基類上引發事件的標准方法。

但是,這可能會有所變化,具體取決於誰控制層次結構的StatusText。 如果FooBase中有一個具體的StatusText支持字段,只能通過訪問器進行更改,那么我將不讓孩子控制StatusTextChanged事件的引發。 相反,我將強制在StatusText屬性的Setter中引發事件。 這使父類在執行它想要何時以及何時不引發該事件的任何合同時具有更多的控制權。

但是,如果StatusText是必須由派生類定義的屬性,我將選擇您顯示的路由。

您可能擁有的一種選擇是將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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM