类和数组如何初始化?
问题描述:
我正在研究一些部分类,但我无法弄清楚如何去做。 这是我的课:类和数组如何初始化?
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
,因为它与类数组我如何能做到这一点在我的表格和信息类
提前致谢。
答
您必须先创建一个数组,然后遍历数组并分配每个元素。另外,除非你有一个好的,强有力的理由,否则在构造函数中而不是单独的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
方法是一个不幸的必要性。如果可能的话,我建议你找到一种方法来让生成的构造函数改变,以便为你调用此方法(在生成的代码中使用部分方法定义),而不是强迫你自己调用它。
谢谢!但是当我使用分部类时,我怎么能在构造函数中做到这一点?当我的“原始”类存在时,我认为我的分部类中没有构造函数?或者这是错误的? – Liss
@Liss不,你不能在两个不同的地方定义相同的方法。如果部分类的另一部分创建了一个默认构造函数,那么您坚持使用这个Init方法。没有遇到的部分类阻止我创建默认构造函数。您应该避免使用部分类,除非这些部分中的某一个是由工具(如WinForm/WPF设计人员)生成的,因为他们将代码分开时没有太多好处。使用'FixedCollection',可以让你初始化内联(例如:'Private InfoField As New FixedCollection(Of Info)')并完全避免构造函数问题。 –
谢谢!是的,我的“原始”部分类是自动生成的,并有一个构造函数,我不能改变这个自动生成的类。那么对于我来说,使用部分类来扩展“原始”类是不是最好的选择? – Liss