首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过后期绑定的VB.NET中的多态性不允许使用事件,解决方法?

通过后期绑定的VB.NET中的多态性不允许使用事件,解决方法?
EN

Stack Overflow用户
提问于 2009-08-30 14:44:28
回答 4查看 1.9K关注 0票数 2

我正在开发一个可以与USB传感器家族对话的应用程序。我已经创建了一个基本的实现,它利用了一个名为Sensor的类。该类包含允许与传感器交互的事件和方法(还涉及一个线程任务处理器,但我将使用一个简单的示例)。

我的问题是,这个简单的概念证明示例工作得很好,但现在我需要扩展应用程序以支持整个传感器系列。为此,我创建了一个包含所有适当方法和事件的BaseSensor类,然后创建了多个子类,如SensorA、SensorB和SensorC,它们都是BaseSensor固有的。

这似乎是一个很好的多态性应用程序,所以我在BaseSensor上创建了一个名为Initialize的共享函数,该函数执行初始USB通信,并根据传感器类型(SensorA、SensorB、SensorC)返回正确的对象。这工作得很好,但是我似乎找不到一种方法来正确地声明带有事件的对象。请参阅我的deliema的示例代码。

尝试1:

代码语言:javascript
运行
复制
Public Class Form1
    Dim WithEvents oBaseClass As BaseClass
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oBaseClass = New ExtendedClass
        oBaseClass.Test() 'This doesn't work because the object was type casted.
    End Sub

    Private Sub TestEventHdlr() Handles oBaseClass.TestEvent
        MsgBox("Event Fired")
    End Sub
End Class

Public Class BaseClass
    Public Event TestEvent()
End Class

Public Class ExtendedClass
    Inherits BaseClass
    Public Sub Test()
        MsgBox("Test")
    End Sub
End Class

尝试2:

代码语言:javascript
运行
复制
Public Class Form1
    Dim WithEvents oBaseClass 'This doesn't work.
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oBaseClass = New ExtendedClass
        oBaseClass.Test()
    End Sub

    Private Sub TestEventHdlr() Handles oBaseClass.TestEvent
        MsgBox("Event Fired")
    End Sub
End Class

Public Class BaseClass
    Public Event TestEvent()
End Class

Public Class ExtendedClass
    Inherits BaseClass
    Public Sub Test()
        MsgBox("Test")
    End Sub
End Class

我遗漏了一些东西。我应该如何继续?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-30 15:04:37

WithEvents不能是后期绑定。你需要用一个类型声明你的字段。如果此场景中使用的所有对象都是从一个公共基础派生的,那么在抛弃后期绑定方面,您将帮自己一个很大的忙。必要时进行强制转换,并声明虚拟(可重写)方法来实现您的多态性。

代码语言:javascript
运行
复制
Public Class Form1
    Dim WithEvents oBaseClass As BaseClass 'Early bound'

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oBaseClass = New ExtendedClass
        DirectCast(oBaseClass, ExtendedClass).Test() 'Casting to call a method'
    End Sub

    Private Sub TestEventHdlr() Handles oBaseClass.TestEvent
        MsgBox("Event Fired")
    End Sub
End Class

Public Class BaseClass
    Public Event TestEvent()
End Class

Public Class ExtendedClass
    Inherits BaseClass
    Public Sub Test()
        MsgBox("Test")
    End Sub
End Class
票数 3
EN

Stack Overflow用户

发布于 2009-08-30 15:03:57

这就是你要找的吗?

代码语言:javascript
运行
复制
Public Class Form1
    Private WithEvents oBaseClass As ExtendedClass

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oBaseClass = New ExtendedClass
        oBaseClass.Test()
    End Sub

    Private Sub TestEventHdlr() Handles oBaseClass.TestEvent
        MsgBox("Event Fired")
    End Sub
End Class

Public Class BaseClass
    Public Event TestEvent()
    Friend Sub raiseTestEvent()
        RaiseEvent TestEvent()
    End Sub
End Class

Public Class ExtendedClass
    Inherits BaseClass
    Public Sub Test()
        MsgBox("Test")
        raiseTestEvent()
    End Sub
End Class

如果没有,则需要创建一个接口并在窗体中声明它,然后在form_load中为它设置相应的类

票数 0
EN

Stack Overflow用户

发布于 2009-09-01 20:22:16

略微调整了事件,如果你想要一个这样的例子,也稍微改变了事件,提供了一点不同的方法。

代码语言:javascript
运行
复制
Public Class Form1

    Dim oBaseClass As BaseClass 'Early bound'
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oBaseClass = New ExtendedClass
        If TypeOf oBaseClass Is BaseClass Then
            AddHandler DirectCast(oBaseClass, BaseClass).TestEvent, AddressOf TestEventHdlr
        End If
        oBaseClass.Test()
    End Sub
    Private Sub TestEventHdlr()
        MsgBox("Event Fired")
    End Sub
End Class
Public Class BaseClass
    Public Event TestEvent()
    Public Overridable Sub Test()
        RaiseEvent TestEvent()
    End Sub
End Class
Public Class ExtendedClass
    Inherits BaseClass
    Public Overrides Sub Test()
        MyBase.Test()
        MsgBox("Test")
    End Sub
End Class
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1354032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档