代码之家  ›  专栏  ›  技术社区  ›  hmcclungiii

基类中的事件

  •  3
  • hmcclungiii  · 技术社区  · 17 年前

    好的,所以我有一个基类来声明事件 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 回复  |  直到 17 年前
        1
  •  6
  •   Fredrik Mörk    17 年前

    我想说你很接近推荐的方式(或者至少是我推荐的方式)。

    我会对您的代码做一些修改,如果您有选择的话:

    • 使状态文本更改 Protected Overridable
    • 在自定义EventArgs类中包装状态文本
    • 将statistextchanged声明更改为 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框架其余部分中事件的设计方式。

        2
  •  1
  •   Lazarus    17 年前

    除非您的子类需要重写基类方法,否则我认为调用基类实现绝对是最佳解决方案。

        3
  •  0
  •   JaredPar    17 年前

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

    但是,这可能会根据谁控制层次结构的状态文本而有所改变。如果foobase中有一个具体的statistext backing字段只能通过访问器更改,那么我不会让子级控制statistextchanged事件的提升。相反,我将强制在statusText属性的setter中引发事件。这使得父类在执行任何它希望在何时以及何时不引发所述事件的契约时拥有更多的控制权。

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

        4
  •  0
  •   JDunkerley    17 年前

    您可以拥有的一个选项是将状态属性包装在基类中,以便它在更改时引发事件本身。 (在C中,因为不知道vb,目前无法访问Visual Studio)

    private string _status;
    
    public string Status
    {
        get { return _status; }
        protected set
        {
            if (_status == value) return;
            _status = value;
            StatusChanged(value);
        }
    }
    
        5
  •  0
  •   Rick Rat    17 年前

    这是我的带有委托和状态文本参数的事件代码

    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