タイトルがはっきりしない場合は申し訳ありません。これはVB.NET(2010)の質問です
「Device」というスーパークラスがあり、それを継承するサブクラスがいくつかあります。これらのサブクラスの一部には、サブクラスもあります。特に、「Device」を継承する「TwinCatDevice」を継承する「TwinCatIntegerDevice」というクラスがあります。
デバイスの関連部分は次のようになります。
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スーパークラスとして渡すことです(サブタイプごとに個別のサブルーチンを用意する必要がないようにするため)。
サブルーチンに渡された後、「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デバイスクラスがスーパークラスDeviceとしてキャストされたときに、Setpointsの変数が明らかに異なる理由を誰かが知っていますか?
これが少し矛盾しているように思われる場合は申し訳ありません。どんな助けでも素晴らしいでしょう!フォームやその他のことに関しても。私はまだこのVB.NET全体を理解しようとしています。