实现具有可以是不同类型的value属性的单元类

时间:2010-01-27 11:38:16

标签: vb.net

我正在尝试设计一个包含行和单元格的表类型结构。我打算让cell类具有value属性。我试图找出如何创建一个可以返回一些定义的不同类型的值,例如整数,单个,日期,字符串。我希望单元格值是强类型的,但我不确定如何最好地使其工作。

到目前为止我在代码中的想法:

Public Class Cell
  Private _value as object
  Public Property Value as Object    // How can I define this so that it return a Type 
    Get                              // e.g. integer, string, etc
      Return _value 
    End Get
    Set(ByVal value as object)
      _value = value
    End Set
End Class

Public Class Row
  Dim _Cells as New List(Of Cell)
  Public Function AddCell(ByVal c as Cell) as Cell
     _Cells.Add(c)
     Return _Cells(_Cells.count - 1)
  End Function

1 个答案:

答案 0 :(得分:1)

这是一个使用基本继承甚至没有泛型的简单解决方案。我们的想法是,您拥有所有单元格的单个父类。每列类型有不同的单元类。这使得可以声明Row对象中的单元格列表。由于单行中可能存在不同的单元格类型,因此无法将其(单元格列表)声明为某些特定单元格类型的列表。但在这种情况下,您可以使用单元格的父类。简而言之就是这样的例子:

Public Class Cell
End Class

Public Class Cell_Id
    Inherits Cell
    Public Value As Integer
End Class

Public Class Cell_Name
    Inherits Cell
    Public Value As String
End Class

Public Class Cell_MonthlyTax
    Inherits Cell
    Public Value As Double
End Class


Public Class Row
    Public Cells As New List(Of Cell)

    Public Sub AddCell(ByVal cell As Cell)
        Cells.Add(cell)
    End Sub
End Class


Module Module1

    Sub Main()
        Dim row1 As New Row()
        row1.AddCell(New Cell_Id() With {.Value = 1})
        row1.AddCell(New Cell_Name() With {.Value = "Name1"})
        row1.AddCell(New Cell_MonthlyTax() With {.Value = 12.2})
        Dim row2 As New Row()
        row2.AddCell(New Cell_Id() With {.Value = 2})
        row2.AddCell(New Cell_Name() With {.Value = "Name2"})
        row2.AddCell(New Cell_MonthlyTax() With {.Value = 47.9})
        Dim row3 As New Row()
        row3.AddCell(New Cell_Id() With {.Value = 3})
        row3.AddCell(New Cell_Name() With {.Value = "Name3"})
        row3.AddCell(New Cell_MonthlyTax() With {.Value = 73.3})

        Dim rows As New List(Of Row)(New Row() {row1, row2, row3})

        ' here you loop through rows, in each row select Cell at index 2, cast it down to a specific
        ' type (yes, you should tell to a compiler that you sure that Cell at index 2 is of Cell_MonthlyTax type)
        ' After casting you will get intellisence and see that Value is of Double type.
        ' In cellsOfColumn2 you will get an array of Double (this is not exactly array, but it doesn't matter in our case)
        Dim cellsOfColumn2 = From row In rows Select DirectCast(row.Cells(2), Cell_MonthlyTax).Value

        ' here you may work with array of values as you want, say calculate avarange value
        Dim result = cellsOfColumn2.Average()
    End Sub

End Module