我正在开发一个可以与USB传感器家族对话的应用程序。我已经创建了一个基本的实现,它利用了一个名为Sensor的类。该类包含允许与传感器交互的事件和方法(还涉及一个线程任务处理器,但我将使用一个简单的示例)。
我的问题是,这个简单的概念证明示例工作得很好,但现在我需要扩展应用程序以支持整个传感器系列。为此,我创建了一个包含所有适当方法和事件的BaseSensor类,然后创建了多个子类,如SensorA、SensorB和SensorC,它们都是BaseSensor固有的。
这似乎是一个很好的多态性应用程序,所以我在BaseSensor上创建了一个名为Initialize的共享函数,该函数执行初始USB通信,并根据传感器类型(SensorA、SensorB、SensorC)返回正确的对象。这工作得很好,但是我似乎找不到一种方法来正确地声明带有事件的对象。请参阅我的deliema的示例代码。
尝试1:
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:
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我遗漏了一些东西。我应该如何继续?
发布于 2009-08-30 15:04:37
WithEvents不能是后期绑定。你需要用一个类型声明你的字段。如果此场景中使用的所有对象都是从一个公共基础派生的,那么在抛弃后期绑定方面,您将帮自己一个很大的忙。必要时进行强制转换,并声明虚拟(可重写)方法来实现您的多态性。
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发布于 2009-08-30 15:03:57
这就是你要找的吗?
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中为它设置相应的类
发布于 2009-09-01 20:22:16
略微调整了事件,如果你想要一个这样的例子,也稍微改变了事件,提供了一点不同的方法。
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 Classhttps://stackoverflow.com/questions/1354032
复制相似问题