[英]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.