【问题标题】:Handling Parent Property Event处理父属性事件
【发布时间】:2013-06-26 20:53:37
【问题描述】:

是否可以通过属性访问器监听父类对象的事件?

我尝试过的(一个最小的例子):

Public Class ParentFoo
  Private WithEvents m_bar As EventyObj
  Public Property Bar() As EventyObj
    Get
      Return m_bar
    End Get
    Set(ByVal value As EventyObj)
      m_bar = value
    End Set
  End Property
End Class

Public Class ChildFoo
  Inherits ParentFoo

  [...]

  Public Sub Bar_OnShout() Handles Bar.Shout
    ' Some logic
  End Sub
End Class

我收到的特定错误消息 (VS2005) 是“Handles 子句需要在包含类型或其基本类型之一中定义的 WithEvents 变量。”通过公共属性访问私有 WithEvents 变量会去掉“WithEvents”吗?

【问题讨论】:

  • 我不明白你想在这里实现什么。子类派生自父类,因此它可以直接访问您提供给父​​类的任何成员!因为它“是”父类。试着解释你的目标是什么。
  • @DonA:这不准确。 ChildFoo 不能直接访问 m_bar,因为它在父类中被声明为“Private”。我可以通过声明它受保护来解决这个问题,但除非我绝对必须这样做,否则我宁愿不这样做。我想要实现的是通过访问器属性,通过现有的 WithEvents/Handles 简写来监听私有的父类对象的事件。
  • 我明白了,我的意思是您可以访问会员 - 这不是您想要的吗?我不认为事件会像那样对你有用。
  • 我认为我们正在谈论彼此。我无法直接访问私人会员;我可以通过属性访问它,但由于某种原因,WithEvents 被剥夺了。我很好奇为什么

标签: vb.net oop


【解决方案1】:

在 ParentFoo 中:

Public Overridable Sub OnShout() Handles m_bar.Shout
'No Logic Necessary
End Sub

在 ChildFoo 中:

Public Overrides OnShout()
'Logic Here
End Sub

由于当 m_bar 引发 Shout 事件并且您在 ChildFoo 中覆盖它时 ParentFoo 将调用 OnShout,因此您的 ChildFoo 的 OnShout 将处理该事件。

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2012-11-20
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多