对不起,如果标题不是很清楚。这是一个VB.NET(2010)问题子类/超类 - 如果一个子类被转换为其超类,是否有一种方法可以使用子类的重载属性?
我有一个叫做“设备”的超类,它有许多继承它的子类。其中一些子类也有子类。特别是,我有一个名为“TwinCatIntegerDevice”的类,它继承了继承“Device”的“TwinCatDevice”。
设备看起来像这样的相关部分:
Public Class Device
Private _Setpoints As New List(Of Double)
Public Overridable Property Setpoints As List(Of Double)
Get
Return _Setpoints
End Get
Set(ByVal value As List(Of Double))
_Setpoints = value
_SetpointsTb.Clear()
For Each setpoint In value
Dim setpointTb As New TextBox
setpointTb.Text = setpoint.ToString
_SetpointsTb.Add(setpointTb)
Next
End Set
End Property
Private _SetpointsTb As New List(Of TextBox)
Public Overridable Property SetpointsTb As List(Of TextBox)
Get
Return _SetpointsTb
End Get
Set(ByVal value As List(Of TextBox))
_SetpointsTb = value
Me._Setpoints.Clear()
For Each setpoint In value
Me._Setpoints.Add(setpoint.Text)
Next
End Set
End Property
End Class
的TwinCatDevice类不超载设定值或SetpointsTb。 的TwinCatIntegerDevice类做:
Public Class TwinCatIntegerDevice
Inherits TwinCatDevice
Private _Setpoints As New List(Of Integer)
Public Overloads Property Setpoints As List(Of Integer)
Get
Return _Setpoints
End Get
Set(ByVal value As List(Of Integer))
_Setpoints = value
_SetpointsTb.Clear()
For Each setpoint In value
Dim setpointTb As New TextBox
setpointTb.Text = setpoint.ToString
_SetpointsTb.Add(setpointTb)
Next
End Set
End Property
Private _SetpointsTb As New List(Of TextBox)
Public Overloads Property SetpointsTb As List(Of TextBox)
Get
Return _SetpointsTb
End Get
Set(ByVal value As List(Of TextBox))
_SetpointsTb = value
Me._Setpoints.Clear()
For Each setpoint In value
Me._Setpoints.Add(setpoint.Text)
Next
End Set
End Property
End Class
现在的问题。我尝试使用像这样的子程序设置设定值:
Private Sub FetchDeviceRecipe(ByRef device As Device, ByRef excelSheet As ExcelWorksheet, ByVal row As Integer)
Dim lastCol As Integer = NumberOfProcessSteps + 1
Try
For col = 2 To lastCol
Dim setpoint As New TextBox
setpoint.Text = excelSheet.Cells(row, col).Value
device.SetpointsTb.Add(setpoint)
Next
device.SetpointsTb = device.SetpointsTb
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
(我知道这是可怕的代码:X,我是一个初学者)
重要的是,我传递的设备作为设备超类(这样我就不必为每个子类型有一个单独的子例程)。
当我做了一个名为“ThisDevice”已经传递给子程序后TwinCatIntegerDevice:
MsgBox("As Device: " & CType(ThisDevice, Device).Setpoints.Count.ToString & vbNewLine & _
"As TwinCatDevice: " & CType(ThisDevice, TwinCatDevice).Setpoints.Count.ToString & vbNewLine & _
"As TwinCatIntegerDevice: " & CType(ThisDevice, TwinCatIntegerDevice).Setpoints.Count.ToString)
我得到以下(9在这种情况下设定值的正确的号码):
As Device: 9
As TwinCatDevice: 9
As TwinCatIntegerDevice: 0
有没有人知道为什么TwinCatInteger设备类显然有一个不同的设定点变量,当它被转换为它的超类设备?
对不起,如果这看起来有点不一致。任何帮助将是伟大的!即使在形式或其他方面。我仍然试图把这整个VB.NET的事情弄清楚。
是的,我之前有过。我认为这个问题是,当我将我们的子类对象强制转换为超类时,它不会将值分配给阴影属性。这是不正确的? – 2010-09-14 23:16:24