Извините, если название не очень понятно. Это вопрос VB.NET (2010)
У меня есть суперкласс под названием «Устройство», у которого есть несколько подклассов, которые его наследуют. Некоторые из этих подклассов также имеют подклассы. В частности, у меня есть класс под названием «TwinCatIntegerDevice», который наследует «TwinCatDevice», который наследует «Device».
Соответствующие части устройства выглядят так:
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 не перегружает Setpoints или 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, я новичок)
Важно отметить, что я передаю устройство как суперкласс Device (так что мне не нужно иметь отдельную подпрограмму для каждого подтипа).
Когда я делаю это для TwinCatIntegerDevice с именем «ThisDevice» после того, как он был передан в подпрограмму:
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, очевидно, имеет другую переменную для уставок, когда он приводится в качестве своего суперкласса Device?
Извините, если это кажется немного бессвязным. Любая помощь будет отличной! Даже в отношении формы или чего-либо еще. Я все еще пытаюсь понять всю эту вещь VB.NET.