类和数组如何初始化?

时间:2011-11-01 10:49:42

标签: vb.net class partial-classes

我正在研究一些部分课程,但我无法弄清楚如何去做。 这是我的课程:

Partial Public Class Form
    Private InfoField() As Info

    Private FormgroupField() As FormGroup

    Private tittle As String


    Public Property Info() As Info()
    Get
        Return Me. InfoField
    End Get
    Set
        Me. InfoField = value
    End Set
    End Property

Public Property FormGroup() As FormGroup()
    Get
        Return Me.GromGroupField
    End Get
    Set
        Me.FormGroupField = value
    End Set
    End Property

   Public Property tittle() As String
    Get
        Return Me.tittleField
    End Get
    Set
        Me.tittleField = value
    End Set
 End Property
End class



Partial Public Class Info
      Private ChangeFormField() As ChangeForm

    Private formYearField() As FormYea

    Private idField As String

    Public Property ChangeForm() As ChangeForm()
    Get
        Return Me.changeFormField
    End Get
    Set
        Me.changeFormField = value
    End Set
    End Property

   Public Property FormYear() As FormYear()
    Get
        Return Me.formYearField
    End Get
    Set
        Me.formYearField = value
    End Set
    End Property

   Public Property id() As String
    Get
        Return Me.idField
    End Get
    Set
        Me.idField = value
    End Set
    End Property    

  End Class

 Partial Public Class ChangeForm
Private idField As String

    Private valueField As String

<properties goes here>
End Class

Partial Public Class FormYear

    Private idField As String

    Private valueField As String

<properties goes here>
 End Class

对于FormGroup类,组织是相同的。

我想构建部分类来扩展这些类,所以当我在另一个项目中使用所有这些类时,我只需处理(参见)最顶层的类(Form)而不是其他类(如Info和FormGroup)。这就是我喜欢做的事情:

Partial Public Class Form
 Public Sub Init()
    Me.Info = New Info
    Me.FormGroup = New FormGroup

    Me.Info.Init()
    Me.FormGroup.Init()
End Sub

End Class

Partial Public Class Info
 Public Sub Init()
    Me.FormYear = New FormYear
    Me.ChangeForm = New ChangeForm

    Me.changeForm.Init()
End Sub

但我不能写

Me.Info = New Info
Me.FormGroup = New FormGroup

因为它是带有类的数组。我怎么能在Form和Info课程中做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您必须首先创建一个数组,然后遍历数组并分配每个元素。此外,除非您有充分的理由,否则请在构造函数中执行此操作,而不是使用单独的init方法。

Public Class Form
    Public Sub New()
        'In VB, you give the max index, not the length.
        'I prefer listing this as (whatever I want for length) - 1
        Me.Info = New Info(size - 1) {}
        For i = 0 to size - 1
            Me.Info(i) = New Info()
        Next
        'similarly for other fields
    End Sub
End Class

或者,如果您发现自己有很多数组字段,并且它们都有默认构造函数,那么您可以创建一个FixedCollection类来封装重复的初始化代码。

Public Class FixedCollection(Of T As New)
    Inherits Collection(Of T)

    Public Sub New(ByVal size As Integer)
        MyBase.New(New T(size - 1) {})
        For i = 0 to size - 1
            Me.Items(i) = New T()
        Next
    End Sub

    'alternate constructors if you need additional initialization
    'beyond construction of each element
    Public Sub New(ByVal size As Integer, ByVal creator As Func(Of T))
        MyBase.New(New T(size - 1) {})
        If creator Is Nothing Then Throw New ArgumentNullException("creator")
        For i = 0 to size - 1
            Me.Items(i) = creator()
        Next
    End Sub
    'this overload allows you to include the index in the collection
    'if it would matter to creation
    Public Sub New(ByVal size As Integer, ByVal creator As Func(Of Integer, T))
        MyBase.New(New T(size - 1) {})
        If creator Is Nothing Then Throw New ArgumentNullException("creator")
        For i = 0 to size - 1
            Me.Items(i) = creator(i)
        Next
    End Sub

    'other collection overrides as needed here

End Class

编辑:为元素构造函数不足时添加了构造函数重载。

如果您只使用带有创建者参数的构造函数,则可以删除New上的T约束。

使用重载如下:

Public Class Form
    Private InfoField As New FixedCollection(Of Info)(10,  
                Function()
                    Dim ret As New Info()
                    ret.Init()
                End Function)

End Class

根据您的评论,似乎Init方法是不幸的必需品。如果可能的话,我建议您找到一种方法来改变生成的构造函数,以便为您调用此方法(使用部分方法在生成的代码中定义),而不是强迫您自己调用它。

答案 1 :(得分:0)

您可以像这样初始化一个类的数组:

Public FieldTypes As FieldTypeInfo() =  
    {  
    New FieldTypeInfo("Byte", 1),  
    New FieldTypeInfo("Int16", 2),  
    New FieldTypeInfo("Int32", 3),  
    New FieldTypeInfo("Integer", 3),  
    New FieldTypeInfo("Int64", 4),  
    New FieldTypeInfo("UInt16", 5),  
    New FieldTypeInfo("UInt32", 6),  
    New FieldTypeInfo("UInteger", 6),  
    New FieldTypeInfo("UInt64", 7)  
}