2011-11-01 72 views
0

我正在研究一些部分类,但我无法弄清楚如何去做。 这是我的课:类和数组如何初始化?

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 

,因为它与类数组我如何能做到这一点在我的表格和信息类

提前致谢。

回答

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约束。

使用重载如下:

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

End Class 

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

+0

谢谢!但是当我使用分部类时,我怎么能在构造函数中做到这一点?当我的“原始”类存在时,我认为我的分部类中没有构造函数?或者这是错误的? – Liss

+0

@Liss不,你不能在两个不同的地方定义相同的方法。如果部分类的另一部分创建了一个默认构造函数,那么您坚持使用这个Init方法。没有遇到的部分类阻止我创建默认构造函数。您应该避免使用部分类,除非这些部分中的某一个是由工具(如WinForm/WPF设计人员)生成的,因为他们将代码分开时没有太多好处。使用'FixedCollection',可以让你初始化内联(例如:'Private InfoField As New FixedCollection(Of Info)')并完全避免构造函数问题。 –

+0

谢谢!是的,我的“原始”部分类是自动生成的,并有一个构造函数,我不能改变这个自动生成的类。那么对于我来说,使用部分类来扩展“原始”类是不是最好的选择? – Liss