[英]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
我要說的是,您非常接近推薦的方式(或者至少是我建議的方式)。
如果可以選擇的話,我將對您的代碼進行一些更改:
Protected Overridable
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.