繁体   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