代码之家  ›  专栏  ›  技术社区  ›  Andrew

实现一个单元格类,该类具有可以是不同类型的值属性

  •  2
  • Andrew  · 技术社区  · 16 年前

    我正在尝试设计一个包含行和单元格的表类型结构。我希望单元类具有值属性。我正在努力研究如何创建一个可以返回一些已定义的不同类型的值,例如integer、single、date、string。我希望单元格值是强类型的,但我不确定如何最好地实现这一点。

    到目前为止,我在代码方面的想法是:

    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 回复  |  直到 16 年前
        1
  •  1
  •   Kamarey    16 年前

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

    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