基类中的事件

时间:2009-05-19 14:45:52

标签: .net vb.net events derived-class

好的,所以我有一个基类来声明事件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

5 个答案:

答案 0 :(得分: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框架其余部分中事件的设计方式。

答案 1 :(得分:1)

除非您的子类特定需要覆盖基类方法,否则我会说调用基类实现绝对是最佳解决方案。

答案 2 :(得分:0)

对于这种类型的场景,这几乎是通过派生类在基类上引发事件的标准方法。

但是,这可能会有所改变,具体取决于谁控制层次结构的StatusText。如果FooBase中有一个具体的StatusText支持字段,只能通过访问器进行更改,那么我不会让孩子控制StatusTextChanged事件的引发。相反,我会强制在StatusText的属性的Setter中引发事件。这使得父类可以更好地控制在何时以及何时不提出所述事件时执行它想要的任何合同。

但是,如果StatusText是必须由派生类定义的属性,我会选择您显示的路径。

答案 3 :(得分:0)

您可以拥有的一个选项是将Status属性包装在基类中,以便它在更改中引发事件本身 (在C#中,因为不知道VB而且暂时无法访问Visual Studio)

private string _status;

public string Status
{
    get { return _status; }
    protected set
    {
        if (_status == value) return;
        _status = value;
        StatusChanged(value);
    }
}

答案 4 :(得分:0)

这是带有委托和状态文本参数

的事件的代码
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