2010-09-13 36 views
0

对不起,如果标题不是很清楚。这是一个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的事情弄清楚。

回答

0

我认为你想要做的是在“TwinCatIntegerDevice”类中删除你的“OverLoads”关键字,并用关键字“Shadows”替换它。

+0

是的,我之前有过。我认为这个问题是,当我将我们的子类对象强制转换为超类时,它不会将值分配给阴影属性。这是不正确的? – 2010-09-14 23:16:24