Подкласс / Суперкласс - Если подкласс приведен в качестве суперкласса, есть ли способ использовать перегруженные свойства подкласса? - PullRequest
0 голосов
/ 14 сентября 2010

Извините, если название не очень понятно. Это вопрос 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.

1 Ответ

0 голосов
/ 14 сентября 2010

Я думаю, что вы хотите сделать, это удалить ключевое слово «OverLoads» в классе «TwinCatIntegerDevice» и заменить его ключевым словом « Shadows ».

...