0

タイトルがはっきりしない場合は申し訳ありません。これは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全体を理解しようとしています。

4

1 に答える 1

0

あなたがやりたいことは、「TwinCatIntegerDevice」クラスの「OverLoads」キーワードを削除し、キーワード「Shadows」に置き換えることだと思います。

于 2010-09-14T13:57:17.363 に答える